99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

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

2021-06-17 11:57 更新

在抓取過程中,您可能會遇到動態(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...? .

Response from quotes.toscrape.com/scroll

這個 ?view(response)? 命令讓我們查看shell或稍后蜘蛛從服務(wù)器接收到的響應(yīng)。這里我們看到加載了一些基本模板,其中包括標題、登錄按鈕和頁腳,但是缺少引號。這告訴我們報價是從不同的請求加載的,而不是 ?quotes.toscrape/scroll? .

如果你點擊 ?Network? 選項卡,您可能只能看到兩個條目。我們要做的第一件事是通過單擊 ?Persist Logs? . 如果禁用此選項,則每次導航到不同的頁面時,日志都會自動清除。啟用這個選項是一個很好的默認設(shè)置,因為它可以讓我們控制何時清除日志。

如果我們現(xiàn)在重新加載頁面,您將看到日志中填充了六個新的請求。

Network tab with persistent logs and requests

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

JSON-object returned from the quotes.toscrape API

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

將cURL命令語法轉(zhuǎn)換為請求kwargs。

參數(shù)
  • curl_command (str) -- 包含curl命令的字符串

  • ignore_unknown_options (bool) -- 如果為true,則當cURL選項未知時僅發(fā)出警告。否則將引發(fā)錯誤。(默認值:True)

返回

請求字典

注意,要將cURL命令轉(zhuǎn)換為Scrapy請求,可以使用 curl2scrapy .

如你所見,在 Network -工具我們能夠輕松地復制頁面滾動功能的動態(tài)請求。對動態(tài)頁面進行爬行可能非常困難,頁面也可能非常復雜,但是(主要)歸根結(jié)底就是識別正確的請求并在蜘蛛中復制它。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號