欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy框架中实现登录人人网(二)(最新登录方式)

程序员文章站 2024-03-16 14:26:04
...

      上篇博客说到登录人人网的时候,如果同一个账号出错超过三次,那么将会出现四个汉字的验证码,这里我们利用打码平台来**验证码并传入(实际上,如果简单点可以通过肉眼观察出现的验证码,然后input输入结果。)如下图所示,通过上节的分析我们知道密码是通过加密传输的,但是我们从下图可以看到,如果出现验证码,那么icode字段是需要传递字符串的,也就是验证码,且传入的字符串并未加密,直接传送,而且f字段也需要传输一段字符串,经过测试,在一定的时间内,该字符串值是恒定的,所以该字段直接复制粘贴即可。其余的分析在上篇博客中已经做了详细介绍,不再表述。

scrapy框架中实现登录人人网(二)(最新登录方式)

    这是分析POST请求中的验证码传输方式,下面我们就需要知道怎么去获取这个验证码,在链接http://www.renren.com/SysHome.do的源代码中,我们可以找到验证码图片的url链接地址,于是我们可以直接将初始url放入parse(self,response)里面解析得到图片的链接,然后现在图片并保存,再利用超级鹰打码平台接口调入chaojiying.py模块,然后通过打码平台输出并传送验证码。部分代码如下:

scrapy框架中实现登录人人网(二)(最新登录方式)  

后面的解析就是与上篇博客类似,给出源代码:(注意需要把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)

 以上,介绍了最新登录人人网的两种方式,综合比较来看,上篇博客的方法比较简单,且不需要打码平台,第二种方法稳定性高,按照它以验证码的方式来处理,具有鲁棒性。

原创不易,如若转载,请注明作者和出处,谢谢!欢迎交流

上一篇: 打印机模拟(彩色篇)

下一篇: