一、背景
很多时候,我们在爬取数据时,有些页面的数据需要登录才能看到,因此需要登录再爬取数据。实现login再爬取的手段很多,但核心都是通过cookie的方式来记录身份信息,因此模拟登录的核心在于对cookie的使用(获取、保存和使用)。
二、模拟登录方法
1、通过分析登录页面,获取登录接口和提交表单进行登录验证(可以用简单的Request库结合cookielib方式或者Scrapy等)
简单的Request库结合cookielib方式,请参考:Cookie登录爬取实战:Python 利用urllib库的cookie实现网站登录并抓取;
2、通过selenium进行浏览器模拟登录(简单直接有效)
然而,随着各知名网站反爬虫机制升级,登录接口变得越来越复杂复杂,加入动态js的方法,使用方式1,难度在增加。因此本文采用selenium方式来登录,同时通过session记录登录后的cookies,进一步对其他内的内容进行爬取。
Selenium介绍:
Selenium可以模拟真实的浏览器,具有浏览器所有的功能,可以很容易的加载js。加上在写Python爬虫的时候,最麻烦的不是那些海量的静态网站,而是那些通过JavaScript获取数据的站点,这是Selenium的优势就很明显了。
三、实现代码
环境:python3.6 + windows10 + Chrome
依赖库:selenium库 (初次使用先安装 pip3 install selenium)
驱动包:下载Chrome驱动包:http://chromedriver.storage.googleapis.com/index.html,根据你的chrome版本下载,并放在python安装根目录
思路:用selenium打开chrome,通过程序自动输入账号密码,有验证码则需手动填写下验证码。等到成功登陆之后使用“get_cookies()”函数来调出它的Cookies,同时继续访问登录后的其他页面。
from selenium import webdriver #导入selenium
def loginZhihu(self):
loginurl='https://www.douban.com/' # 登录页面
# 加载webdriver驱动,用于获取登录页面标签属性
driver=webdriver.Chrome()
driver.get(loginurl) # 请求登录页面
driver.find_element_by_name('form_email').clear() # 获取用户名输入框,并先清空
driver.find_element_by_name('form_email').send_keys(u'usernam') # 输入用户名
driver.find_element_by_name('form_password').clear() # 获取密码框,并清空
driver.find_element_by_name('form_password').send_keys(u'password') # 输入密码
captcha=driver.find_element_by_id('captcha_image') # 获取验证码标签
submit=driver.find_element_by_css_selector('input[class="bn-submit"]')#获取提交按钮
# 判断是否需要验证码
if captcha:
captcha_field=driver.find_element_by_id('captcha_field') #获取验证码输入框
text=input("请输入验证码:") # 控制栏输入验证码
captcha_field.send_keys(text) # 将输入的验证码传递给selenium打开的浏览器
submit.click() # 按钮提交并登录
else:
submit.click() # 无验证码则直接登录提交
cookies=driver.get_cookies() # 获取验证码
driver.get('https://movie.douban.com/') # 请求其他页面
return cookies #返回cookies 之后其他方法可以调用,这样不用每次请求都返回登录
扩展:通过这个方法,我们请求其他页面也是登录之后的状态,其实除了return cookies外,我们也可以先把cookies保存文本,然后在在后面请求中,我们在读出cookies去请求其他页面也是一样的。
# 添加微信:第一行Python代码,获取开发代码视频及其他资料,一起交流学习Python