Очистка данных с веб-сайта с помощью Infinite Scroll? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь очистить веб-сайт от названий и других предметов, но ради краткости, просто названий игр.

Я пытался использовать селен и красивый суп в тандеме, чтобы захватить названия, ноЯ не могу получить все сентябрьские релизы, независимо от того, что я делаю.На самом деле, я также получаю некоторые из августовских игр.Я думаю, что это связано с тем, что веб-сайту нет конца.Как бы я взял только сентябрьские названия?Ниже приведен код, который я использовал, и я пытался использовать прокрутку, но я не думаю, что понимаю, как правильно его использовать.

РЕДАКТИРОВАТЬ: Моя цель - в конечном итоге получить каждый месяц, изменив несколько строккода.

from selenium import webdriver
from bs4 import BeautifulSoup

titles = []

chromedriver = 'C:/Users/Chase The Great/Desktop/Podcast/chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('https://www.releases.com/l/Games/2019/9/')
res = driver.execute_script("return document.documentElement.outerHTML")
driver.quit()
soup = BeautifulSoup(res, 'lxml')

for title in soup.find_all(class_= 'calendar-item-title'):
    titles.append(title.text)

Ожидается, что я получу 133 названия, и я получу несколько названий за август плюс только часть названий как таковых:

['SubaraCity', 'AER - Memories of Old', 'Vambrace: Cold Soul', 'Agent A: A Puzzle in Disguise', 'Bubsy: Paws on Fire!', 'Grand Brix Shooter', 'Legend of the Skyfish', 'Vambrace: Cold Soul', 'Obakeidoro!', 'Pokemon Masters', 'Decay of Logos', 'The Lord of the Rings: Adventure ...', 'Heave Ho', 'Newt One', 'Blair Witch', 'Bulletstorm: Duke of Switch Edition', 'The Ninja Saviors: Return of the ...', 'Re:Legend', 'Risk of Rain 2', 'Decay of Logos', 'Unlucky Seven', 'The Dark Pictures Anthology: Man ...', 'Legend of the Skyfish', 'Astral Chain', 'Torchlight II', 'Final Fantasy VIII Remastered', 'Catherine: Full Body', 'Root Letter: Last Answer', 'Children of Morta', 'Himno', 'Spyro Reignited Trilogy', 'RemiLore: Lost Girl in the Lands ...', 'Divinity: Original Sin 2 - Defini...', 'Monochrome Order', 'Throne Quest Deluxe', 'Super Kirby Clash', 'Himno', 'Post War Dreams', 'The Long Journey Home', 'Spice and Wolf VR', 'WRC 8', 'Fantasy General II', 'River City Girls', 'Headliner: NoviNews', 'Green Hell', 'Hyperforma', 'Atomicrops', 'Remothered: Tormented Fathers']

1 Ответ

0 голосов
/ 20 сентября 2019

Мне кажется, что для того, чтобы получить только сентябрь, сначала вы хотите получить только раздел за сентябрь:

section = soup.find('section', {'class': 'Y2019-M9 calendar-sections'})

Затем, как только вы получите раздел за сентябрь, получите все заголовки, которые находятся в<a> тег, подобный следующему:

for title in section.find_all('a', {'class': ' calendar-item-title subpage-trigg'}):
    titles.append(title.text)

Обратите внимание, что ни один из предыдущих не был протестирован.

ОБНОВЛЕНИЕ: Проблема в том, что каждый раз, когда вы хотите загрузить страницу, она дает вам толькосамый первый раздел, который содержит только 24 элемента, чтобы получить к ним доступ, нужно прокрутить вниз (бесконечная прокрутка).Если вы откроете инструмент для разработчиков браузера, выберите Network, а затем XHR, и вы заметите, что каждый раз, когда вы прокручиваете и загружаете следующую «страницу», появляется запрос с url, подобным следующему:

https://www.releases.com/calendar/nextAfter?blockIndex=139&itemIndex=23&category=Games&regionId=us

Где я думаю, что blockIndex предназначено для месяца, а itemIndex - для каждой загруженной страницы, если вы ищете только для сентября месяца blockIndex всегда будет 139 в этом запросе, задача состоит в том, чтобы получить следующие itemIndex для следующей страницы, чтобы вы могли создать свой следующий запрос.Следующий itemIndex всегда будет последним itemIndex предыдущего запроса.

Я сделал скрипт, который делает то, что вы хотите, используя только BeautifulSoup.Используйте его по своему усмотрению, есть некоторые константы, которые могут быть извлечены динамически, но я думаю, что это может дать вам преимущество:

import json

import requests
from bs4 import BeautifulSoup

DATE_CODE = 'Y2019-M9'
LAST_ITEM_FIRST_PAGE = f'calendar-item col-xs-6 to-append first-item calendar-last-item {DATE_CODE}-None'
LAST_ITEM_PAGES = f'calendar-item col-xs-6 to-append calendar-last-item {DATE_CODE}-None'
INITIAL_LINK = 'https://www.releases.com/l/Games/2019/9/'
BLOCK = 139
titles = []


def get_next_page_link(div: BeautifulSoup):
    index = div['item-index']
    return f'https://www.releases.com/calendar/nextAfter?blockIndex={BLOCK}&itemIndex={index}&category=Games&regionId=us'


def get_content_from_requests(page_link):
    headers = requests.utils.default_headers()
    headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    req = requests.get(page_link, headers=headers)
    return BeautifulSoup(req.content, 'html.parser')


def scroll_pages(link: str):
    print(link)
    page = get_content_from_requests(link)
    for div in page.findAll('div', {'date-code': DATE_CODE}):
        item = div.find('a', {'class': 'calendar-item-title subpage-trigg'})
        if item:
            # print(f'TITLE: {item.getText()}')
            titles.append(item.getText())
    last_index_div = page.find('div', {'class': LAST_ITEM_FIRST_PAGE})
    if not last_index_div:
        last_index_div = page.find('div', {'class': LAST_ITEM_PAGES})
    if last_index_div:
        scroll_pages(get_next_page_link(last_index_div))
    else:
        print(f'Found: {len(titles)} Titles')
        print('No more pages to scroll finishing...')


scroll_pages(INITIAL_LINK)
with open(f'titles.json', 'w') as outfile:
    json.dump(titles, outfile)

, если ваша цель - использовать Selenium, я думаю,тот же принцип может применяться, если у него нет возможности прокрутки при загрузке страницы.Замена INITIAL_LINK, DATE_CODE & BLOCK соответственно даст вам и другие месяцы.

...