使用Infinite Scroll从网站上收集数据?

时间:2019-09-19 23:17:01

标签: python selenium web-scraping beautifulsoup infinite-scroll

我正在尝试为标题和其他项目抓取一个网站,但为了简洁起见,仅是游戏标题。

我曾经尝试过使用硒和漂亮的汤来获得冠军,但是无论我做什么,我似乎都无法获得所有9月份的唱片。实际上,我也获得了一些八月的游戏名称。我认为这与网站无止境的事实有关。我将如何仅获得9月份的冠军头衔?下面是我使用过的代码,我尝试过使用Scrolling,但我认为我不了解如何正确使用它。

编辑:我的目标是最终能够通过更改几行代码来获得每个月的收入。

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个标题,而我将获得一些8月的标题,并且仅获得部分标题:

['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 :(得分:0)

在我看来,为了只获取9月的内容,首先您只想获取9月的部分:

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

然后,当您提取9月的部分时,将获得<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表示加载的每个页面,如果仅查看9月的月份,blockIndex将始终为{{ 1}}在该请求中的挑战是获取下一页的下一个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) ,则我认为可以应用相同的原理,除非它在加载页面时具有滚动功能。 相应地替换SeleniumINITIAL_LINKDATE_CODE也可以使您获得其他几个月的收入。