python爬蟲之scrapy模擬登陸

背景:python

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

 測試登陸地址:http://example.webscraping.com/places/default/user/loginjson

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

  一、這裏不在敘述如何建立scrapy項目和spider,能夠看我前面的博客服務器

  二、快速登陸方法。

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

    一、首先咱們改寫start_reqeusts方法,直接GET登陸頁面的HTML信息(有些人說你不是POST登陸麼,幹嗎還GET,彆着急,你得先GET到登陸頁面的登陸信息,才知道登陸的帳戶、密碼等怎麼提交,往哪裏提交)dom

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

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

    三、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':'liushuo@webscraping.com','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()

有的同窗可能問了,login方法裏面不是應該寫reture 麼,其實上面的寫法跟下面的這種寫法是同樣效果,若是再有個CSRF的話,也能夠直接在login裏面寫拿到CSRF信息,寫入到formdata裏面跟用戶名和密碼一塊兒提交。

1 return [FormRequest.from_response(response,formdata=formdata,callback=self.parse_login)]

 

登陸成功

 

  三、傳統登陸方法:

    一、首先要明確一件事情,通常狀況下須要登陸的網站,不僅須要登陸用戶和密碼,接下來咱們聊聊上面說的傳統登陸模式。用戶在登陸的時候並非只須要登陸帳戶信息,除了常見直觀的驗證碼和CSRF信息外,也有可能須要提交其它信息,咱們必須把它們都提取到一塊兒提交給服務器。

    

    二、咱們在form表單下面找到了一個display:none的div標籤,裏面的input標籤的value值正好是咱們要提交的數據,那咱們就提取到他。

    

相關文章
相關標籤/搜索