Python网页抓取 - 当页面通过JS加载内容时如何获取资源?
Posted
技术标签:
【中文标题】Python网页抓取 - 当页面通过JS加载内容时如何获取资源?【英文标题】:Python web scraping - how to get resources with beautiful soup when page loads contents via 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 生成的内容 【参考方案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 中的其他位置
【讨论】:
以上是关于Python网页抓取 - 当页面通过JS加载内容时如何获取资源?的主要内容,如果未能解决你的问题,请参考以下文章
用爬虫抓取网页得到的源代码和浏览器中看到的不一样运用了啥技术?
从零开始学Python-使用Selenium抓取动态网页数据