数据采集(五):用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":'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,验证码图片链接

#正则提取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
登陆成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值