【问题标题】:Why can't I extract links from a webpage using a standard code?为什么我不能使用标准代码从网页中提取链接?
【发布时间】:2020-06-08 13:35:25
【问题描述】:

我正在做一个项目,目前需要从拍卖行网页中提取所有链接。但是,下面提供的标准代码仅适用于其中之一 (https://www.phillips.com/auctions/past)。对于苏富比,代码不返回任何内容 (https://www.sothebys.com/en/results),对于佳士得,它返回无法使用的奇怪链接,因为它们会导致错误 (https://www.christies.com/Results/)。

from bs4 import BeautifulSoup, SoupStrainer
import requests

url = "https://www.sothebys.com/en/results"

page = requests.get(url)    
data = page.text
soup = BeautifulSoup(data)

for link in soup.find_all('a'):
    print(link.get('href'))

这些网站可能存在什么问题,或者我可以使用哪些替代方法?

【问题讨论】:

  • 一些网站在页面加载后使用 JavaScript 创建 HTML 元素。要抓取这些网站,您需要先评估 JavaScript。我相信 Selenium 能够做到这一点。

标签: python html parsing web-scraping beautifulsoup


【解决方案1】:

有时您必须在请求中添加标头,以便网站可以返回一些内容。 Check this response。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我注意到你正在试图刮苏富比。

    对于这个特定的网站,您有两个问题:

    1. 进入您的浏览器开发者选项并禁用 javascript。你会注意到,几乎什么都没有显示。几乎所有的内容都是使用 javascript 加载的。 Beautifulsoup 不执行 javascript,所以对于 beautifulsoup,页面几乎是空的。正如@Carcigenicate 所说,一种选择是使用像 selenium 这样的无头浏览器。 Selenium 将像浏览器那样执行 javascript 并加载页面。 (菲利普斯和佳士得也是如此)

    2. 苏富比使用无限滚动。这意味着并非所有内容都会立即加载。例如,如果您正在查看搜索结果,则只会立即加载前 15 个结果。仅当您滚动到页面末尾后,才会加载接下来的 15 个。您可以自动化 selenium 向下滚动到页面的最后,以便加载所有内容。或者,您可以查看幕后的 API,或许可以找到直接从 API 请求数据的方法。

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 2011-04-14
      • 2019-04-12
      • 2023-03-18
      • 2011-07-04
      • 2014-10-27
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多