【问题标题】:Script cannot fetch data from a web page脚本无法从网页中获取数据
【发布时间】:2019-05-30 08:27:01
【问题描述】:

我正在尝试用 Python 编写一个程序,该程序可以获取股票名称及其价格并打印出来。但是,当我运行它时,没有打印任何内容。从网站获取数据似乎有问题。我仔细检查了网页的路径是否正确,但由于某种原因,文本不想显示。

from lxml import html
import requests
page = requests.get('https://www.bloomberg.com/quote/UKX:IND?in_source=topQuotes')
tree = html.fromstring(page.content)
Prices = tree.xpath('//span[@class="priceText__1853e8a5"]/text()')
print ('Prices:' , Prices)

here is the website I am trying to get the data from

我试过 BeautifulSoup,但也有同样的问题。

【问题讨论】:

  • 嗨,Adam,网站可能有动态 html,在这种情况下,您必须使用 selenium。
  • 检查page 返回的内容,但看起来@JuanC 是正确的,requests 返回来自服务器的响应,要求您选中一个框以确认您不是机器人
  • Bloomberg 不希望您抓取该网站,因为他们想强迫人们使用他们的api。如前所述,您可以使用像 Selenium 这样的浏览器自动化来通过浏览器而不是 Web 请求访问站点元素
  • 如果您知道如何使用 Chrome 检查工具,您可以直接使用浏览器中的克隆标头定位 AJAX api。
  • 是的,我正在阅读硒。如果我将来需要它,我会为自己保留它的书签。谢谢大家的帮助

标签: python html web-scraping python-requests lxml


【解决方案1】:

如果您打印字符串page.content,您会看到它捕获的网站代码实际上是用于验证码测试,而不是您手动访问网站时看到的“真实”目标页面本身。该网站似乎足够聪明,可以看到您对该 URL 的请求来自脚本,而不是人工手动,并且它有效地阻止了您的脚本抓取任何真实内容。所以Prices 是空的,因为在这个特殊的验证码页面上根本没有"priceText__1853e8a5" 类的span 标签。当我尝试使用 urllib2 抓取时,我得到了同样的结果。

正如其他人所建议的那样,Selenium(实际的网络自动化)可能能够启动页面并为您提供所需的内容。 ID 看起来是动态生成的,尽管当我手动查看页面时确实得到了相同的 ID。另一种选择是简单地找到一个不同的站点,该站点可以为您提供所需的报价而不会阻止您的脚本。我用https://tradingeconomics.com/ukx:ind 试过了,效果很好。当然,您需要不同的 xpath 才能找到所需的单元格。

【讨论】:

  • 是的,我只是在阅读硒。值得庆幸的是,它正在另一个我刚刚尝试过使用类似数据的网站上工作,但仅限于名称,因为价格会不断更新。我不一定需要从这个特定网站上获取价格。我只是在这个网站上测试它,因为它是第一个弹出的。我将这个程序用于显示财务数据的网站,但它每天只更新一次。我将假设我正在制作的程序可以在这个网站上运行。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多