数据采集(五):用requests模拟登陆豆瓣

来源:互联网 发布:travelling light知乎 编辑:程序博客网 时间:2024/06/17 13:47

导入需要的库

# -*- encoding:utf-8 -*- import urllib2  import urllib  import re  import cookielib  import requests  import cStringIOfrom PIL import Image

定义登录url 表单信息 HTTP头

在登录页面上输入你的豆瓣账号,点击登录。

这个过程会以post的方式提交一个表单。如果使用了chrome浏览器,找到开发者工具,点开network项,在login的headers下可以找到Request Headers以及FormData信息

loginUrl = 'https://www.douban.com/accounts/login'  formData={        "form_email":'xxxxxx@163.com',            #这里填写你的账号    "form_password":'xxxxx' ,        #这里填写你的密码    'source':'index_nav'}headers={      'Accept'    : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',       'Host' : 'www.douban.com',      'Referer' : 'https://www.douban.com/',      'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; rv:48.0)'  } 

获取session数据

session = requests.session()#发送post请求#session.post(loginUrl,data=formData,headers=headers) req = session.get('https://www.douban.com/',headers=headers, allow_redirects=False)

这样发起一次请求后,才会出现验证码图片以及验证码ID

模拟登陆

  • 针对验证码问题,通过正则表达式获取验证码url,并手动填入

通过正则式得到验证码图片ID,验证码图片链接

#正则提取IDpattern = re.compile('<img id="captcha_image".*?id=(.*?)&',re.S)     result = re.search(pattern,req.text)id = result.group(1)print id#正则提取验证码链接pattern = re.compile('<img id="captcha_image".*?src="(.*?) alt="captcha',re.S)     result = re.search(pattern,req.text)imageURL = result.group(1).strip()print imageURL
43A2KR2vYTY1XIpK1lehODxN:enhttps://www.douban.com/misc/captcha?id=43A2KR2vYTY1XIpK1lehODxN:en&amp;size=s"

打开图片,透过肉眼辨认单词验证码

#打开图像链接,输出图片request=urllib2.Request(imageURL,headers=headers)respHtml = urllib2.urlopen(request).read()img = Image.open(cStringIO.StringIO(respHtml))#img.show()import matplotlib.pyplot as pltimport numpy as np%matplotlib inlineplt.imshow(np.asarray(img))plt.axis('off')

这里写图片描述

验证码上的字母,验证码图片ID都是表单要求的信息,将其填入表单,再次发起post请求,便可成功登录。

print u'请输入你看到的字母'#人眼识别,填入验证码信息checkCode = raw_input()#表单中加入captcha-solutionformData["captcha-solution"]=checkCode#表单加入id信息formData["captcha-id"]=id#发送post请求session.post(loginUrl,data=formData,headers=headers) #站内的测试链接,用来判断是否登入成功url = "https://www.douban.com/people/90868630/"#用session访问code = session.get(url, headers=headers, allow_redirects=False)if code.status_code==200 :    print u'登陆成功'else:    print u'登录失败'
请输入你看到的字母electric登陆成功
原创粉丝点击