Python爬虫模拟登陆知乎
来源:互联网 发布:润网数据 编辑:程序博客网 时间:2024/06/05 17:34
在爬取一些网页的时候,往往有些网页的内容是需要登陆才可以获取的,这个时候我们就需要用到模拟登陆。
一开始搞模拟登陆的时候,我尝试过使用selenium的模拟点击,但是感觉那样太麻烦,一是每个网页都需要写特定的规则,而是耗时太长,效率太低。第三个就是验证码。
所以还是安安心心的用post请求吧
# coding=UTF-8import reimport requestsfrom bs4 import BeautifulSoupimport timeimport lxmlfrom PIL import Imageimport jsonimport timeimport cookielibfrom mycptcha import APIClient# import http.cookiejarclass Zhihu(object): # 初始化参数:请求头和session并加载cookie def __init__(self): self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', "Host": "www.zhihu.com", "Referer": "https://www.zhihu.com/", } self.session = requests.Session() self.session.cookies = cookielib.LWPCookieJar("cookie") try: self.session.cookies.load(ignore_discard=True) except IOError: print('Cookie未加载!') #获取网页中的xsrf,后续需作为请求数据发送 def get_xsrf(self): html = self.session.get('https://www.zhihu.com', headers=self.headers).text soup = BeautifulSoup(html, 'lxml') xsrf = soup.find('input').get('value') return xsrf #获取验证码图片并显示 def get_captcha(self): cli=APIClient() t = str(int(time.time() * 1000)) captcha_url = 'http://www.zhihu.com/captcha.gif?r=' + t + "&type=login" response=self.session.get(captcha_url,headers=self.headers) file=open('cptcha.gif','wb') with file as f: f.write(response.content) print '正在为您自动识别并输入验证码...' captcha=cli.result() return captcha #登陆方法,需传入用户名和密码 def login(self,username,password): #如果传入的为11位数字的话,则传入phone_num if re.match(r'\d{11}$',username): url = 'http://www.zhihu.com/login/phone_num' data={ '_xsrf': self.get_xsrf(), 'password': password, 'remember_me': 'true', 'phone_num': username } #否则传入email else: url = 'https://www.zhihu.com/login/email' data = {'_xsrf': self.get_xsrf(), 'password': password, 'remember_me': 'true', 'email': username } #发送post请求 response = self.session.post(url, data=data, headers=self.headers) #将源代码导入为json格式 result=json.loads(response.text) #如果返回状态为1,则登陆失败,需要传入验证码 if(result['r']==1): #传入captcha参数,数值为get_captcha方法的返回值 data['captcha']=self.get_captcha() #再次请求 response2=self.session.post(url, data=data, headers=self.headers) #输出登陆状态 print((json.loads(response2.text))['msg']) #保存cookies self.session.cookies.save(ignore_discard=True, ignore_expires=True) #测试是否已经登陆过 def is_login(self): #此网址为用户个人资料,如果之前没有登陆过,浏览器则会重定向到登陆网址 url = "https://www.zhihu.com/settings/profile" # 禁止重定向,否则登录失败重定向到首页也是响应200 login_code = self.session.get(url, headers=self.headers, allow_redirects=False) if login_code.status_code == 200: return True else: return False #返回登陆过的session对象 def get_session(self): return self.sessionif __name__=='__main__': zhihu=Zhihu() if zhihu.is_login(): print('已经登陆过的') session=zhihu.get_session() else: username=raw_input('请输入用户名:') password=raw_input('请输入密码:') zhihu.login(username,password) session=zhihu.get_session() url = "https://www.zhihu.com/settings/profile" info=session.get(url,headers=zhihu.headers) print(info.text)
阅读全文
0 0
- Python爬虫模拟登陆知乎
- Python 爬虫模拟登陆知乎
- Python爬虫之模拟登陆知乎
- Python爬虫模拟登陆知乎
- python爬虫 scrapy框架 知乎zhihu 模拟登陆
- python---模拟登陆知乎
- python 模拟知乎登陆
- Java 爬虫模拟知乎登陆
- python网络爬虫入门(二)———模拟登陆知乎
- 使用python完成知乎模拟登陆
- python模拟登陆知乎,得到cookie
- 模拟登陆知乎
- Python 模拟知乎登陆,保存登陆cookie
- python爬虫 模拟登陆
- Python 爬虫模拟登陆
- python 爬虫模拟登陆
- python 爬虫 知乎
- python爬虫知乎
- solr 局部更新
- 简易的C与CPP编译的makefile
- 欢迎使用CSDN-markdown编辑器
- Java大型互联网公司经典面试题,论JDK源码的重要性的无限思考
- easyui
- Python爬虫模拟登陆知乎
- MySQL/MariaDB SQL操作笔记
- 专三、mcg-helper一键生成jeecg框架单表功能模块
- MT6572的所有版本对语音解锁和语音控制功能的支持情况
- ZigBee---z-stack--低功耗实验--学习笔记
- Soap 协议 详解
- 解决应用服务器集群后的Session问题
- js判断搜索引擎代码,然后进行调整代码
- Oracle巡检脚本