scrapy登入介面的難點在於登入時候的驗證碼,我們通過使用scrapy.formrequest向目標**提交資料(表單提交),同時將驗證碼顯示在本地,手動輸入,進而登入。
驗證碼是類似於這種的,才可以通過此方式登入,如**是通過滑塊驗證登入的話,此方法就不再適用
因為要找到這種驗證碼登入的**一時之間沒找到,本想用學校教務系統的登入**進行測試,但是測試後發現驗證碼是動態載入的,故放棄,找了一會,就用提交教育漏洞的edusrc**作為練習登入爬蟲的站點
登入url是:
我們先登入一下,檢視需要post哪些資料
可以看到,這裡post表單裡面我們提交了username,password,captcha_1,captcha_0以及csrfmiddlewaretoken
username和password是我們的登入郵箱和密碼,captcha_1是輸入的驗證碼,captcha_0我猜測是每次登入的時候都會根據**演算法而更新的乙個值,csrfmiddlewaretoken也是乙個根據演算法更新的值,從名字可以看出是防止csrf攻擊而生成的令牌值,告訴**來到這個頁面的使用者的許可權。
而提交的資料中,captcha_0和csrfmiddlewaretoken都是直接從頁面中獲取的,我們先用xpath從頁面中獲取這兩個值
使用xpath語法對這兩個值進行提取:
formdata=其中username和password需要自己輸入,這個時候就只剩下captcha_1即驗證碼沒有獲取了captcha_0=response.xpath('//input[@name="captcha_0"]/@value').get()
formdata['captcha_0']=captcha_0
csrfmiddlewaretoken=response.xpath('//input[@name="csrfmiddlewaretoken"]/@value').get()
formdata['csrfmiddlewaretoken']=csrfmiddlewaretoken
檢視源** 之後可知:
驗證碼存在乙個url,這個url裡面的驗證碼每次重新整理之後都會改變,但是url也在不斷變化,使用xpath提取這個url,然後我們進一步進行處理
captcha_url = response.xpath('//img/@src').get()captcha_url = '' + captcha_url
print captcha_url
captcha = self.check_captcha(captcha_url)
check_captcha函式就是我們用來處理captcha_url即驗證碼url的
def check_captcha(self,image_url):獲取到的驗證碼會儲存在當前資料夾下,接著我們使用image開啟該同時show,看到驗證碼的我們關閉後輸入驗證碼字串並返回該字串
formdata['captcha_1'] = captcha將captcha_1加入到formdata之後,我們向login_url提交formdata,同時為了檢測我們是否成功登入,**函式是parse_after_loginyield scrapy.formrequest(url=self.login_url,formdata=formdata,callback=self.parse_after_login)
def parse_after_login(self,response):if response.url=="":
yield scrapy.formrequest(self.bug_url,callback=self.parse_bug)
print "login successful!"自己嘗試登入之後,可以知道登入了之後**會自動將我們302重定向到,所以我們只需要檢測response.url是否跟相同即可else:
print "login failed!"
我們登入了之後去bugurl即list/?page=1頁面第一頁提取bug_list資訊列印出來,證明可以做到登入之後的操作即可,因為為了避免資訊洩露,漏洞列表裡登入後和沒登入看到的漏洞資訊是不一樣的,側面可以反映我們是否登入成功
def parse_bug(self,response):現在主要的部分就寫好了,填入username和password執行試試print response.url
if response.url==self.bug_url:
print "join bug_list successful!"
bug_list=response.xpath('//td/a[contains(@href,"/post/")]/text()').getall()
for bug in bug_list:
print bug
else:
print "join bug_list failed!"
執行之後跳出驗證碼
輸入驗證碼之後輸出第一頁的漏洞列表:
可以看到跟登入之後的漏洞資訊顯示相同
如果沒登入的話,顯示的資訊是這樣的:
其實我感覺沒登入的時候看到的資訊要多一些:)
可以看出我們登入成功了。
這個**主要是識別驗證碼和post提交formdata資料比較重要
**放在github上面了:
scrapy爬蟲框架
作者經過幾周的python爬蟲實踐之後,深入學習了一下scrapy這個爬蟲框架,現將一些基本知識和 總結整理一下,以備後查。2.scrapy的命令列使用 這部分網上很多部落格都有總結,不需要背,理解會用主要的命令 startproject crawl fetch list genspider.即可,...
scrapy 爬蟲框架
1.安裝 公升級pip版本 pip install upgrade pip 通過pip安裝scrapy框架 pip install scrapy 安裝成功 只執行scrapy 進行測試是否安裝成功 2.scrapy startproject 爬蟲專案名稱 執行此命令,可以生成乙個爬蟲專案 會預先生成...
爬蟲安裝scrapy
scrapy框架結構清晰,基於twisted的非同步架構可以充分利用計算機資源,是爬蟲做大的必備基礎。本文將講解如何快速安裝此框架並使用起來。2.1 同安裝lxml庫 2.2 安裝twisted 開啟命令提示符視窗,輸入命令 twisted庫安裝成功後,安裝scrapy就簡單了,在命令提示符視窗直接...