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

导入需要的库

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

定义登录url 表单信息 HTTP头

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

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

loginUrl = 'https://www.douban.com/accounts/login'  

formData={    
    "form_email":'[email protected]',            #这里填写你的账号
    "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,验证码图片链接

#正则提取ID
pattern = 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:en
https://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 plt
import numpy as np

%matplotlib inline
plt.imshow(np.asarray(img))
plt.axis('off')

这里写图片描述

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

print u'请输入你看到的字母'
#人眼识别,填入验证码信息
checkCode = raw_input()
#表单中加入captcha-solution
formData["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
登陆成功

猜你喜欢

转载自blog.csdn.net/czl389/article/details/75545729