1. 程式人生 > >python爬蟲之scrapy模擬登錄

python爬蟲之scrapy模擬登錄

這不 eight 搜索 頁面 response dom cookie值 知乎 blog

背景:

  初來乍到的pythoner,剛開始的時候覺得所有的網站無非就是分析HTML、json數據,但是忽略了很多的一個問題,有很多的網站為了反爬蟲,除了需要高可用代理IP地址池外,還需要登錄。例如知乎,很多信息都是需要登錄以後才能爬取,但是頻繁登錄後就會出現驗證碼(有些網站直接就讓你輸入驗證碼),這就坑了,畢竟運維同學很辛苦,該反的還得反,那我們怎麽辦呢?這不說驗證碼的事兒,你可以自己手動輸入驗證,或者直接用雲打碼平臺,這裏我們介紹一個scrapy的登錄用法。

測試登錄地址:http://example.webscraping.com/places/default/user/login

測試主頁:http://example.webscraping.com/user/profile

  1、這裏不在敘述如何創建scrapy項目和spider,可以看我前面的博客

  2、快速登錄方法。

  我們在這裏做了一個簡單的介紹,我們都知道scrapy的基本請求流程是start_request方法遍歷start_urls列表,然後make_requests_from_url方法,裏面執行Request方法,請求start_urls裏面的地址,但是這裏我們用的不再是GET方法,而用的是POST方法,也就常說的登錄。

    1、首先我們改寫start_reqeusts方法,直接GET登錄頁面的HTML信息(有些人說你不是POST登錄麽,幹嘛還GET,別著急,你得先GET到登錄頁面的登錄信息,才知道登錄的賬戶、密碼等怎麽提交,往哪裏提交)

    2、start_request方法GET到數據後,用callback參數,執行拿到response後要接下來執行哪個方法,然後在login方法裏面寫入登錄用戶名和密碼(還是老樣子,一定要用dict),然後只用Request子類scrapy.FormRequest這個方法提交數據,這我一個的是FormRequest.from_response方m_法。

  有些人會問,這個from__response的基本使用是條用是需要傳入一個response對象作為第一個參數,這個方法會從頁面中form表單中,幫助用戶創建FormRequest對象,最最最最重要的是它會幫你把隱藏的input標簽中的信息自動跳入表達,使用這個中方法,我們直接寫用戶名和密碼即可,我們在最後面再介紹傳統方法。

    3、parse_login方法是提交完表單後callback回調函數指定要執行的方法,為了驗證是否成功。這裏我們直接在response中搜索Welcome Liu這個字眼就證明登錄成功。這個好理解,重點是yield from super().start_resquests(),這個代表著如果一旦登錄成功後,就直接帶著登錄成功後Cookie值,方法start_urls裏面的地址。這樣的話登錄成功後的response可以直接在parse裏面寫。

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from scrapy import FormRequest,Request
 4 
 5 
 6 class ExampleLoginSpider(scrapy.Spider):
 7     name = "login_"
 8     allowed_domains = ["example.webscraping.com"]
 9     start_urls = [http://example.webscraping.com/user/profile]
10     login_url = http://example.webscraping.com/places/default/user/login
11 
12     def parse(self, response):
13         print(response.text)
14 
15     def start_requests(self):
16         yield scrapy.Request(self.login_url,callback=self.login)
17 
18     def login(self,response):
19         formdata = {
20             email:[email protected],password:12345678}
21         yield FormRequest.from_response(response,formdata=formdata,
22                                         callback=self.parse_login)
23     def parse_login(self,response):
24         # print(‘>>>>>>>>‘+response.text)
25         if Welcome Liu in response.text:
26             yield from super().start_requests()

登錄成功

技術分享圖片

python爬蟲之scrapy模擬登錄