python爬蟲框架scrapy實現(xiàn)模擬登錄操作示例
本文實例講述了python爬蟲框架scrapy實現(xiàn)模擬登錄操作。分享給大家供大家參考,具體如下:
一、背景:
初來乍到的pythoner,剛開始的時候覺得所有的網(wǎng)站無非就是分析HTML、json數(shù)據(jù),但是忽略了很多的一個問題,有很多的網(wǎng)站為了反爬蟲,除了需要高可用代理IP地址池外,還需要登錄。例如知乎,很多信息都是需要登錄以后才能爬取,但是頻繁登錄后就會出現(xiàn)驗證碼(有些網(wǎng)站直接就讓你輸入驗證碼),這就坑了,畢竟運維同學很辛苦,該反的還得反,那我們怎么辦呢?這不說驗證碼的事兒,你可以自己手動輸入驗證,或者直接用云打碼平臺,這里我們介紹一個scrapy的登錄用法。
測試登錄地址:http://example.webscraping.com/places/default/user/login
測試主頁:http://example.webscraping.com/user/profile
1、這里不在敘述如何創(chuàng)建scrapy項目和spider,可以看前面的相關文章
二、快速登錄方法
我們在這里做了一個簡單的介紹,我們都知道scrapy的基本請求流程是start_request方法遍歷start_urls列表,然后make_requests_from_url
方法,里面執(zhí)行Request方法,請求start_urls里面的地址,但是這里我們用的不再是GET方法,而用的是POST方法,也就常說的登錄。
1、首先我們改寫start_reqeusts
方法,直接GET登錄頁面的HTML信息(有些人說你不是POST登錄么,干嘛還GET,別著急,你得先GET到登錄頁面的登錄信息,才知道登錄的賬戶、密碼等怎么提交,往哪里提交)
2、start_request
方法GET到數(shù)據(jù)后,用callback參數(shù),執(zhí)行拿到response后要接下來執(zhí)行哪個方法,然后在login方法里面寫入登錄用戶名和密碼(還是老樣子,一定要用dict),然后只用Request子類scrapy.FormRequest
這個方法提交數(shù)據(jù),這我一個的是FormRequest.from_response
方法。
有些人會問,這個from__response
的基本使用是條用是需要傳入一個response對象作為第一個參數(shù),這個方法會從頁面中form表單中,幫助用戶創(chuàng)建FormRequest對象,最最最最重要的是它會幫你把隱藏的input標簽中的信息自動跳入表達,使用這個中方法,我們直接寫用戶名和密碼即可,我們在最后面再介紹傳統(tǒng)方法。
3、parse_login
方法是提交完表單后callback
回調(diào)函數(shù)指定要執(zhí)行的方法,為了驗證是否成功。這里我們直接在response中搜索Welcome Liu這個字眼就證明登錄成功。這個好理解,重點是yield from super().start_resquests()
,這個代表著如果一旦登錄成功后,就直接帶著登錄成功后Cookie值,方法start_urls
里面的地址。這樣的話登錄成功后的response可以直接在parse里面寫。
# -*- coding: utf-8 -*- import scrapy from scrapy import FormRequest,Request class ExampleLoginSpider(scrapy.Spider): name = "login_" allowed_domains = ["example.webscraping.com"] start_urls = ['http://example.webscraping.com/user/profile'] login_url = 'http://example.webscraping.com/places/default/user/login' def parse(self, response): print(response.text) def start_requests(self): yield scrapy.Request(self.login_url,callback=self.login) def login(self,response): formdata = { 'email':'liushuo@webscraping.com','password':'12345678'} yield FormRequest.from_response(response,formdata=formdata, callback=self.parse_login) def parse_login(self,response): # print('>>>>>>>>'+response.text) if 'Welcome Liu' in response.text: yield from super().start_requests()
有的同學可能問了,login方法里面不是應該寫reture 么,其實上面的寫法跟下面的這種寫法是一樣效果,如果再有個CSRF的話,也可以直接在login里面寫拿到CSRF信息,寫入到formdata里面跟用戶名和密碼一起提交。
登錄成功
三、傳統(tǒng)登錄方法:
1、首先要明確一件事情,一般情況下需要登錄的網(wǎng)站,不只需要登錄用戶和密碼,接下來我們聊聊上面說的傳統(tǒng)登錄模式。用戶在登錄的時候并不是只需要登錄賬戶信息,除了常見直觀的驗證碼和CSRF信息外,也有可能需要提交其它信息,我們必須把它們都提取到一起提交給服務器。
2、我們在form表單下面找到了一個display:none
的div標簽,里面的input標簽的value值正好是我們要提交的數(shù)據(jù),那我們就提取到他。
更多關于Python相關內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python正則表達式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
基于python實現(xiàn)分析識別文章/內(nèi)容中的高頻詞和關鍵詞
要分析一篇文章的高頻詞和關鍵詞,可以使用 Python 中的 nltk 庫和 collections 庫或者jieba庫來實現(xiàn),本篇文章介紹基于兩種庫分別實現(xiàn)分析內(nèi)容中的高頻詞和關鍵詞,需要的朋友可以參考下2023-09-09Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決
這篇文章主要介紹了Pytorch GPU內(nèi)存占用很高,但是利用率很低的原因及解決方法,具有很好的參考價值,希望對大家 有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06python網(wǎng)絡爬蟲實現(xiàn)發(fā)送短信驗證碼的方法
這篇文章主要介紹了python網(wǎng)絡爬蟲實現(xiàn)發(fā)送短信驗證碼的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02Python面向?qū)ο蟪绦蛟O計之繼承、多態(tài)原理與用法詳解
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O計之繼承、多態(tài),結(jié)合實例形式分析了Python面向?qū)ο蟪绦蛟O計中繼承、多態(tài)的相關概念、原理、用法及操作注意事項,需要的朋友可以參考下2020-03-03