request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
1. Scrapy-Request和Response(請求和響應)
Scrapy的Request和Response對象用于爬網網站。
通常,Request對象在爬蟲程序中生成并傳遞到系統,直到它們到達下載程序,后者執行請求并返回一個Response對象,該對象返回到發出請求的爬蟲程序。
2. Request對象
一個Request對象表示一個HTTP請求,它通常是在爬蟲生成,并由下載執行,從而生成Response
- 參數
request_with_cookies = Request(url="http://www.example.com",
cookies=[{'name': 'currency',
'value': 'USD',
'domain': 'example.com',
'path': '/currency'}])
后一種形式允許定制 cookie的屬性domain和path屬性。這只有在保存Cookie用于以后的請求時才有用- 使用dict:
- url(string) - 此請求的網址
- callback(callable) - 將使用此請求的響應(一旦下載)作為其第一個參數調用的函數。有關更多信息,請參閱下面的將附加數據傳遞給回調函數。如果請求沒有指定回調,parse()將使用spider的 方法。請注意,如果在處理期間引發異常,則會調用errback。
- method(string) - 此請求的HTTP方法。默認為'GET'。可設置為"GET", "POST", "PUT"等,且保證字符串大寫
- meta(dict) - 屬性的初始值Request.meta,在不同的請求之間傳遞數據使用
- body(str或unicode) - 請求體。如果unicode傳遞了a,那么它被編碼為 str使用傳遞的編碼(默認為utf-8)。如果 body沒有給出,則存儲一個空字符串。不管這個參數的類型,存儲的最終值將是一個str(不會是unicode或None)。
- headers(dict) - 這個請求的頭。dict值可以是字符串(對于單值標頭)或列表(對于多值標頭)。如果 None作為值傳遞,則不會發送HTTP頭.一般不需要
- encoding: 使用默認的 'utf-8' 就行。
- cookie(dict或list) - 請求cookie。這些可以以兩種形式發送。
request_with_cookies = Request(url="http://www.sxt.cn/index/login/login.html",) - 使用列表:
將附加數據傳遞給回調函數
請求的回調是當下載該請求的響應時將被調用的函數。將使用下載的Response對象作為其第一個參數來調用回調函數
3 請求子類 FormRequest對象
FormRequest類擴展了Request具有處理HTML表單的功能的基礎。它使用lxml.html表單 從Response對象的表單數據預填充表單字段
class scrapy.http.FormRequest(url[, formdata, ...])
本FormRequest類增加了新的構造函數的參數。其余的參數與Request類相同,這里沒有記錄
- 參數:formdata(元組的dict或iterable) - 是一個包含HTML Form數據的字典(或(key,value)元組的迭代),它將被url編碼并分配給請求的主體。
該FormRequest對象支持除標準以下類方法Request的方法:
classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, ...])
返回一個新FormRequest對象,其中的表單字段值已預先<form>填充在給定響應中包含的HTML 元素中.
參數:
- response(Responseobject) - 包含將用于預填充表單字段的HTML表單的響應
- formname(string) - 如果給定,將使用name屬性設置為此值的形式
- formid(string) - 如果給定,將使用id屬性設置為此值的形式
- formxpath(string) - 如果給定,將使用匹配xpath的第一個表單
- formcss(string) - 如果給定,將使用匹配css選擇器的第一個形式
- formnumber(integer) - 當響應包含多個表單時要使用的表單的數量。第一個(也是默認)是0
- formdata(dict) - 要在表單數據中覆蓋的字段。如果響應元素中已存在字段,則其值將被在此參數中傳遞的值覆蓋
- clickdata(dict) - 查找控件被點擊的屬性。如果沒有提供,表單數據將被提交,模擬第一個可點擊元素的點擊。除了html屬性,控件可以通過其相對于表單中其他提交表輸入的基于零的索引,通過nr屬性來標識
- dont_click(boolean) - 如果為True,表單數據將在不點擊任何元素的情況下提交
3.1 請求使用示例
使用FormRequest通過HTTP POST發送數據
如果你想在你的爬蟲中模擬HTML表單POST并發送幾個鍵值字段,你可以返回一個FormRequest對象(從你的爬蟲)像這樣:
return [FormRequest(url="http://www.example.com/post/action", formdata={'name': 'John Doe', 'age': '27'}, callback=self.after_post)]
使用FormRequest.from_response()來模擬用戶登錄
網站通常通過元素(例如會話相關數據或認證令牌(用于登錄頁面))提供預填充的表單字段。進行剪貼時,您需要自動預填充這些字段,并且只覆蓋其中的一些,例如用戶名和密碼。您可以使用 此作業的方法。這里有一個使用它的爬蟲示例:
4 響應對象
class scrapy.http.Response(url[, status=200, headers=None, body=b'', flags=None, request=None])
一個Response對象表示的HTTP響應,這通常是下載(由下載),并供給到爬蟲進行處理
參數:
- url(string) - 此響應的URL
- status(integer) - 響應的HTTP狀態。默認為200
- headers(dict) - 這個響應的頭。dict值可以是字符串(對于單值標頭)或列表(對于多值標頭)
- body(str) - 響應體。它必須是str,而不是unicode,除非你使用一個編碼感知響應子類,如 TextResponse
- flags(list) - 是一個包含屬性初始值的 Response.flags列表。如果給定,列表將被淺復制
- request(Requestobject) - 屬性的初始值Response.request。這代表Request生成此響應
5 模擬登錄
用的函數:
- start_requests()可以返回一個請求給爬蟲的起始網站,這個返回的請求相當于start_urls,start_requests()返回的請求會替代start_urls里的請求
- Request()get請求,可以設置,url、cookie、回調函數
- FormRequest.from_response()表單post提交,第一個必須參數,上一次響應cookie的response對象,其他參數,cookie、url、表單內容等
- yield Request()可以將一個新的請求返回給爬蟲執行
在發送請求時cookie的操作,
- meta={'cookiejar':1}表示開啟cookie記錄,首次請求時寫在Request()里
- meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response的cookie,寫在FormRequest.from_response()里post授權
- meta={'cookiejar':True}表示使用授權后的cookie訪問需要登錄查看的頁面
獲取Scrapy框架Cookies
樣例代碼
start_requests()方法,可以返回一個請求給爬蟲的起始網站,這個返回的請求相當于start_urls,start_requests()返回的請求會替代start_urls里的請求
在發送請求時cookie的操作
meta={'cookiejar':1}表示開啟cookie記錄,首次請求時寫在Request()里
meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response的cookie,寫在Request里post授權
總結
以上是生活随笔為你收集整理的request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java自定义表单系统_表单识别:自定义
- 下一篇: unity怎么做水面_防水博士小课堂 |