1. 程式人生 > >scrapy框架中實現登入人人網(二)(最新登入方式)

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)

 以上,介紹了最新登入人人網的兩種方式,綜合比較來看,上篇部落格的方法比較簡單,且不需要打碼平臺,第二種方法穩定性高,按照它以驗證碼的方式來處理,具有魯棒性。

原創不易,如若轉載,請註明作者和出處,謝謝!歡迎交流