簡體   English   中英

Scrapy - 遞歸抓取並處理重復條目

[英]Scrapy - Scraping Recursively and handling double entries

一般來說,我對scrapy和python很陌生,目前正在嘗試從https://www.twitchmetrics.net/channels/viewership為每個給定類別(最受關注、增長最快等)抓取每種語言/游戲組合

這個想法是在每一行中都有一個頻道,其中包含 rank_mostwatched_english_leagueoflegends、rank_fastest_coming_nederlands_dota2 等列。

到目前為止,我管理的不多(並且僅針對“最受關注”類別):

  • 獲得全/全組合的排名
  • 提取語言的鏈接,關注它們並動態創建項目以存儲排名

到目前為止我有這個代碼:

import scrapy
import datetime
from abc import ABC
from scrapy.loader import ItemLoader
from scrapy.item import BaseItem


class FlexibleItem(dict, BaseItem):
    pass


class ChannelLeaderboardSpider(scrapy.Spider):
    name = 'channel_leaderboards'
    # Enter first page of the leaderboard URL
    start_urls = [
        'https://www.twitchmetrics.net/channels/viewership'
    ]

    def parse(self, response):
        language_page_links = response.xpath(
            '//div[@class="mb-4"][1]//a//@href').getall()
        lang_page_links_test = language_page_links[:3]
        yield from response.follow_all(lang_page_links_test, self.parse_lang)

    def parse_lang(self, response):
        # Grab all games for currently parsed language
        all_games = response.xpath(
            '//div[@class="mb-4"][1]//a//@href').getall()
        all_games_test = all_games[:3]
        all_channels = response.xpath('//h5')
        language = (response.url).partition('lang=')[2]
        if language == '':
            language = 'all'
        else:
            pass

        for i, channel in enumerate(all_channels, start=1):
            il = ItemLoader(item=FlexibleItem(), selector=channel)
            il.add_xpath('channel_id', './text()')
            il.add_value('rank_mostwatched_'+language+'_all', i)
            il.add_value('date', datetime.date.today().strftime('%y-%m-%d'))
            yield il.load_item()

        yield from response.follow_all(all_games_test, self.parse_games)

    def parse_games(self, response):
        pass

如您所見,我的下一個想法是獲取當前語言的所有游戲的鏈接。 但是,我不太確定如何繼續。 如何確保正確填充多次出現的頻道? 有沒有更好、更簡潔的方法來做到這一點?

在將請求發送到通道的代碼中,您需要設置 dont_filter=True 以確保抓取重復的 URL。 您也可以關閉重復的中間件,但我通常只使用 dont_filter。 我不熟悉新的遵循所有語法,但我想不要過濾器的工作方式相同。

yield scrapy.Request(url, callback=self.parse_games, dont_filter=True)

暫無
暫無

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

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