【问题标题】:Issues downloading full HTML of webpage with Python使用 Python 下载网页的完整 HTML 时出现问题
【发布时间】:2015-09-25 08:01:29
【问题描述】:

我正在做一个项目,我需要在http://www.nhl.com/ 的当前分数部分中找到的所有游戏 ID # 来下载每个游戏的内容/解析统计信息。我希望能够一次获得所有当前的游戏 ID,但由于某种原因,无论我如何尝试,我都无法下载页面的完整 HTML。我正在使用requestsbeautifulsoup4

这是我的问题:

我确定我感兴趣的特定标签是div,其中 CSS class= 'scrblk'。所以,我写了一个函数来传递给BeautifulSoup.find_all(),特别是给我那个CSS类的块。它看起来像这样:

    def find_scrblk(css_class):
        return css_class is not None and css_class == 'scrblk'

所以,当我在 Firefox 中实际访问网页并保存它,然后在 beautifulsoup4 中加载保存的文件时,我做了以下操作:

>>>soup = bs(open('nhl.html'))
>>>soup.find_all(class_=find_scrblk)
[<div class="scrblk" id="hsb2015010029"> <div class="defaultState"....]

一切都很好,花花公子;我有我需要的所有信息。但是,当我尝试使用我知道的几种自动化方法中的任何一种来下载页面时,它只返回了一个空列表。这是我尝试过的:

  • 使用requests.get() 并将.text 属性保存在文件中
  • 使用requestiter_content()iter_lines() 方法 逐个写入文件的对象
  • 使用wget下载页面(通过subprocess.call()) 并打开生成的文件。对于这个选项,我肯定会使用 --page-requisites--convert-links 标志,所以我下载了(或者我想) 所有必要的数据。

通过以上所有方法,我无法从 HTML 文件中解析出我需要的数据;好像它们没有被完全下载或其他东西,但我不知道那是什么东西或如何修复它。我在这里做错了什么或错过了什么?我在 Ubuntu 15.04 上使用 python 2.7.9。

所有文件都可以在这里下载:

https://www.dropbox.com/s/k6vv8hcxbkwy32b/nhl_html_examples.zip?dl=0

【问题讨论】:

  • 页面使用Javascript和AJAX加载数据。您应该使用浏览器的开发人员控制台来查看请求,也许您可​​以复制它们。当然,您首先需要 nhl.com 的许可才能使用他们的数据。
  • 顺便说一句,鉴于您的情况,摆脱 find_scrblk 功能,只使用 soup.find_all(class_='scrblk')
  • 您需要找出正在发送的请求。您可以手动完成,然后重现它,或者您也可以使用Selenium 来完成。然后你也可以尝试用Scrapy报废。

标签: python html beautifulsoup python-requests


【解决方案1】:

正如您问题中的 cmets 所说,您必须重新考虑您的方法。您在浏览器中看到的不是响应包含的内容。该网站使用 JavaScript 来加载您所需要的信息,因此您应该更仔细地查看结果以找到您要查找的内容。

将来要处理此类问题,请尝试使用 Chrome 的开发者控制台并禁用 JavaScript 并以这种方式打开网站。然后你会看到你是面对 JS 还是网站会包含你正在寻找的值。

顺便说一句,您的行为违反了 NHL 网站的服务条款(根据第 2 节。禁止的内容和活动)

参与未经授权的内容或信息的抓取、抓取或获取,或使用任何其他未经授权的自动化手段来编译信息;

【讨论】:

  • 您好,感谢您的信息。我绝对应该看看他们的服务条款。我想我只需要手动完成那一部分>__>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2015-09-21
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多