scrapy框架中实现登录人人网(二)(最新登录方式)
上篇博客说到登录人人网的时候,如果同一个账号出错超过三次,那么将会出现四个汉字的验证码,这里我们利用打码平台来**验证码并传入(实际上,如果简单点可以通过肉眼观察出现的验证码,然后input输入结果。)如下图所示,通过上节的分析我们知道密码是通过加密传输的,但是我们从下图可以看到,如果出现验证码,那么icode字段是需要传递字符串的,也就是验证码,且传入的字符串并未加密,直接传送,而且f字段也需要传输一段字符串,经过测试,在一定的时间内,该字符串值是恒定的,所以该字段直接复制粘贴即可。其余的分析在上篇博客中已经做了详细介绍,不再表述。
这是分析POST请求中的验证码传输方式,下面我们就需要知道怎么去获取这个验证码,在链接http://www.renren.com/SysHome.do的源代码中,我们可以找到验证码图片的url链接地址,于是我们可以直接将初始url放入parse(self,response)里面解析得到图片的链接,然后现在图片并保存,再利用超级鹰打码平台接口调入chaojiying.py模块,然后通过打码平台输出并传送验证码。部分代码如下:
后面的解析就是与上篇博客类似,给出源代码:(注意需要把chaojiying.py这个文件放在建立的scrapy项目文件内,也就是一开始是scrapy startproject [项目]这个项目文件夹下,我的在renren_login下面,否则会报错:没有module是chaojiying)
###在spider文件夹中renren.py中写入下面代码
# -*- coding: utf-8 -*-
import scrapy
import time ,requests
from chaojiying import Chaojiying_Client
class RenrenSpider(scrapy.Spider):
name = "renren"
allowed_domains = ["renren.com"]
start_urls = ['http://renren.com/']
url='http://www.renren.com/'
base_url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp='
s=time.strftime("%S")
ms=int(round(time.time()%(int(time.time())),3)*1000)
date_time='20188010'+s+str(ms)
login_url=base_url+date_time
def parse(self,response):
img_url=response.css('img#verifyPic_login::attr("src")').get()
with open(r'E:\renren_login\renren_login\源代码.html','w') as f:
f.write(response.text)
self.download_img(img_url)
result=self.pojie()
yield scrapy.Request(url=self.url,callback=self.parse_login,meta={'result':result},dont_filter=True)
def download_img(self,img_url):
byte=requests.get(img_url)
with open (r'E:\renren_login\renren_login\yanzhengma.jpg','wb') as f:
f.write(byte.content)
def pojie(self):
chaojiying = Chaojiying_Client('fangwei1014', 'fangwei1314520', '96001')
im = open(r'E:\renren_login\renren_login\yanzhengma.jpg', 'rb').read()
print('*'*20)
#print(chaojiying.PostPic(im, 2004)['pic_str'])
return chaojiying.PostPic(im, 2004)['pic_str']
def parse_login(self,response):
data={ 'email': '18851989132',
'origURL':' http://www.renren.com/home',
'domain':'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password':'77b9d745c033ebcb20c041e1c81e5846a1dabda5295a41d55c2c8077ac0bc685',
'rkey':'ac9e72c02e87ddb2d364071e5ef990f4',
'f':'http%3A%2F%2Fwww.so.com%2Flink%3Furl%3Dhttp%253A%252F%252Fwww.renren.com%252F%26q%3D%25E4%25BA%25BA%25E4%25BA%25BA%25E7%25BD%2591%26ts%3D1535870505%26t%3Dc0e9f62f9b1d00cee8a4611894f817e',
}
data['icode']=response.meta['result']
yield scrapy.FormRequest(url=self.login_url,formdata=data,callback=self.parse_after)
def parse_after(self,response):
yield scrapy.Request(url='http://www.renren.com/880151247/profile',callback=self.parse_profile)
def parse_profile(self,response):
with open(r'E:\renren_login\renren_login\大鹏主页.html','w',encoding='utf-8') as f:
f.write(response.text)
以上,介绍了最新登录人人网的两种方式,综合比较来看,上篇博客的方法比较简单,且不需要打码平台,第二种方法稳定性高,按照它以验证码的方式来处理,具有鲁棒性。
原创不易,如若转载,请注明作者和出处,谢谢!欢迎交流
上一篇: 打印机模拟(彩色篇)