首页 > 解决方案 > Scrapy/BeautifulSoup 模拟“单击”按钮以加载网站的一部分

问题描述

举一个非常简单的例子,让我们以这个网站为例:https ://www.cardmarket.com/en/Magic/Products/Booster-Boxes/Modern-Horizo​​ns-2-Collector-Booster-Box

如您所见,为了加载更多列表,您需要按几次蓝色的“显示更多结果”按钮。简而言之,有没有办法使用scrapy或beautiful soup“单击”此按钮,以便访问该站点上的所有列表?如果是这样,我该怎么做?如果没有,为了让我能够抓取该网站,有哪些最有效的工具能够做到这一点?我听说过 selenium,但也听说它比 scrapy/beautifulsoup 慢,所以更喜欢使用这两个,或者使用其他工具

标签: pythonseleniumweb-scrapingbeautifulsoupscrapy

解决方案


这似乎是Selenium的一个很好的用例。您可以使用它来模拟浏览器会话,然后根据需要将页面源交给 Beautiful Soup。

尝试这样的事情:

from selenium import webdriver
from bs4 import BeautifulSoup

# Desired URL
url = "https://www.cardmarket.com/en/Magic/Products/Booster-Boxes/Modern-Horizons-2-Collector-Booster-Box"

# create a new Firefox session
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(url)

# Get button and click it
python_button = driver.find_element_by_id("loadMoreButton")
python_button.click() #click load more button

# Pass to BS4
soup=BeautifulSoup(driver.page_source)

如果你想避免硒:

您链接的网站上的“加载更多”按钮正在使用 AJAX 请求加载更多数据。如果您真的想避免使用 Selenium,那么您可以尝试使用该requests库来复制与单击按钮时发出的相同 AJAX 请求。

您需要监视浏览器中的网络选项卡以找出必要的标题。可能需要一些摆弄才能让它恰到好处。

潜在相关:

使用 requests lib 用 python 模拟 ajax 请求


推荐阅读