【问题标题】:Using Python Requests to simulate clicking a 'show more' button使用 Python 请求模拟单击“显示更多”按钮
【发布时间】:2018-01-09 02:10:54
【问题描述】:

我不确定使用什么代码来单击“显示更多”按钮。我想得到一份正在做某个主题的大学名单。以下是其中一个网站

http://www.sciencedirect.com/science/article/

您的帮助将不胜感激

谢谢

【问题讨论】:

  • 您不能对请求执行此操作。它是客户端 js。
  • 没错,您实际上无法使用requests 单击按钮,但您几乎总是可以使用requests 模拟浏览器-服务器交互并获得所需的信息。这只是找出正确的事情要做的问题......我认为这就是 OP 所要求的。在这种特殊情况下,当您单击按钮并且页面加载时禁用 JS 时没有网络调用。所以信息很可能已经在 DOM 中了。

标签: python web-scraping python-requests


【解决方案1】:

您不必在 Python 中模拟“显示更多”按钮的实际“点击”来完成网络抓取。

网站中的“显示更多”按钮通常与一些 JavaScript 相关联,这些 JavaScript 要么显示 HTML 中已经隐藏的元素(参见 Bootstrap's collapse class 典型示例),要么触发对某些 Web 服务的请求(例如 @987654322 @) 以获取在DOM 中插入的信息。

无论哪种方式,您都可以抓取该数据。对于前者,找到 DOM 中的隐藏元素(查看页面源 [Ctrl + U] 并搜索 HTML [Ctrl + F]),然后使用典型的网络抓取工具。对于后者,当您单击“显示更多”时,请使用 Google 开发工具的“网络”选项卡来检查 API 请求,然后尝试使用 Python 复制该请求。

在您给出的具体示例中,您想要的数据似乎作为 JSON 对象存储在 HTML <script> 标记中。在 HTML 中搜索单词“affiliation”。

【讨论】:

  • 非常感谢您的提示,我的代码最终是这样的。丑但 artLink='sciencedirect.com{}'.format(link) artRes=requests.get(artLink) artSoup=BeautifulSoup(artRes.content,'html.parser') aff=artSoup.find_all('script',{' type':'application/json'}) jdata=json.loads((aff[0].text)) for affNum in jdata['authors']['affiliations']: afflication=jdata['authors']['隶属关系'][affNum]['$$'][1]['_']
  • @R.R 酷!网页抓取本质上有点难看,但你的看起来像是一个简洁的解决方案。我把它贴在这里,这样更易​​读:pastebin.com/pfJwSxAM如果我的答案是正确的,请将其标记为答案!
【解决方案2】:

您必须选择不同的工具才能按下按钮。一种可能的解决方案是 Selenium,它可以告诉浏览器按下按钮。下面的例子点击了显示更多按钮。

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def executeTest():
    global driver
    driver.get('http://www.sciencedirect.com/science/article/pii/S2211926417300024')
    time.sleep(7)
    element = driver.find_element_by_xpath('//*[@id="app"]/div/div/div/section/div/div[2]/article/div[2]/button')
    element.click()
    time.sleep(3)

def startWebDriver():
    global driver
    options = Options()
    options.add_argument("--disable-infobars")
    driver = webdriver.Chrome(chrome_options=options)

if __name__ == "__main__":
    startWebDriver()
    executeTest()
    driver.quit()

【讨论】:

  • 感谢罗恩。我最终从脚本中找到数据。我只是使用 json 来提取它
【解决方案3】:

通过阅读上面 Michael Crenshaw 的回答,我刚刚解决了一个类似的问题。这对我有用:

  1. 加载您要抓取的页面。
  2. 去检查并选择网络。
  3. 现在点击显示更多按钮。

您现在应该在网络选项卡中看到发出请求的确切网址。如果您在页面加载之前不打开网络选项卡会容易得多 - 这样,选项卡中的唯一信息就是您单击显示更多时发出的请求。

然后我在我的代码中添加了几行,如下所示:

page_source = response.text
if "Show More" in page_source:

然后在此之后我添加了我的抓取功能,同时让它遍历 url 结构。这里有一篇关于如何在 scrapy 上执行此操作的好帖子 - https://blog.scrapinghub.com/2016/06/22/scrapy-tips-from-the-pros-june-2016

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-09-17
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多