导入需要的库
# -*- 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&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
登陆成功