W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在抓取過(guò)程中,您可能會(huì)遇到動(dòng)態(tài)網(wǎng)頁(yè),其中頁(yè)面的某些部分是通過(guò)多個(gè)請(qǐng)求動(dòng)態(tài)加載的。雖然這很棘手,但是 Network-tool in the Developer Tools greatly facilitates this task. To demonstrate the Network-tool, let's take a look at the page quotes.toscrape.com/scroll .
頁(yè)面與基本頁(yè)面非常相似 quotes.toscrape.com -第頁(yè),但不是上面提到的 ?Next
? 按鈕,則當(dāng)您滾動(dòng)到底部時(shí),頁(yè)面會(huì)自動(dòng)加載新的引號(hào)。我們可以直接嘗試不同的xpath,但是我們將從Scrapy shell中檢查另一個(gè)非常有用的命令:
$ scrapy shell "quotes.toscrape.com/scroll"
(...)
>>> view(response)
瀏覽器窗口應(yīng)該和網(wǎng)頁(yè)一起打開,但有一個(gè)關(guān)鍵的區(qū)別:我們看到的不是引用,而是一個(gè)帶單詞的綠色條。 ?Loading...
? .
這個(gè) ?view(response)
? 命令讓我們查看shell或稍后蜘蛛從服務(wù)器接收到的響應(yīng)。這里我們看到加載了一些基本模板,其中包括標(biāo)題、登錄按鈕和頁(yè)腳,但是缺少引號(hào)。這告訴我們報(bào)價(jià)是從不同的請(qǐng)求加載的,而不是 ?quotes.toscrape/scroll
? .
如果你點(diǎn)擊 ?Network
? 選項(xiàng)卡,您可能只能看到兩個(gè)條目。我們要做的第一件事是通過(guò)單擊 ?Persist Logs
? . 如果禁用此選項(xiàng),則每次導(dǎo)航到不同的頁(yè)面時(shí),日志都會(huì)自動(dòng)清除。啟用這個(gè)選項(xiàng)是一個(gè)很好的默認(rèn)設(shè)置,因?yàn)樗梢宰屛覀兛刂坪螘r(shí)清除日志。
如果我們現(xiàn)在重新加載頁(yè)面,您將看到日志中填充了六個(gè)新的請(qǐng)求。
在這里,我們可以看到在重新加載頁(yè)面時(shí)發(fā)出的每個(gè)請(qǐng)求,并且可以檢查每個(gè)請(qǐng)求及其響應(yīng)。因此,讓我們找出我們的報(bào)價(jià)來(lái)自哪里:
首先單擊帶有名稱的請(qǐng)求 ?scroll
? . 在右邊,您現(xiàn)在可以檢查請(qǐng)求。在 ?Headers
? 您將找到有關(guān)請(qǐng)求頭的詳細(xì)信息,例如URL、方法、IP地址等。我們將忽略其他選項(xiàng)卡并直接單擊 ?Response
? .
你應(yīng)該在里面看到什么 ?Preview
? 窗格是呈現(xiàn)的HTML代碼,這正是我們調(diào)用 ?view(response)
? 在貝殼里。相應(yīng)地 ?type
? 日志中的請(qǐng)求為 ?html
? . 其他請(qǐng)求的類型如下 ?css
? 或 ?js
? 但是我們感興趣的是一個(gè)要求 ?quotes?page=1
? 與類型 ?json
? .
如果我們點(diǎn)擊這個(gè)請(qǐng)求,我們會(huì)看到請(qǐng)求的URL是 ?http://quotes.toscrape.com/api/quotes?page=1
? 響應(yīng)是一個(gè)包含我們的引號(hào)的JSON對(duì)象。我們也可以右鍵單擊請(qǐng)求并打開 ?Open in new tab
? 以獲得更好的概述。
有了這個(gè)響應(yīng),我們現(xiàn)在可以輕松地解析JSON對(duì)象,并請(qǐng)求每個(gè)頁(yè)面獲取站點(diǎn)上的每個(gè)引用:
import scrapy
import json
class QuoteSpider(scrapy.Spider):
name = 'quote'
allowed_domains = ['quotes.toscrape.com']
page = 1
start_urls = ['http://quotes.toscrape.com/api/quotes?page=1']
def parse(self, response):
data = json.loads(response.text)
for quote in data["quotes"]:
yield {"quote": quote["text"]}
if data["has_next"]:
self.page += 1
url = f"http://quotes.toscrape.com/api/quotes?page={self.page}"
yield scrapy.Request(url=url, callback=self.parse)
這個(gè)蜘蛛程序從QuotesAPI的第一頁(yè)開始。對(duì)于每個(gè)響應(yīng),我們分析 ?response.text
? 并分配給 ?data
? . 這讓我們可以像在Python字典上一樣對(duì)JSON對(duì)象進(jìn)行操作。我們迭代 ?quotes
? 打印出 ?quote["text"]
? . 如果方便的話 ?has_next
? 元素是 ?true
? (嘗試加載 quotes.toscrape.com/api/quotes?page=10 在您的瀏覽器或大于10的頁(yè)碼中,我們?cè)黾?nbsp;?page
? 屬性與 ?yield
? 一個(gè)新的請(qǐng)求,將遞增的頁(yè)碼插入到 ?url
? .
在更復(fù)雜的網(wǎng)站中,很難輕松地復(fù)制請(qǐng)求,因?yàn)槲覀冃枰砑?nbsp;?headers
? 或 ?cookies
? 讓它發(fā)揮作用。在這些情況下,您可以在中導(dǎo)出請(qǐng)求 cURL 格式化,在網(wǎng)絡(luò)工具中右鍵單擊它們并使用 ?from_curl()
? 方法生成等效請(qǐng)求:
from scrapy import Request
request = Request.from_curl(
"curl 'http://quotes.toscrape.com/api/quotes?page=1' -H 'User-Agent: Mozil"
"la/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0' -H 'Acce"
"pt: */*' -H 'Accept-Language: ca,en-US;q=0.7,en;q=0.3' --compressed -H 'X"
"-Requested-With: XMLHttpRequest' -H 'Proxy-Authorization: Basic QFRLLTAzM"
"zEwZTAxLTk5MWUtNDFiNC1iZWRmLTJjNGI4M2ZiNDBmNDpAVEstMDMzMTBlMDEtOTkxZS00MW"
"I0LWJlZGYtMmM0YjgzZmI0MGY0' -H 'Connection: keep-alive' -H 'Referer: http"
"://quotes.toscrape.com/scroll' -H 'Cache-Control: max-age=0'")
或者,如果您想知道重新創(chuàng)建該請(qǐng)求所需的參數(shù),可以使用 ?curl_to_request_kwargs()
? 函數(shù)獲取具有等效參數(shù)的字典:
scrapy.utils.curl.
curl_to_request_kwargs
(curl_command, ignore_unknown_options=True)將cURL命令語(yǔ)法轉(zhuǎn)換為請(qǐng)求kwargs。
curl_command (str) -- 包含curl命令的字符串
ignore_unknown_options (bool) -- 如果為true,則當(dāng)cURL選項(xiàng)未知時(shí)僅發(fā)出警告。否則將引發(fā)錯(cuò)誤。(默認(rèn)值:True)
請(qǐng)求字典
注意,要將cURL命令轉(zhuǎn)換為Scrapy請(qǐng)求,可以使用 curl2scrapy .
如你所見,在 Network -工具我們能夠輕松地復(fù)制頁(yè)面滾動(dòng)功能的動(dòng)態(tài)請(qǐng)求。對(duì)動(dòng)態(tài)頁(yè)面進(jìn)行爬行可能非常困難,頁(yè)面也可能非常復(fù)雜,但是(主要)歸根結(jié)底就是識(shí)別正確的請(qǐng)求并在蜘蛛中復(fù)制它。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: