W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在抓取過程中,您可能會遇到動態(tài)網(wǎ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 .
頁面與基本頁面非常相似 quotes.toscrape.com -第頁,但不是上面提到的 ?Next
? 按鈕,則當您滾動到底部時,頁面會自動加載新的引號。我們可以直接嘗試不同的xpath,但是我們將從Scrapy shell中檢查另一個非常有用的命令:
$ scrapy shell "quotes.toscrape.com/scroll"
(...)
>>> view(response)
瀏覽器窗口應(yīng)該和網(wǎng)頁一起打開,但有一個關(guān)鍵的區(qū)別:我們看到的不是引用,而是一個帶單詞的綠色條。 ?Loading...
? .
這個 ?view(response)
? 命令讓我們查看shell或稍后蜘蛛從服務(wù)器接收到的響應(yīng)。這里我們看到加載了一些基本模板,其中包括標題、登錄按鈕和頁腳,但是缺少引號。這告訴我們報價是從不同的請求加載的,而不是 ?quotes.toscrape/scroll
? .
如果你點擊 ?Network
? 選項卡,您可能只能看到兩個條目。我們要做的第一件事是通過單擊 ?Persist Logs
? . 如果禁用此選項,則每次導航到不同的頁面時,日志都會自動清除。啟用這個選項是一個很好的默認設(shè)置,因為它可以讓我們控制何時清除日志。
如果我們現(xiàn)在重新加載頁面,您將看到日志中填充了六個新的請求。
在這里,我們可以看到在重新加載頁面時發(fā)出的每個請求,并且可以檢查每個請求及其響應(yīng)。因此,讓我們找出我們的報價來自哪里:
首先單擊帶有名稱的請求 ?scroll
? . 在右邊,您現(xiàn)在可以檢查請求。在 ?Headers
? 您將找到有關(guān)請求頭的詳細信息,例如URL、方法、IP地址等。我們將忽略其他選項卡并直接單擊 ?Response
? .
你應(yīng)該在里面看到什么 ?Preview
? 窗格是呈現(xiàn)的HTML代碼,這正是我們調(diào)用 ?view(response)
? 在貝殼里。相應(yīng)地 ?type
? 日志中的請求為 ?html
? . 其他請求的類型如下 ?css
? 或 ?js
? 但是我們感興趣的是一個要求 ?quotes?page=1
? 與類型 ?json
? .
如果我們點擊這個請求,我們會看到請求的URL是 ?http://quotes.toscrape.com/api/quotes?page=1
? 響應(yīng)是一個包含我們的引號的JSON對象。我們也可以右鍵單擊請求并打開 ?Open in new tab
? 以獲得更好的概述。
有了這個響應(yīng),我們現(xiàn)在可以輕松地解析JSON對象,并請求每個頁面獲取站點上的每個引用:
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)
這個蜘蛛程序從QuotesAPI的第一頁開始。對于每個響應(yīng),我們分析 ?response.text
? 并分配給 ?data
? . 這讓我們可以像在Python字典上一樣對JSON對象進行操作。我們迭代 ?quotes
? 打印出 ?quote["text"]
? . 如果方便的話 ?has_next
? 元素是 ?true
? (嘗試加載 quotes.toscrape.com/api/quotes?page=10 在您的瀏覽器或大于10的頁碼中,我們增加 ?page
? 屬性與 ?yield
? 一個新的請求,將遞增的頁碼插入到 ?url
? .
在更復雜的網(wǎng)站中,很難輕松地復制請求,因為我們需要添加 ?headers
? 或 ?cookies
? 讓它發(fā)揮作用。在這些情況下,您可以在中導出請求 cURL 格式化,在網(wǎng)絡(luò)工具中右鍵單擊它們并使用 ?from_curl()
? 方法生成等效請求:
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)建該請求所需的參數(shù),可以使用 ?curl_to_request_kwargs()
? 函數(shù)獲取具有等效參數(shù)的字典:
scrapy.utils.curl.
curl_to_request_kwargs
(curl_command, ignore_unknown_options=True)將cURL命令語法轉(zhuǎn)換為請求kwargs。
curl_command (str) -- 包含curl命令的字符串
ignore_unknown_options (bool) -- 如果為true,則當cURL選項未知時僅發(fā)出警告。否則將引發(fā)錯誤。(默認值:True)
請求字典
注意,要將cURL命令轉(zhuǎn)換為Scrapy請求,可以使用 curl2scrapy .
如你所見,在 Network -工具我們能夠輕松地復制頁面滾動功能的動態(tài)請求。對動態(tài)頁面進行爬行可能非常困難,頁面也可能非常復雜,但是(主要)歸根結(jié)底就是識別正確的請求并在蜘蛛中復制它。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: