【问题标题】:Python web scraping - how to get resources with beautiful soup when page loads contents via JS?Python网页抓取 - 当页面通过JS加载内容时如何获取资源?
【发布时间】:2015-06-27 12:32:45
【问题描述】:

所以我正在尝试使用 BeautifulSoup 和 urllib 从特定网站上抓取表格。我的目标是从此表中的所有数据创建一个列表。我曾尝试使用其他网站的表格使用相同的代码,并且效果很好。然而,在这个网站上尝试它时,该表返回一个 NoneType 对象。有人可以帮我弄这个吗?我曾尝试在网上寻找其他答案,但运气不佳。

代码如下:

import requests
import urllib

from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib.request.urlopen("http://www.teamrankings.com/ncaa-basketball/stat/free-throw-pct").read())

table = soup.find("table", attrs={'class':'sortable'})

data = []
rows = table.findAll("tr")
for tr in rows:
    cols = tr.findAll("td")
    for td in cols:
        text = ''.join(td.find(text=True))
        data.append(text)

print(data)

【问题讨论】:

  • 您查看过此页面的 html 吗?没有桌子……
  • 如果您右键单击表格并点击“检查元素”,它会显示带有表格的 html。如果您右键单击页面上的其他任何位置,它将不会显示它。
  • 您必须向 Selinium 发出完整的浏览器请求才能获得通过 AJAX/JS 生成的内容

标签: python beautifulsoup screen-scraping urllib


【解决方案1】:

看起来这些数据是通过 ajax 调用加载的:

您应该改为定位该网址:http://www.teamrankings.com/ajax/league/v3/stats_controller.php

import requests
import urllib

from bs4 import BeautifulSoup


params = {
    "type":"team-detail",
    "league":"ncb",
    "stat_id":"3083",
    "season_id":"312",
    "cat_type":"2",
    "view":"stats_v1",
    "is_previous":"0",
    "date":"04/06/2015"
}

content = urllib.request.urlopen("http://www.teamrankings.com/ajax/league/v3/stats_controller.php",data=urllib.parse.urlencode(params).encode('utf8')).read()
soup = BeautifulSoup(content)

table = soup.find("table", attrs={'class':'sortable'})

data = []
rows = table.findAll("tr")
for tr in rows:
    cols = tr.findAll("td")
    for td in cols:
        text = ''.join(td.find(text=True))
        data.append(text)

print(data)

使用您的网络检查器,您还可以查看随 POST 请求一起传递的参数。

通常,另一端的服务器会检查这些值,如果您没有其中的部分或全部,则拒绝您的请求。上面的代码 sn-p 对我来说运行良好。我切换到urllib2,因为我通常更喜欢使用那个库。

如果数据在您的浏览器中加载,则可以抓取它。您只需要模仿浏览器发送的请求即可。

【讨论】:

  • 请注意,您需要使用其代码使用的参数集发布到此 url
  • @FarmerJoe 谢谢,但不幸的是我不能使用 urllib2,因为我正在使用 Python3.4。我可以不使用 urllib2 吗? (urlencode 不是 urllib 的属性,所以我不确定该使用什么)
  • @QwErTy99 我改了代码,现在应该可以在 python3 上运行了。
  • urllib.parse.urlencode(params).encode('utf8') 应该会修复该崩溃
  • @Eric 成功!像我想要的那样工作。谢谢!
【解决方案2】:

该网站上的表格是通过 javascript 创建的,因此当您将源代码扔到 BeautifulSoup 时,该表格并不存在。

您需要开始使用您选择的网络检查器,找出 javascript 从哪里获取数据 - 或者您应该使用类似 selenium 的东西来运行完整的浏览器实例。

【讨论】:

  • 如果表格是用 Javascript 编码的,我将如何获取表格?抱歉,我似乎很幼稚,但我对编码比较陌生。
  • 这是正确的,当您通过美汤请求该页面的资源时;你只会得到样板页面。然后该资源上的代码,稍后通过 javascript 将数据获取到 api。
  • @QwErTy99 你需要一个无头浏览器。查看jeanphix.me/Ghost.py
【解决方案3】:

由于表格数据是动态加载的,由于网络延迟等多种原因,更新表格数据会有一些延迟。因此,您可以通过延迟并读取数据来等待时间。 检查表数据,即长度是否为空,如果是,则在延迟一段时间后读取表数据。这会有所帮助。

查看了您使用的网址。由于您正在为表使用类选择器。确保它存在于 HTML 中的其他位置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多