国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python爬蟲框架scrapy實現模擬登錄操作示例

2020-01-04 14:52:03
字體:
來源:轉載
供稿:網友

本文實例講述了python爬蟲框架scrapy實現模擬登錄操作。分享給大家供大家參考,具體如下:

一、背景:

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

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

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

1、這里不在敘述如何創建scrapy項目和spider,可以看前面的相關文章

二、快速登錄方法

我們在這里做了一個簡單的介紹,我們都知道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方法。

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

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

# -*- coding: utf-8 -*-import scrapyfrom scrapy import FormRequest,Requestclass 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里面跟用戶名和密碼一起提交。

復制代碼代碼如下:
return [FormRequest.from_response(response,formdata=formdata,callback=self.parse_login)]

 

登錄成功

python,爬蟲框架,scrapy,模擬登錄

三、傳統登錄方法:

1、首先要明確一件事情,一般情況下需要登錄的網站,不只需要登錄用戶和密碼,接下來我們聊聊上面說的傳統登錄模式。用戶在登錄的時候并不是只需要登錄賬戶信息,除了常見直觀的驗證碼和CSRF信息外,也有可能需要提交其它信息,我們必須把它們都提取到一起提交給服務器。

python,爬蟲框架,scrapy,模擬登錄

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

python,爬蟲框架,scrapy,模擬登錄

 

希望本文所述對大家Python程序設計有所幫助。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渭源县| 黑水县| 陆川县| 三台县| 巴青县| 乐陵市| 东海县| 乌什县| 凌海市| 巫溪县| 延长县| 绥江县| 浦北县| 沂源县| 唐山市| 迁西县| 龙山县| 新巴尔虎左旗| 吉隆县| 西和县| 玉田县| 阿荣旗| 乌拉特前旗| 新和县| 石泉县| 宜兰市| 运城市| 翼城县| 嫩江县| 青岛市| 鄂伦春自治旗| 界首市| 邢台市| 吉木萨尔县| 溆浦县| 文化| 定襄县| 怀宁县| 揭阳市| 普格县| 双流县|