爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志
一、Request
Scrapy.http.Request類是scrapy框架中request的基類。它的參數如下:
-  url(字符串) - 此請求的URL 
-  callback(callable)- 回調函數 
-  method(string) - 此請求的HTTP方法。默認為’GET’。 
-  meta(dict) - Request.meta屬性的初始值。 
-  body(str 或unicode) - 請求體。如果沒有傳參,默認為空字符串。 
-  headers(dict) - 此請求的請求頭。 
-  cookies - 請求cookie。 
-  encoding(字符串) - 此請求的編碼(默認為’utf-8’)此編碼將用于對URL進行百分比編碼并將body抓換str(如果給定unicode)。 
-  priority(int) - 此請求的優先級(默認為0),數字越大優先級越高。 
-  dont_filter(boolean) - 表示調度程序不應過濾此請求。 
-  errback(callable) - 在處理請求時引發任何異常時將調用的函數。 
-  flags(list) - 發送給請求的標志,可用于日志記錄或類似目的 
二、FormRequest
get請求和post請求是最常見的請求。scrapy框架內置了一個FormRequest類
 它擴展了基類Request,具有處理HTML表單的功能。
在使用scrapy發動POST請求的時候,常使用此方法,能較方便的發送請求.具體的使用,見登錄github案例;
三、Response
url(字符串) - 此響應的URL
 status(整數) - 響應的HTTP狀態。默認為200。
 headers(dict) - 此響應的響應頭。dict值可以是字符串(對于單值標頭)或列表(對于多值標頭)。
 body(字節) - 響應主體。要將解碼后的文本作為str(Python 2中的unicode)訪問,您可以使用response.text 來自編碼感知的 Response子類,例如TextResponse。
 flags(列表) - 是包含Response.flags屬性初始值的列表 。如果給定,列表將被淺層復制。
 request(Requestobject) - Response.request屬性的初始值。這表示Request生成此響應的內容。
屬性和方法
 url 包含此請求的URL的字符串。該屬性是只讀的。更改請求使用的URL replace()。
 method 表示請求中的HTTP方法的字符串。
 headers 類似字典的對象,包含請求頭。
 body 包含請求正文的str。該屬性是只讀的。更改請求使用的URL replace()。
 meta 包含此請求的任意元數據的字典。
 copy() 返回一個新的請求,改請求是此請求的副本。
 replace([ URL,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback] ) 返回一個更新對的request
四、日志使用
logger
Scrapy logger 在每個Spider實例中提供了一個可以訪問和使用的實例
例如:
self.logger.warning("可能會有錯誤")日志文件配置
LOG_FILE 日志輸出文件,如果為None,就打印在控制臺
 LOG_ENABLED 是否啟用日志,默認True
 LOG_ENCODING 日期編碼,默認utf-8
 LOG_LEVEL 日志等級,默認debug
 LOG_FORMAT 日志格式
 LOG_DATEFORMAT 日志日期格式
 LOG_STDOUT 日志標準輸出,默認False,如果True所有標準輸出都將寫入日志中
 LOG_SHORT_NAMES 短日志名,默認為False,如果True將不輸出組件名
示例(直接添加在settings里):
項目中一般設置:
LOG_FILE = 'logfile_name' LOG_LEVEL = 'INFO'日志格式輸出:
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' LOG_DATEFORMAT ='%Y'日志等級:
DEBUG(調試信息)< INFO(一般信息) < WARNING(警告) < ERROR(錯誤) < CRITICAL(嚴重錯誤)五、案例:實現Github登錄
5.1、登錄參數
登錄需要向 https://github.com/session 網址提交用戶名和密碼,
除此之外,還有其他的參數(這里列舉的僅供參考,具體還是要看網頁的):
data={'commit': 'Sign in','authenticity_token': authenticity_token,'login': 'xxxxxxxxx@qq.com','password': 'xxxxxx','trusted_device': '','webauthn-support': 'supported','webauthn-iuvpaa-support': 'unsupported','return_to': 'https://github.com/login','allow_signup': '','client_id': '','integration': '',required_field: '','timestamp': timestamp,'timestamp_secret': timestamp_secret }注意:需要提交的數據可能來源:
 1.之前訪問的頁面中
 2.JS動態生成
 這需要經過分析檢驗,有些數據需要我們來構造,有些是默認的。
5.2、請求流程
5.3、代碼:
spider文件
import scrapyclass LoginSpider(scrapy.Spider):name = 'login'# allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response):#通過對比分析,以下需要我們來自己構建authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract()[0]required_field = response.xpath('//input[@hidden="hidden"]/@name').extract()[0]timestamp = response.xpath('//input[@name="timestamp"]/@value').extract()[0]timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract()[0]data={'commit': 'Sign in','authenticity_token': authenticity_token,'login': 'xxxxxxxxx@qq.com', #記得寫賬號'password': 'xxxxxx', #記得寫密碼'trusted_device': '','webauthn-support': 'supported','webauthn-iuvpaa-support': 'unsupported','return_to': 'https://github.com/login','allow_signup': '','client_id': '','integration': '',required_field: '','timestamp': timestamp,'timestamp_secret': timestamp_secret}#使用FormRequest來請求yield scrapy.FormRequest(url='https://github.com/session',formdata=data,callback=self.verify_login) def verify_login(self,response):if 'Q-bird1' in response.text: #Q-bird1是我登錄成功后,網頁源碼里的特有的一個字符串print('登錄成功!!!')else:print('登錄失敗!!!')settings文件
設置robots協議,添加全局請求頭
ROBOTSTXT_OBEY = FalseDEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36', }#設置日志的輸出格式 LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' LOG_DATEFORMAT ='%Y'結果(表示我們已經成功了):
總結
以上是生活随笔為你收集整理的爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 爬虫学习笔记(八)—— Scrapy框架
- 下一篇: 爬虫学习笔记(十)—— Scrapy框架
