在做爬虫任务的时候,我们常常会遇到很多网页必须登录后,才可以开放某些页面。所以登录是爬取网页的第一步。但是,通过post表单(包含用户名和密码)的方法,对于那些不需要输入比较复杂的验证码的网页,可以使用正则表达式将验证码和验证码的ID匹配得出,然后实现自动化登录。但是,现在多部分的网页都是需要输入图片验证码的,所以必须得通过人工的识别图片然后输入验证码。当然,你也可以开发一个深度学习算法,将下载下来的验证码图片进行识别,然后转换为数字进行输入,但是这样就大大的提高了算法的成本,本来你只是要爬取一些简单的信息,却的开发一个实用的验证码识别算法,实属划不来。所以,我们可以通过使用cookie信息,完成自动化输入,而且每次访问网站的时候都不需要输入账号,密码和验证码等信息,相当于你在浏览器上勾选了记住我和自动登录的选项。下面就让我们开始学习如何使用cookie信息完成自动的登录,以爬取豆瓣网内容为例。
一.输入验证码登录
首先,我给出一个不使用cookie信息来登录的例子代码
import requests
import html5lib
import re
from bs4 import BeautifulSoup
s = requests.Session()
url_login = 'http://accounts.douban.com/login' #该网址通过跟踪登录信息可以查看到
#登录的表单
formdata = {
'redir':'https://www.douban.com',#登录后直接跳转的页面
'form_email': '2324973098.com', #账户邮箱名(这是我自己乱写的邮箱号码,使用时请换成你自己的邮箱号)
'form_password': '12345678!',#登录密码(这是我自己乱写的密码,使用时请换成你自己的密码)
'login': u'登陆'
}
#登录的头信息,为了模拟浏览器登录,属于固定形式
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
r = s.post(url_login, data = formdata, headers = headers)
content = r.text
soup = BeautifulSoup(content, 'html5lib')#使用HTML5进行解析网页
captcha = soup.find('img', id = 'captcha_image')#获取验证码图的链接
#判断是否需要验证码,需要则人工输入
if captcha:
captcha_url = captcha['src']
re_captcha_id = r'<input type="hidden" name="captcha-id" value="(.*?)"/'#找出验证码的ID,都可以通过跟踪登录过程知道
captcha_id = re.findall(re_captcha_id, content)
print(captcha_id)
print(captcha_url)
captcha_text = input('Please input the captcha:')#通过将输出的验证码图片网页链接复制到浏览器打开,然后观察验证码,然后输入登录
formdata['captcha-solution'] = captcha_text
formdata['captcha-id'] = captcha_id #加入验证码的信息后,从新构造表单,然后申请登录
r = s.post(url_login, data = formdata, headers = headers)
with open('contacts.txt', 'w+', encoding = 'utf-8') as f:
f.write(r.text)
二.使用cookie信息登录
步骤:
1.使用你的账号和密码登录豆瓣主页,并且在登录页勾选记住我的选项。
2.打开浏览器,并按F12键,调出开发者工具,找到network这一选项,选中all,如下图所示:
3.在该业中输入豆瓣主页https://www.douban.com/,然后便可以在下面的监视框内看到登录的信息,如下图:
4.找到最前面的一项,显示的是www.douban.com,单击后,点击header,如下图:
5.在header下面找到cookie信息便可,然后将cookie信息复制到代码中。如下图:
为了保护我的豆瓣的账户信息,所以这里cookie信息进行遮蔽,还望谅解。
代码如下:
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
cookies = {'cookie': 'bid=10gz8L7vrjI; __yadk_uid=QTSUUYvkbEDpprCxnGHo2vDkzhjkNgWB; ll="108288"; 608; ue="2314963088@qq.com"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.17557; __utmt=1; dbcl2="175570305:1c9NM2YiWlg";ue="2314963088@qq.com"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.17557; __utmt=1; dbcl2="175570305:1c9NM2YiWlg"; ck=Yiiv; _pk_id.100001.8cb4=3997ae079664ac75.1508600267.12.1521361971.1520843669.; __utmb=30149280.11.10.1521360343'}
r = requests.get(url, cookies = cookies, headers = headers)# print(r.text)
with open('douban_2.txt', 'wb+') as f:
f.write(r.content)
到这里为止,你就完成了使用cookie的所有步骤,以后想再次访问该网站则不在需要输入验证码等信息了。