寫在前面:
通過本文,可以學習到一般Post登錄及一般API請求發起的方法,如果讀者朋友還不熟悉Python基礎語法、如何創建Scrapy專案、Http協議基礎,請先移步熟悉,
背景:筆者希望通過Scrapy爬取內部管理系統的資料,進行二次分析等后續作業,
使用工具:Windows 10系統、Pycharm、Scrapy 2.1.0、Chrome
域名:www.example.com(此處用示例域名代替,避免敏感資訊泄露)
登錄入口頁面:http://www.example.com/login
分析爬取步驟:
Step1:使用Chrome瀏覽器按F12,打開開發者工具,訪問登錄頁面(該系統還算容易,沒有做隱藏的亂數登錄),這個頁面的URL,將成為Scrapy爬蟲程式的登錄url,即,下方示例代碼中的,login_url.
具體操作如下圖:

Step2:登錄后,進入想要爬取的頁面(滑鼠點擊頁面某處,例如按鈕或者某個下拉框),所謂想要爬取的頁面就是指這個頁面里有我們想要的資料,不管是在頁面顯示的資料還是隱藏在開發者工具Elements里瀏覽器決議后的html資料,這個頁面的URL,將成為Scrapy爬蟲程式的默認入口url(start_urls是Scrapy框架中的固定引數,其作用是:當爬蟲中發起的請求未指定url時,該請求會默認從入口url串列發起),即,下方示例代碼中的,start_urls.
Step3:找到想要的資料,確認API的請求格式,包括請求頭,回傳報文格式等資訊,這里仍然要用Chrome的開發者工具,下圖中3就是我們想要的資料,這個資料的訪問地址,將成為Scrapy爬蟲程式的要發出post請求的api,即,下方示例代碼中的,search_api.
(注意:Step2、Step3都在同一個頁面內)


示例代碼:
import scrapy
from scrapy import FormRequest
import json
def search(response):
print(response.text)
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['www.example.com']
start_urls = ["http://www.example.com/index.shtml#/example/example.shtml?id=151"]
login_url = 'http://www.example.com/login'
search_api = 'http://www.example.com/productReq/getReqListBySprint.shtml'
def parse(self, response):
print("登錄成功!")
formdata = {"smSprintId": "4517", "teamId": "4296"}
# 構造search_api的請求頭,并整理攜帶的body資訊為json,這一步很關鍵!!!
header = {"Content-Type": "application/json"}
yield scrapy.FormRequest(url=self.search_api, headers=header, body=json.dumps(formdata), callback=search)
def start_requests(self):
yield scrapy.Request(self.login_url, callback=self.login)
def login(self, response):
formdata = {"username": "myname", "password": "mypassword"}
yield FormRequest.from_response(response, formdata=formdata, callback=self.parse_login)
def parse_login(self, response):
if 'myname' in response.text:
# 如果一旦登錄成功后,就直接帶著登錄成功后Cookie值,訪問方法start_urls里面的地址
yield from super().start_requests()
代碼邏輯簡述:
Scrapy 啟動→呼叫Start_request方法→回呼login方法進行登錄→login方法中發起Post登錄請求,回呼parse_login方法→parse_login方法中用下方代碼(讓登錄成功的請求攜帶Cookie值,這是Scrapy框架的妙處,它幫我們把cookie的部分一起處理了,cookie對編程者無感,但我們要明白,是框架底層處理了請求頭的cookie,呼叫父類的默認Start_request方法,這時候框架將訪問start_urls,并呼叫我們重寫的parse方法,這一步很關鍵)
yield from super().start_requests()
→parse方法中,再構造search_api的請求頭,并整理攜帶的body資訊為json格式(這一步很關鍵)發起post請求,請求的URL是我們指定的search_api,發起請求后回呼search方法→search方法將列印出api介面的回傳值→結束
Pycharm 控制臺的運行結果如下(圖中敏感資訊已馬賽克處理):

接下來就是自由發揮時間,已經能收到回傳的資料后,可以進行獨立的二次分析,
以上,讀者有任何意見和建議,歡迎在評論區交流,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226179.html
標籤:其他
上一篇:Hbase單機模式環境搭建
