python - Scrapy/BeautifulSoup 模拟“单击”按钮以加载网站的一部分
问题描述
举一个非常简单的例子,让我们以这个网站为例:https ://www.cardmarket.com/en/Magic/Products/Booster-Boxes/Modern-Horizons-2-Collector-Booster-Box
如您所见,为了加载更多列表,您需要按几次蓝色的“显示更多结果”按钮。简而言之,有没有办法使用scrapy或beautiful soup“单击”此按钮,以便访问该站点上的所有列表?如果是这样,我该怎么做?如果没有,为了让我能够抓取该网站,有哪些最有效的工具能够做到这一点?我听说过 selenium,但也听说它比 scrapy/beautifulsoup 慢,所以更喜欢使用这两个,或者使用其他工具
解决方案
这似乎是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 请求。
您需要监视浏览器中的网络选项卡以找出必要的标题。可能需要一些摆弄才能让它恰到好处。
潜在相关:
推荐阅读
- apexcharts - Apexcharts - 启用缩放图标时条形图被切断
- android - React Native Android 应用程序在 Facebook 登录/取消时崩溃
- javascript - 使视频填充屏幕宽度并删除框架
- java - 如何从 Java 的 JDI 中隐藏变量?
- javascript - Tampermonkey 在 YouTube 上运行加载和注入代码
- laravel-livewire - 我为 livewire / alpine 应用程序搜索用户空闲插件/决策
- php - 试图理解 php mysqli multi_query
- html - 我无法将样式链接到 Sublime Text 中的 html
- javascript - 即使我有一个数组,map 也不是一个函数
- c# - 单个 Observable Collection 的多个 Refreshable CollectionViewSources