簡體   English   中英

使用 Python 遞歸抓取頁面(scrapy)

[英]Recursively Scraping pages using Python (scrapy)

我正在嘗試制作一個程序,在轉到下一頁時檢索商品的標題和價格。

現在第一頁的所有信息(標題,價格)都被提取出來了,但程序不會進入下一頁

網址: https : //scrapingclub.com/exercise/list_basic/

import scrapy
class RecursiveSpider(scrapy.Spider):
    name = 'recursive'
    allowed_domains = ['scrapingclub.com/exercise/list_basic/']
    start_urls = ['http://scrapingclub.com/exercise/list_basic//']

    def parse(self, response):
        card = response.xpath("//div[@class='card-body']")
        for thing in card:
            title = thing.xpath(".//h4[@class='card-title']").extract_first()
            price = thing.xpath(".//h5").extract_first
            yield {'price' : price, 'title' : title}
            
            
            next_page_url = response.xpath("//li[@class='page-item']//a/@href")
            if next_page_url:
                absolute_nextpage_url = response.urljoin(next_page_url)
                yield scrapy.Request(absolute_nextpage_url) ```

您應該在這種情況下添加執行日志,這將有助於確定您的問題。

我可以看到一些問題:

        next_page_url = response.xpath("//li[@class='page-item']//a/@href")
        if next_page_url:
            absolute_nextpage_url = response.urljoin(next_page_url)

變量next_page_url包含一個選擇器,而不是一個字符串。 您需要使用.get()方法來提取具有相對 url 的字符串。

在此之后,我執行了它返回的代碼:

2020-09-04 15:19:34 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'scrapingclub.com': <GET https://scrapingclub.com/exercise/list_basic/?page=2>

它過濾請求,因為它認為它是非現場請求,即使它不是。 要修復它,只需使用allowed_domains = ['scrapingclub.com']或完全刪除此行。 如果您想了解更多此過濾器的工作原理,請查看此處的來源。

最后,將這個片段放在 for 循環下是沒有意義的:

        next_page_url = response.xpath("//li[@class='page-item']//a/@href").get() # I added the .get()
        if next_page_url:
            absolute_nextpage_url = response.urljoin(next_page_url)
            yield scrapy.Request(absolute_nextpage_url) 
  • 如果您使用get()方法,它將返回next_page_url第一項(現在是第 2 頁,但在下一個回調中將是第 1 頁,因此您永遠不會前進到第 3 頁)。
  • 如果您使用getall()它將返回一個列表,您需要迭代它以產生所有可能的請求,但這是一個遞歸函數,因此您最終會在每個遞歸步驟中執行此操作。

最好的選擇是選擇下一個按鈕而不是頁碼:

next_page_url = response.xpath('//li[@class="page-item"]/a[contains(text(), "Next")]/@href').get()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM