error response from daemon_Scrapy 框架-模拟登录-Request、Response
1. Scrapy-Request和Response(請求和響應)
Scrapy的Request和Response對象用于爬網網站。
通常,Request對象在爬蟲程序中生成并傳遞到系統,直到它們到達下載程序,后者執行請求并返回一個Response對象,該對象返回到發出請求的爬蟲程序。
爬蟲RequestResponse創建獲取下載數據數據爬蟲RequestResponse
2. Request對象
class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])一個Request對象表示一個HTTP請求,它通常是在爬蟲生成,并由下載執行,從而生成Response
- 參數
- url(string) - 此請求的網址
- callback(callable) - 將使用此請求的響應(一旦下載)作為其第一個參數調用的函數。有關更多信息,請參閱下面的將附加數據傳遞給回調函數。如果請求沒有指定回調,parse()將使用spider的 方法。請注意,如果在處理期間引發異常,則會調用errback。
- method(string) - 此請求的HTTP方法。默認為'GET'??稍O置為"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。這些可以以兩種形式發送。
- 使用dict:
request_with_cookies = Request(url="http://www.sxt.cn/index/login/login.html",)
- 使用列表:
request_with_cookies = Request(url="http://www.example.com", cookies=[{'name': 'currency', 'value': 'USD', 'domain': 'example.com', 'path': '/currency'}])
后一種形式允許定制 cookie的屬性domain和path屬性。這只有在保存Cookie用于以后的請求時才有用
request_with_cookies = Request(url="http://www.example.com",cookies={'currency': 'USD', 'country': 'UY'},meta={'dont_merge_cookies': True})將附加數據傳遞給回調函數
請求的回調是當下載該請求的響應時將被調用的函數。將使用下載的Response對象作為其第一個參數來調用回調函數
def parse_page1(self, response):item = MyItem()item['main_url'] = response.urlrequest = scrapy.Request("http://www.example.com/some_page.html",callback=self.parse_page2)request.meta['item'] = itemreturn requestdef parse_page2(self, response):item = response.meta['item']item['other_url'] = response.urlreturn item3 請求子類 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()來模擬用戶登錄
網站通常通過元素(例如會話相關數據或認證令牌(用于登錄頁面))提供預填充的表單字段。進行剪貼時,您需要自動預填充這些字段,并且只覆蓋其中的一些,例如用戶名和密碼。您可以使用 此作業的方法。這里有一個使用它的爬蟲示例:
<input type="hidden"> FormRequest.from_response() import scrapyclass LoginSpider(scrapy.Spider):name = 'example.com'start_urls = ['http://www.example.com/users/login.php']def parse(self, response):return scrapy.FormRequest.from_response(response,formdata={'username': 'john', 'password': 'secret'},callback=self.after_login)def after_login(self, response):# check login succeed before going onif "authentication failed" in response.body:self.logger.error("Login failed")return# continue scraping with authenticated session...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授權
import scrapy from scrapy import Request from scrapy import FormRequestclass SxtSpiderSpider(scrapy.Spider):name = 'sxt1'allowed_domains = ['sxt.cn']def start_requests(self):return [Request('http://www.sxt.cn/index/login/login.html', meta={'cookiejar': 1}, callback=self.parse)]def parse(self, response):formdata = {"user": "17703181473", "password": "123456"}return FormRequest( formdata=formdata,url='http://www.sxt.cn/index/login/login.html',meta={'cookiejar': response.meta['cookiejar']},callback=self.login_after)def login_after(self, response):yield scrapy.Request('http://www.sxt.cn/index/user.html',meta={"cookiejar": response.meta['cookiejar']},callback=self.next)def next(self,response):print(response.text) 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的error response from daemon_Scrapy 框架-模拟登录-Request、Response的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 优雅停机_新姿势,
- 下一篇: aspx ttf文件加载不出来_加载页面