因为最近在工作比较忙,在学习MYsql和Excel数据分析,所以到今天才更新,闲言少叙,进入今天的学习。
在前面的两个爬虫项目我们分别抓取了京东的口红图片和糗百的段子,这种爬虫比较低级,算是练练手,今天的抓取豆瓣个人主页则相对困难一些,然后今天的爬虫我们采用了requests库让大家学习。
下面我来总结一下抓取过程中的知识点和难点。
1、确定真实的登陆地址。
因为在豆瓣的登陆界面并不是真实的登陆地址,所以此时我们不能向服务器post参数模拟登陆,因此我们需要确定真实的登陆地址。
首先打开chorme浏览器,输入豆瓣网址,输入账号、密码和验证码,如图:
注意,此时千万要点击登陆。
接着,我们按下F12,选中Network,此时点击登陆,如图:
我们可以看到,第一个login选项即我们的真实登陆地址,将其地址复制出来。
2、post参数
上图我们可以看到From Data参数,即post表单,如下图:
参数有账号、密码和source,这三个时固定的,变化的只有captcha-solution与captcha-id。
3、captcha-id可以通过正则表达式提取,那么验证码如何提取呢?一种方法是找打码平台,这适合大型爬虫,不适合我们。再次我们选择提取出爬虫的链接,手动输入。
4、保存会话信息,此处我们用到了requests.session方法,代码中有注释。
源码及注释如下:
import requests
import http.cookiejar
import urllib
import re
url1 ='https://www.douban.com/accounts/login'#真实登陆页面
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}#头信息
data = requests.get(url1,headers=headers)#第一次请求,目的是匹配出对应的验证码和验证id
data=data.text#转换为字符串
patsl=re.compile('
').findall(data)#正则表达式匹配验证码地址
patid=re.compile('').findall(data)#正则表达式匹配验证id
print('验证码链接为:',patsl)
postdata={'source':'index_nav'}#post表单信息
postdata['captcha-id']=patid[0]
postdata['captcha-solution']=input('请输入验证码:')
postdata['form_email']=input('请输入账号:')
postdata['form_password']=input('请输入密码:')
session=requests.Session()#维持会话
#模拟登陆,传入post参数,并维持会话
data1=session.post(url1, data=postdata, headers=headers)
data1=data1.content
htmls=open('D:/python36/pachong/10.html','wb')
htmls.write(data1)
htmls.close()
#第二次登陆,此时处于登陆状态
url2='https://www.douban.com/people/189844988/'
data2=session.get(url2,headers=headers).content
htmls=open('D:/python36/pachong/11.html','wb')
htmls.write(data2)
htmls.close()
点击运行,我们可以看到如下:
我们将链接输入 浏览器,得到验证码,然后手动输入,然后输入账号与密码,如图:
此时,我们成功将豆瓣的首页和自己的个人主页抓取,效果如下:
模拟登陆并抓取豆瓣首页和个人主页后,就像进入了大海的入海口,豆瓣的海量资源随你抓取。