Scrapy模拟登录豆瓣网进阶篇



内容和上一篇大致差不多,重点说一下接入第三方验证码识别平台的问题。

验证码识别平台我使用的是 超级鹰 ,其是全球领先的智能图片分类及识别商家 ,具有安全、准确、高效、稳定、开放的特点,并且拥有强大的技术及校验团队。

超级鹰的开发文档: API地址

为了方便,这里将 Python 版本的代码贴在下面,以后还用的上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

class Chaojiying_Client(object):

def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}

def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()

def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()


if __name__ == '__main__':
chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()

只要把开发文档中对应的 soft_id 和 codetype 填上去,将验证码图片保存到本地,就可以使用超级鹰识别验证码了。话不多说,代码如下。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
class LoginSpider(scrapy.Spider):
name = 'login'
allowed_domains = ['douban.com']
start_urls = ['https://www.douban.com/people/xxxxxx/']
edit_signature_url = 'https://www.douban.com/j/people/xxxxxx/edit_signature'
headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}

def parse(self ,response):
if response.url == 'https://www.douban.com/people/xxxxxx/':
print('-----已经进入个人详情页-----')
print('-----正在修改个人签名-----')
ck = response.xpath("//*[@id='edit_signature']/form/div/input/@value").get()
data = {
'ck': ck,
'signature': '我可以自动识别验证码啦~~'
}
yield FormRequest(self.edit_signature_url, formdata=data)


# 模拟登录
login_url = 'https://accounts.douban.com/login'
def start_requests(self):
yield Request(self.login_url, callback=self.login)


def login(self, response):
print('-----登录程序-----')
captcha_id = response.xpath(".//input[@name='captcha-id']/@value").get()
captcha_url = response.xpath("//*[@id='captcha_image']/@src").get()
if captcha_url is None:
print('-----登录时无验证码-----')
data = {
'form_email': 'xxxxxx@qq.com',
'form_password': 'xxxxxx'
}
else:
print('-----登录时有验证码-----')
print('-----即将下载验证码-----')
request.urlretrieve(captcha_url, 'captcha.png',)

captcha_solution = self.recognize_captcha('captcha.png')
data = {
'form_email': 'xxxxxx@qq.com',
'form_password': 'xxxxxx',
'captcha-solution': captcha_solution,
'captcha-id': captcha_id,
'login': '登录'
}
print('-----登录中-----')
yield FormRequest.from_response(response, formdata=data, callback=self.parse_after_login)


def parse_after_login(self, response):
if "xxxxxx的帐号" in response.text:
yield from super().start_requests()


def recognize_captcha(self, im):
print('-----正在进行验证码识别-----')
username = 'xxxxxx'
password = 'xxxxxx'.encode('utf-8')
password = md5(password).hexdigest()
soft_id = '898320'
codetype = '1007'
base_params = {
'user': username,
'pass2': password,
'softid': soft_id,
'codetype': codetype
}
im = open(im, 'rb').read()
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
captcha = r.json()['pic_str']
print('-----验证码识别完毕-----')
print('验证码为:%s' % captcha)
return captcha
-------------本文结束感谢您的阅读-------------
0%