$.post把表单对象传递过去_第二章 第三节 Request请求对象详解
Request對象和Response對象是必須熟悉的。
Request對象負責請求的構造和處理
Response對象負責返回資源的解析和處理
一、Request對象參數
Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
參數默認值是否必須說明url無Y請求的urlcallbackself.parseY下載器完成后的回調函數methodGETN請求類型: 支持GET、POST、PUT...headers{}N默認無, 但是有中間件會構造默認的請求頭bodyb''N請求體, 只支持string, 內部會轉換成bytecookies{}N附加cookie信息meta{}N元數據priority0N請求優先級, 數字越大, 優先級越高dont_filterFalseN是否過濾重復請求, True: 不過濾, False: 過濾, 默認會過濾重復請求errbackN發生錯誤時的回調函數, 部分中間件中的錯誤也會傳送給這個方法flags[]N可以在中間件針對性的處理每個requestcb_kwargs{}N傳遞給callback方法的參數
1. 發起一般請求
# -*- coding: utf-8 -*- import scrapy from ccidcom.items import DocumentItemclass CcidcomSpider(scrapy.Spider):name = 'ccidcomSpider'allowed_domains = ['www.ccidcom.com']def start_requests(self):yield scrapy.Request('http://www.ccidcom.com/yaowen/index.html',callback=self.parse,headers={ # 指定請求頭'Content-Type': 'text',},cookies={'test_cookie': 'aaa'},meta={'column': 'yaowen'},dont_filter=True,errback=self.parse_error,cb_kwargs={'column': 'yaowen'})def parse(self, response, column):request = response.requestprint('自定義參數: ', column)print('請求頭: ', request.headers)print('請求Cookies: ', request.cookies)print('元數據: ', response.meta)def parse_error(self, response):pass運行scrapy crawl ccidcomSpider
# 輸出 ... 自定義參數: yaowen 請求頭: {b'Content-Type': [b'text'], b'Accept': [b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'], b'Accept-Language': [b'en'], b'User-Agent': [b'Scrapy/1.7.3 (+https://scrapy.org)'], b'Accept-Encoding': [b'gzip,deflate'], b'Cookie': [b'test_cookie=aaa']} 請求Cookies: {'test_cookie': 'aaa'} 元數據: {'column': 'yaowen', 'download_timeout': 180.0, 'download_slot': 'www.ccidcom.com', 'download_latency': 0.19195008277893066} ...我們可以看到, 除了我們自己添加的headers, scrapy也會添加一些其他headers選項cookies會添加我們指定的cookie信息meta 可以將請求的所需要的數據從request傳遞到response中, 這樣我們就可以在parse方法中直接讀取到了, 在這里也要注意一點, 禁止meta里傳遞request對象
而且在meta中也附加了一些數據, download_timeout是指下載超時時間, download_slot: 跟蹤的下載器插槽, 也就是調度器用來區分到底是哪個下載器, 根據主域名進行區分, download_latency: 下載器花費掉的時間, 單位是s
# 下面這種寫法是完全禁止的 _req = scrapy.Request('http://www.baidu.com') yield scrapy.Request('http://www.baidu.com', meta={'request': _req})2. meta詳解
key說明dont_redirectTrue/False, 禁止301,302跳轉dont_retryTrue/False, 禁止失敗重試handle_httpstatus_list允許的http狀態碼 [200, 400]handle_httpstatus_allTrue/False, 所有的狀態碼都是正常請求dont_merge_cookiesTrue/False禁止合并cookies, 當設置cookies參數的時候, 默認scrapy的cookie中間件可能覆蓋掉你設置的cookies(key一樣), 設置為False,則使用你設置的cookiescookiejar指定傳遞的cookiejar版本, scrapy中cookie不會自動傳遞, 所以必須指定一個cookiejar來傳遞, 稍后會詳解dont_cacheTrue/False, 禁止緩存此請求redirect_reasons保存重定向的理由, [301,302, 'meta refresh']redirect_urls保存經過重定向的urlbindaddress設置請求的源ip, 有時候不起作用dont_obey_robotstxt是否遵守robot.txt協議download_timeout下載超時時間設置, 默認是設置里的DOWNLOAD_TIMEOUTdownload_maxsize下載的最大資源限制download_latency只讀, 從開始請求到請求完成的時間download_fail_on_dataloss是否在響應中斷是拋出錯誤, True/Falseproxy設置代理ipftp_userftp請求的用戶ftp_passwordftp請求的密碼referrer_policyheader頭中的Referrer-Policy的值max_retry_times最大重試次數
這里的參數, 在稍后會詳細講解
二、FormRequest對象
FormRequest對象用來模擬post表單請求
FormRequest對象的參數和Request基本都是一樣的, 但是多了一個formdataformdata是一個dict或者可迭代的元組, 包含form表單請求的具體內容
1. 發起表單請求
def start_requests(self):yield scrapy.FormRequest(url='http://www.ccidcom.com/user/dologin.do',formdata={'username': '你的賬號','password': '你的登錄密碼'},callback=self.after_login)運行爬蟲scrapy crawl CcidcomFormSpider
查看輸出:
2. 從資源中獲取表單數據提交, form_response
這種方法, 會讀取到form標簽中的所有元素的信息, 并且填入你指定的表單的值, 然后發起請求
目的在于, 很多表單中有一些隱藏的元素等, 或者表單唯一值, 來防止表單被重復提交, 這個方法就可以自動去獲取到表單中的元素的值來提交
具體的方法:classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, …])
key默認值是否必須說明responseY上一頁請求拿到的response對象formnameNoneN如果給出, 則解析form標簽中含有name=value的表單formidNoneN同上, 解析id=給定值的表單formxpathNoneN同上, 解析指定的xpath的表單formcssNoneN同上, 解析給定的css的表單formnumber0N如果解析出來, 包含多個表單, 指定具體哪個表單, 默認0formdata{}N要提交的表單信息clickdataNoneN給定可點擊的元素dont_clickFalseN如果是True, 則表單會在不包含點擊按鈕的情況下提交
優勢:
缺點:
現在我們來看一個例子
def start_requests(self):# 先訪問表單所在的頁面yield scrapy.Request('http://www.dcic-china.com/login/index.html',callback=self.parse)def parse(self, response):# 這個方法會將上一個表單頁面的資源傳入, 并且自動解析表單元素# 然后補足你提供的表單的值(你自定義的值可能會覆蓋表單頁面的值)yield scrapy.FormRequest.from_response(response,formdata={'username': '你的賬號','password': '你的密碼','code': '1111'},callback=self.after_login)def after_login(self, response):print('返回的數據: {}'.format(response.css('p.error::text').get()))運行爬蟲
... 2019-08-16 15:11:12 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://www.dcic-china.com/login/index.html> (referer: http://www.dcic-china.com/login/index.html) 返回的數據: 驗證碼不正確 2019-08-16 15:11:12 [scrapy.core.engine] INFO: Closing spider (finished) ...歡迎關注Python開發之路(微信號: python-developer)
總結
以上是生活随笔為你收集整理的$.post把表单对象传递过去_第二章 第三节 Request请求对象详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 环形时间显示_Andro
- 下一篇: office上下滑动滚轮特别卡_滚轮及部