以知乎为例
# -*- coding:UTF-8 -*-__autor__ = 'zhouli'__date__ = '2018/11/2 21:40'# 模拟登陆import requestsheaders = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}html = requests.get('https://www.zhihu.com', headers=headers)print(html.text)
结果为:
很明显能够看得到这个是未登录状态的。
模拟登陆的实现方法
1,使用selenium登陆模拟
首先理一下流程:
① 初始化ChromeDriver
② 打开知乎登陆界面
③ 找到用户名和密码的输入框
④ 手动单击验证码
⑤ 按下enter键
# -*- coding:UTF-8 -*-__autor__ = 'zhouli'__date__ = '2018/11/2 21:40'# 模拟登陆from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timedrive = webdriver.Chrome()drive.get('https://www.zhihu.com/signup')drive.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[2]/span').click()name = drive.find_element_by_name('username')name.clear()name.send_keys('17621367901')pwd = drive.find_element_by_name('password')pwd.clear()pwd.send_keys('*****')name.send_keys(Keys.ENTER) # 模拟键盘的回车键input('输入验证码后回到这里按任意继续')drive.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button').click()time.sleep(10)print(drive.page_source)drive.quit()
但是使用selenium来登录实在是太慢了,如果一个网页处理需要十几秒的话,而且如果服务器使用PhantomJS作为WebDriver还会出现内存泄漏的情况,爬虫就会轻轻松松干爆服务器内存,因此不适合大规模爬虫开发。
2,使用cookies登录
为了不让用户每次都进行登陆操作,浏览器会在用户第一次登录成功之后就会放一段加密的信息在cookies中。下一次用户的访问,网站会检查cookies有没有这个加密信息,如果有并且合法的话,就可以跳过登录页面,直接进入登陆后的页面
通过已经登录的cookies,可以让爬虫绕过登录过程,直接进入登录以后的页面。
在已经登录知乎的情况下,打开Chrome,定位到network选项卡,刷新网页,在加载的内容中任意选择一项,查看右侧数据,从request headers中可以找到cookies,不是response headers。
只要把request headers的内容通过requests提交,就能够直接登录登录之后的页面了,
import requestsheaders = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36', 'accept-encoding': 'deflate, br', 'cookie': '_xsrf=vsOFdtc3Me0zrt7Md6BBbpt1M5lZRomC; _zap=cacb117d-afa3-4ec7-8f18-15f0a0c7148c; d_c0="AGAoGxo-dQ6PTpzLozGZd_Wg3U95hvGSCE8=|1541166185"; tst=r; q_c1=294aac80f4bd49b390b2df011fdf4fee|1541168123000|1541168123000; capsion_ticket="2|1:0|10:1541169361|14:capsion_ticket|44:MTUxYzY4ZjdkZDNkNGVkMGFiZmI4MzhkZjMzODVhOTk=|676622142717c3f7f31aa9b50e8341ddee2b80087fb52826ce417a9778247807"; z_c0="2|1:0|10:1541169370|4:z_c0|92:Mi4xOTkxekJnQUFBQUFBWUNnYkdqNTFEaVlBQUFCZ0FsVk4ycTdKWEFDY1NSak9wb3pXV3VwTkd4Ukx3UVNJNlRpcHNn|8c6776043bf64c2640d7db50a4290afc2a9152460042b0be512f2a948ac1572c"; tgw_l7_route=69f52e0ac392bb43ffb22fc18a173ee6'}session = requests.Session()source = session.get(url='https://www.zhihu.com/', headers=headers, verify=False)source.encoding='utf-8'print(source.text)
使用了requests的Session模块。网站会吧每一个会话的ID(Session ID)保存在浏览器的Cookies中标识用户的身份,requests的Session模块会自动的保存网页的一些回复信息,当然也可以通过requests.get()方式去访问,但是每一次调用requests.get()方法都回去创建一个新的ssession,对于浏览器而言就相当于每一次都是开了一个新的浏览器去访问,。如果直接使用session模块,那么每一次都会用这个session去访问,对于服务器而言,这样相当于在一个浏览器的窗口通过单击进入其他的页面,这个行为更像是人的行为,在官方文档中也建议,如果多次对同一个网站进行请求的话,应该使用session模块,会带来显著的性能提升。对于HTTPS的网站,在使用requests的时候需要带上verify=False这个参数,忽略掉网站证书的警告。
login_url = 'zzzzzzzzzzzzzzzzzzz'login_url_success = 'xxxxxx'data = { 'username': 'zhouli', 'password': 'zhouli', 'remember': 'YES',}session = requests.Session()session.post(login_url, data=data).text
在代码中实例化了一个session的对象,可以看做是新开了一个浏览器,然后data传参提交数据。