爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志
一、Request
Scrapy.http.Request類是scrapy框架中request的基類。它的參數(shù)如下:
-
url(字符串) - 此請(qǐng)求的URL
-
callback(callable)- 回調(diào)函數(shù)
-
method(string) - 此請(qǐng)求的HTTP方法。默認(rèn)為’GET’。
-
meta(dict) - Request.meta屬性的初始值。
-
body(str 或unicode) - 請(qǐng)求體。如果沒有傳參,默認(rèn)為空字符串。
-
headers(dict) - 此請(qǐng)求的請(qǐng)求頭。
-
cookies - 請(qǐng)求cookie。
-
encoding(字符串) - 此請(qǐng)求的編碼(默認(rèn)為’utf-8’)此編碼將用于對(duì)URL進(jìn)行百分比編碼并將body抓換str(如果給定unicode)。
-
priority(int) - 此請(qǐng)求的優(yōu)先級(jí)(默認(rèn)為0),數(shù)字越大優(yōu)先級(jí)越高。
-
dont_filter(boolean) - 表示調(diào)度程序不應(yīng)過濾此請(qǐng)求。
-
errback(callable) - 在處理請(qǐng)求時(shí)引發(fā)任何異常時(shí)將調(diào)用的函數(shù)。
-
flags(list) - 發(fā)送給請(qǐng)求的標(biāo)志,可用于日志記錄或類似目的
二、FormRequest
get請(qǐng)求和post請(qǐng)求是最常見的請(qǐng)求。scrapy框架內(nèi)置了一個(gè)FormRequest類
它擴(kuò)展了基類Request,具有處理HTML表單的功能。
在使用scrapy發(fā)動(dòng)POST請(qǐng)求的時(shí)候,常使用此方法,能較方便的發(fā)送請(qǐng)求.具體的使用,見登錄github案例;
三、Response
url(字符串) - 此響應(yīng)的URL
status(整數(shù)) - 響應(yīng)的HTTP狀態(tài)。默認(rèn)為200。
headers(dict) - 此響應(yīng)的響應(yīng)頭。dict值可以是字符串(對(duì)于單值標(biāo)頭)或列表(對(duì)于多值標(biāo)頭)。
body(字節(jié)) - 響應(yīng)主體。要將解碼后的文本作為str(Python 2中的unicode)訪問,您可以使用response.text 來自編碼感知的 Response子類,例如TextResponse。
flags(列表) - 是包含Response.flags屬性初始值的列表 。如果給定,列表將被淺層復(fù)制。
request(Requestobject) - Response.request屬性的初始值。這表示Request生成此響應(yīng)的內(nèi)容。
屬性和方法
url 包含此請(qǐng)求的URL的字符串。該屬性是只讀的。更改請(qǐng)求使用的URL replace()。
method 表示請(qǐng)求中的HTTP方法的字符串。
headers 類似字典的對(duì)象,包含請(qǐng)求頭。
body 包含請(qǐng)求正文的str。該屬性是只讀的。更改請(qǐng)求使用的URL replace()。
meta 包含此請(qǐng)求的任意元數(shù)據(jù)的字典。
copy() 返回一個(gè)新的請(qǐng)求,改請(qǐng)求是此請(qǐng)求的副本。
replace([ URL,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback] ) 返回一個(gè)更新對(duì)的request
四、日志使用
logger
Scrapy logger 在每個(gè)Spider實(shí)例中提供了一個(gè)可以訪問和使用的實(shí)例
例如:
self.logger.warning("可能會(huì)有錯(cuò)誤")日志文件配置
LOG_FILE 日志輸出文件,如果為None,就打印在控制臺(tái)
LOG_ENABLED 是否啟用日志,默認(rèn)True
LOG_ENCODING 日期編碼,默認(rèn)utf-8
LOG_LEVEL 日志等級(jí),默認(rèn)debug
LOG_FORMAT 日志格式
LOG_DATEFORMAT 日志日期格式
LOG_STDOUT 日志標(biāo)準(zhǔn)輸出,默認(rèn)False,如果True所有標(biāo)準(zhǔn)輸出都將寫入日志中
LOG_SHORT_NAMES 短日志名,默認(rèn)為False,如果True將不輸出組件名
示例(直接添加在settings里):
項(xiàng)目中一般設(shè)置:
LOG_FILE = 'logfile_name' LOG_LEVEL = 'INFO'日志格式輸出:
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' LOG_DATEFORMAT ='%Y'日志等級(jí):
DEBUG(調(diào)試信息)< INFO(一般信息) < WARNING(警告) < ERROR(錯(cuò)誤) < CRITICAL(嚴(yán)重錯(cuò)誤)五、案例:實(shí)現(xiàn)Github登錄
5.1、登錄參數(shù)
登錄需要向 https://github.com/session 網(wǎng)址提交用戶名和密碼,
除此之外,還有其他的參數(shù)(這里列舉的僅供參考,具體還是要看網(wǎng)頁的):
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 }注意:需要提交的數(shù)據(jù)可能來源:
1.之前訪問的頁面中
2.JS動(dòng)態(tài)生成
這需要經(jīng)過分析檢驗(yàn),有些數(shù)據(jù)需要我們來構(gòu)造,有些是默認(rèn)的。
5.2、請(qǐng)求流程
5.3、代碼:
spider文件
import scrapyclass LoginSpider(scrapy.Spider):name = 'login'# allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response):#通過對(duì)比分析,以下需要我們來自己構(gòu)建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', #記得寫賬號(hào)'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來請(qǐng)求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是我登錄成功后,網(wǎng)頁源碼里的特有的一個(gè)字符串print('登錄成功!!!')else:print('登錄失敗!!!')settings文件
設(shè)置robots協(xié)議,添加全局請(qǐng)求頭
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', }#設(shè)置日志的輸出格式 LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' LOG_DATEFORMAT ='%Y'結(jié)果(表示我們已經(jīng)成功了):
總結(jié)
以上是生活随笔為你收集整理的爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(八)—— Scrapy框架
- 下一篇: 爬虫学习笔记(十)—— Scrapy框架