Использование Scrapy для симуляции AJAX запросов для сбора разбитых на страницы данных - PullRequest
2 голосов
/ 29 февраля 2020

Я выполняю мини-проект по сбору данных с популярного веб-сайта League of Legends, www.op.gg. Например, если вы go до этой страницы, вы увидите, что есть 10 данные игр показаны справа. Если вы продолжите прокрутку вниз, вы увидите «Показать больше» внизу, в котором будут показаны следующие 20 результатов и т. Д. Когда я проверяю элемент «Показать больше» с помощью инструментов chrome, я вижу следующую запись:

<a href="#" onclick="$.OP.GG.matches.list.loadMore($(this)); return false;" class="Button">Show More</a>

В настоящее время я использую Scrapy для получения нескольких точек данных с таких страниц, и я добился успеха в захват первых 10 игр, которые появляются, но нуждаются в некоторой помощи о том, как продолжать захватывать больше до установленного периода времени (то есть продолжать показывать больше результатов, пока элемент «data-datetime» в каждом классе GameItemWrap не станет 30 днями go от времени выполнения .)

Мой код указан ниже:

import scrapy

class PostsSpider(scrapy.Spider):
    name = "posts"
    start_urls = [
        'https://na.op.gg/summoner/userName=C9+Zven',
        'https://na.op.gg/summoner/userName=From+Iron'
    ]

    def parse(self, response):
        summoner_name = response.css('.SummonerLayout>.Header>.Profile>.Information>.Name::text').get()
        rank_type = response.css('.TierRankInfo .RankType::text').get()
        tier_rank = response.css('.TierRankInfo .TierRank::text').get()   

        game_lists = []
        dict_per_game = {}

        for game in response.css('div.GameItemWrap'):
            dict_per_game['summoner_id'] = game.css('.GameItem::attr(data-summoner-id)').get() 
            dict_per_game['data_game_time'] = game.css('.GameItem::attr(data-game-time)').get() 
            dict_per_game['game_type'] = str.strip(game.css('.Content .GameStats .GameType::text').get())
            dict_per_game['date_time_epoch'] = game.css('.Content .GameStats .TimeStamp ._timeago::attr(data-datetime)').get()
            dict_per_game['game_result'] = str.strip(game.css('.Content .GameStats .GameResult::text').get())
            dict_per_game['champ_name'] = game.css('.Content .GameSettingInfo .ChampionName a::text').get()
            dict_per_game['kill'] = game.css('.Content .KDA .KDA .Kill::text').get()
            dict_per_game['death'] = game.css('.Content .KDA .KDA .Death::text').get()
            dict_per_game['assist'] = game.css('.Content .KDA .KDA .Assist::text').get()
            game_lists.append(dict_per_game)
            dict_per_game = {}

        yield {
            'summoner_name': summoner_name,
            'rank_type': rank_type, 
            'tier_rank': tier_rank, 
            'games': game_lists
        }

        # This is where I would like to add some code to retrieve more results for this profile going back to 30 days ago from runtime
...