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

scrapy框架中實現登入人人網(一)(最新登入方式)

        最近在弄scrapy框架的問題,感覺裡面好玩的東西有很多,無意中在bilibili中看到關於在scrapy實現登入人人網的視訊,人人網可能使用者少,所以在現在的一些部落格和教程裡面看到最新的登入方法幾乎沒有,於是自己寫了這篇部落格。

        進入正題,我們主要來說先下scrapy框架中的Request和Response物件,這兩個物件貫穿scrapy框架。

Request請求網頁物件,這個類需要傳遞一些引數,其中比較常用的引數如下所示:

url:request物件傳送請求的連結。

callback:回撥函式,即下載器下載完成後執行的回撥函式。

method:請求方法,預設是get,如果是POST一般不用這個方法,使用FormRequest物件。

headers:請求頭,對於一些固定的設定,放在setting.py中指定即可,對於非固定的,可以在傳送請求時設定。

meta:可用於不同請求之間傳送資料。

encoding:編碼,預設utf-8。

dont_filter:表示不由排程器過濾,在執行多次請求的時候用的比較多。

errback:一般在出現錯誤的時候執行的函式。

Response物件一般是scrapy 自動構建,因此開發者不需要關心如何建立Response物件,Response主要屬性如下:

url:Response的 url,一般與Request物件的url相同。

encoding:返回當前字串編碼和解碼的格式。

body:將返回的資料作為bytes字串返回。

xpath:利用XPath選擇器提取資料。

css:利用CSS選擇器提取資料。

text:Response解析的文字資料。

       特別地,有時候我們需要在請求資料時候傳送POST請求,我們可以利用Requuest子類FormRequest來實現,如果想要在爬蟲一開始就傳送POST請求,那麼需要在爬蟲類中重新start_requets()方法,且不再呼叫start_urls裡面的url

(也就是說不呼叫parse()方法)。

       下面我們來分析人人網的登入介面,還是與上節登入豆瓣類似,開啟登入頁面,按F12調出開發者模式,勾選Persever log 在登入一欄輸入正確的賬號和密碼,在XHR看到一個POST請求,如下圖所示:

        下面我們分析POST請求裡面的formdata,如下圖所示,通過我們多次試驗,得到一個結論:即如果你輸入的密碼始終是同樣的密碼,那麼它的動態加密的password在一定的時間內不會改變,所以我們在輸入欄輸入正確的密碼的時候講password裡面的加密密碼拿出來複製到程式碼中即可。這裡面還有一些別的值一般不會改變,寫程式碼直接複製貼上。

這個POST請求的引數得到很好的解決,後面我們又遇到了一個問題,那就是傳送POST請求的連結有時間戳問題,所以我們又要分析它的時間戳。例如http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2018801547691後面的2018801547691這一串數字所代表的的是什麼意義,其實2018代表年,8表示時,01表示日,後面的54表示秒,691表示毫秒,這樣分析之後,我們可以利用time庫中一些方法來實現構造時間戳。

分析到這裡,傳送POST請求分析結束,然後,我們為了檢測是否正確登入,我們打印出大鵬的主頁,看是否能夠正確儲存(大鵬主頁:http://www.renren.com/880151247/profile),(在人人網中,訪問他人主頁需要登入。)這裡面主要涉及到Request和Response物件的呼叫問題。

下面簡單說說scrapy框架使用

首先開啟命令列視窗,進入E盤(我的專案放在這裡面),然後利用scrpay startpoject renrnewang 命令列建立專案,繼續輸入命令列cd renrenwang進入renrenwang資料夾,建立爬蟲類scrapy genspider renren  renren.com,建立完成後,renrenwang資料夾中檔案如下:

下圖是注意的一些細節問題以及表單的傳輸。 

在renren.py和setting.py中寫上如下圖原始碼,在命令列輸入scrapy crawl renren  

在spider模組的renren.py裡面
import scrapy
import time 

class RenrenSpider(scrapy.Spider):
    name = "renren"
    #allowed_domains = ["'renren.com'"]
    start_urls = ['http://www.renren.com/']
    url='http://www.renren.com/'
   
    def start_requests(self):
        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'+str(s)+str(ms)
        login_url=base_url+date_time
        data={'email':'(賬號)',
             'icode':'',
             'origURL':'http://www.renren.com/home',
             'domain':'renren.com',
             'key_id':'1',####注意這裡面一定是字元型1,整型1會報錯。如果使用
###request.session()應該沒有這個問題
             'captcha_type':'web_login',
             'password':'(複製即可)',
             'rkey':'fee3c0249fcf32f072eb0a4ccd82fa98',
             'f':'https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DLwaiZlZgTeev7o9XOVRn3fvV4cWe7mW2wCUyYq73YZK%26wd%3D%26eqid%3D986b249200000e32000000035b8b47ec',
             }
        yield scrapy.FormRequest(url=login_url,formdata=data,callback=self.parse_login,dont_filter=True)
    def parse_login(self,response):
        yield scrapy.Request(url='http://www.renren.com/880151247/profile',callback=self.parse_text,dont_filter=True)
    def parse_text(self,response):
        with open(r'E:\renrenwang\renrenwang\大鵬.html','w',encoding='utf-8') as f:
            f.write(response.text)
                
        
        

#在setting.py裡面
# -*- coding: utf-8 -*-

# Scrapy settings for renrenwang project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'renrenwang'

SPIDER_MODULES = ['renrenwang.spiders']
NEWSPIDER_MODULE = 'renrenwang.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'renrenwang (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY =False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
   ' User-Agent':'Mozilla/5.0 '
}

最後我們開啟大鵬.html檔案,我們可以看到大鵬的主頁,這樣說明我們登陸成功。(如果點選一開始看到大鵬主頁,然後立即退出需要登入,那不是程式登入失敗,而是你的遊覽器沒有登入,沒有許可權開啟他人主頁,將瀏覽器登入即可。)

其實,人人網如果同一個賬號登入錯誤超過三次就會出現四個字的中文驗證碼,於是我們這種方法穩定性不高,在下一篇部落格將會說到驗證碼破解問題,還是利用打碼平臺來破解驗證碼,然後將資料傳輸到POST請求中。 (目前我使用兩種方法均可,不輸入驗證碼利用上面的也能提交POST請求通過,可能人人網登陸本身設計有點欠缺。)

原創不易,如若轉載,請註明作者和出處,謝謝。如有問題,歡迎留言交流