scrapy 2.3 網(wǎng)絡(luò)工具

2021-06-17 11:57 更新

在抓取過(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...? .

Response from quotes.toscrape.com/scroll

這個(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)求。

Network tab with persistent logs and requests

在這里,我們可以看到在重新加載頁(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? 以獲得更好的概述。

JSON-object returned from the quotes.toscrape API

有了這個(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_commandignore_unknown_options=True)

將cURL命令語(yǔ)法轉(zhuǎn)換為請(qǐng)求kwargs。

參數(shù)
  • 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ù)制它。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)