26. Scrapy 框架-模擬登錄-Request、Response
Scrapy的Request和Response對(duì)象用于爬網(wǎng)網(wǎng)站。
通常,Request對(duì)象在爬蟲程序中生成并傳遞到系統(tǒng),直到它們到達(dá)下載程序,后者執(zhí)行請(qǐng)求并返回一個(gè)Response對(duì)象,該對(duì)象返回到發(fā)出請(qǐng)求的爬蟲程序。

2. Request對(duì)象

一個(gè)Request對(duì)象表示一個(gè)HTTP請(qǐng)求,它通常是在爬蟲生成,并由下載執(zhí)行,從而生成Response
參數(shù)
?request_with_cookies = Request(url="http://www.example.com",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cookies=[{'name': 'currency',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'value': 'USD',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'domain': 'example.com',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'path': '/currency'}])后一種形式允許定制 cookie的屬性domain和path屬性。這只有在保存Cookie用于以后的請(qǐng)求時(shí)才有用
使用dict:
url(string) - 此請(qǐng)求的網(wǎng)址
callback(callable) - 將使用此請(qǐng)求的響應(yīng)(一旦下載)作為其第一個(gè)參數(shù)調(diào)用的函數(shù)。有關(guān)更多信息,請(qǐng)參閱下面的將附加數(shù)據(jù)傳遞給回調(diào)函數(shù)。如果請(qǐng)求沒有指定回調(diào),parse()將使用spider的 方法。請(qǐng)注意,如果在處理期間引發(fā)異常,則會(huì)調(diào)用errback。
method(string) - 此請(qǐng)求的HTTP方法。默認(rèn)為'GET'??稍O(shè)置為"GET", "POST", "PUT"等,且保證字符串大寫
meta(dict) - 屬性的初始值Request.meta,在不同的請(qǐng)求之間傳遞數(shù)據(jù)使用
body(str或unicode) - 請(qǐng)求體。如果unicode傳遞了a,那么它被編碼為 str使用傳遞的編碼(默認(rèn)為utf-8)。如果 body沒有給出,則存儲(chǔ)一個(gè)空字符串。不管這個(gè)參數(shù)的類型,存儲(chǔ)的最終值將是一個(gè)str(不會(huì)是unicode或None)。
headers(dict) - 這個(gè)請(qǐng)求的頭。dict值可以是字符串(對(duì)于單值標(biāo)頭)或列表(對(duì)于多值標(biāo)頭)。如果 None作為值傳遞,則不會(huì)發(fā)送HTTP頭.一般不需要
encoding: 使用默認(rèn)的 'utf-8' 就行。
cookie(dict或list) - 請(qǐng)求cookie。這些可以以兩種形式發(fā)送。
request_with_cookies = Request(url="http://www.sxt.cn/index/login/login.html",)
使用列表:

將附加數(shù)據(jù)傳遞給回調(diào)函數(shù)
請(qǐng)求的回調(diào)是當(dāng)下載該請(qǐng)求的響應(yīng)時(shí)將被調(diào)用的函數(shù)。將使用下載的Response對(duì)象作為其第一個(gè)參數(shù)來調(diào)用回調(diào)函數(shù)

3 請(qǐng)求子類 FormRequest對(duì)象
FormRequest類擴(kuò)展了Request具有處理HTML表單的功能的基礎(chǔ)。它使用lxml.html表單 從Response對(duì)象的表單數(shù)據(jù)預(yù)填充表單字段
class scrapy.http.FormRequest(url[, formdata, ...])
本FormRequest類增加了新的構(gòu)造函數(shù)的參數(shù)。其余的參數(shù)與Request類相同,這里沒有記錄
參數(shù):formdata(元組的dict或iterable) - 是一個(gè)包含HTML Form數(shù)據(jù)的字典(或(key,value)元組的迭代),它將被url編碼并分配給請(qǐng)求的主體。
該FormRequest對(duì)象支持除標(biāo)準(zhǔn)以下類方法Request的方法:
classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, ...])
返回一個(gè)新FormRequest對(duì)象,其中的表單字段值已預(yù)先<form>
填充在給定響應(yīng)中包含的HTML 元素中.
參數(shù):
response(Responseobject) - 包含將用于預(yù)填充表單字段的HTML表單的響應(yīng)
formname(string) - 如果給定,將使用name屬性設(shè)置為此值的形式
formid(string) - 如果給定,將使用id屬性設(shè)置為此值的形式
formxpath(string) - 如果給定,將使用匹配xpath的第一個(gè)表單
formcss(string) - 如果給定,將使用匹配css選擇器的第一個(gè)形式
formnumber(integer) - 當(dāng)響應(yīng)包含多個(gè)表單時(shí)要使用的表單的數(shù)量。第一個(gè)(也是默認(rèn))是0
formdata(dict) - 要在表單數(shù)據(jù)中覆蓋的字段。如果響應(yīng)元素中已存在字段,則其值將被在此參數(shù)中傳遞的值覆蓋
clickdata(dict) - 查找控件被點(diǎn)擊的屬性。如果沒有提供,表單數(shù)據(jù)將被提交,模擬第一個(gè)可點(diǎn)擊元素的點(diǎn)擊。除了html屬性,控件可以通過其相對(duì)于表單中其他提交表輸入的基于零的索引,通過nr屬性來標(biāo)識(shí)
dont_click(boolean) - 如果為True,表單數(shù)據(jù)將在不點(diǎn)擊任何元素的情況下提交
3.1 請(qǐng)求使用示例
使用FormRequest通過HTTP POST發(fā)送數(shù)據(jù)
如果你想在你的爬蟲中模擬HTML表單POST并發(fā)送幾個(gè)鍵值字段,你可以返回一個(gè)FormRequest對(duì)象(從你的爬蟲)像這樣:
return [FormRequest(url="http://www.example.com/post/action",
? ? ? ? ? ? ? ? ? ?formdata={'name': 'John Doe', 'age': '27'},
? ? ? ? ? ? ? ? ? ?callback=self.after_post)]
使用FormRequest.from_response()來模擬用戶登錄
網(wǎng)站通常通過元素(例如會(huì)話相關(guān)數(shù)據(jù)或認(rèn)證令牌(用于登錄頁面))提供預(yù)填充的表單字段。進(jìn)行剪貼時(shí),您需要自動(dòng)預(yù)填充這些字段,并且只覆蓋其中的一些,例如用戶名和密碼。您可以使用 此作業(yè)的方法。這里有一個(gè)使用它的爬蟲示例:

4 響應(yīng)對(duì)象
class scrapy.http.Response(url[, status=200, headers=None, body=b'', flags=None, request=None])
一個(gè)Response對(duì)象表示的HTTP響應(yīng),這通常是下載(由下載),并供給到爬蟲進(jìn)行處理
參數(shù):
url(string) - 此響應(yīng)的URL
status(integer) - 響應(yīng)的HTTP狀態(tài)。默認(rèn)為200
headers(dict) - 這個(gè)響應(yīng)的頭。dict值可以是字符串(對(duì)于單值標(biāo)頭)或列表(對(duì)于多值標(biāo)頭)
body(str) - 響應(yīng)體。它必須是str,而不是unicode,除非你使用一個(gè)編碼感知響應(yīng)子類,如 TextResponse
flags(list) - 是一個(gè)包含屬性初始值的 Response.flags列表。如果給定,列表將被淺復(fù)制
request(Requestobject) - 屬性的初始值Response.request。這代表Request生成此響應(yīng)
5 模擬登錄
用的函數(shù):
start_requests()可以返回一個(gè)請(qǐng)求給爬蟲的起始網(wǎng)站,這個(gè)返回的請(qǐng)求相當(dāng)于start_urls,start_requests()返回的請(qǐng)求會(huì)替代start_urls里的請(qǐng)求
Request()get請(qǐng)求,可以設(shè)置,url、cookie、回調(diào)函數(shù)
FormRequest.from_response()表單post提交,第一個(gè)必須參數(shù),上一次響應(yīng)cookie的response對(duì)象,其他參數(shù),cookie、url、表單內(nèi)容等
yield Request()可以將一個(gè)新的請(qǐng)求返回給爬蟲執(zhí)行
在發(fā)送請(qǐng)求時(shí)cookie的操作,
meta={'cookiejar':1}表示開啟cookie記錄,首次請(qǐng)求時(shí)寫在Request()里
meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response的cookie,寫在FormRequest.from_response()里post授權(quán)
meta={'cookiejar':True}表示使用授權(quán)后的cookie訪問需要登錄查看的頁面
獲取Scrapy框架Cookies
樣例代碼
start_requests()
方法,可以返回一個(gè)請(qǐng)求給爬蟲的起始網(wǎng)站,這個(gè)返回的請(qǐng)求相當(dāng)于start_urls,start_requests()返回的請(qǐng)求會(huì)替代start_urls里的請(qǐng)求
在發(fā)送請(qǐng)求時(shí)cookie的操作
meta={'cookiejar':1}
表示開啟cookie記錄,首次請(qǐng)求時(shí)寫在Request()里
meta={'cookiejar':response.meta['cookiejar']}
表示使用上一次response的cookie,寫在Request里post授權(quán)
