日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志

發(fā)布時(shí)間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、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)志,可用于日志記錄或類似目的

from scrapy.http import Request,FormRequestreq=Request("http://www.baidu.com",headers={"spider":666},meta={"name":"爬蟲"}) #功能構(gòu)造請(qǐng)求 #參數(shù) #請(qǐng)求對(duì)象 print(req.url) #http://www.baidu.com print(req.method) #GET print(req.headers) #{b'Spider': [b'666']} print(req.meta) #{'name': '爬蟲'} rer=req.replace(url="https://www.baidu.com") print(rer.url) #https://www.baidu.com

二、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)求流程

  • 訪問 https://github.com/login 獲取 https://github.com/session 需要的參數(shù)
  • 向 https://github.com/session 提交 post 用戶名 密碼等數(shù)據(jù) 獲取登錄頁面
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。