【问题标题】:Scrape "Script part" of a javascript rendered website in Python用 Python 抓取 javascript 呈现的网站的“脚本部分”
【发布时间】:2018-07-01 17:47:05
【问题描述】:

我正在制作一个项目,希望在 Reddit 上的各个子版块上查看用户的平均业力。因此,我正在收集用户业力,这对于新的 reddit 结构来说有点困难。

我无法使用 PRAW,因为那里的业力数字不正确。

根据用户的页面来源,我只需要找到以下两个变量:commentKarma 和 postKarma。这两个变量都可以在“”部分下找到,请参见此处的示例 view-source:https://www.reddit.com/user/loganb3171。但是,当我使用 selenium page_source 或 beautifulsoup 时,它们不会出现。

我已经解决这个问题几个小时了,但我离它还很远。

感谢所有帮助。

这些 sn-ps 中的任何一个都不会给我在右键单击“查看页面源”时获得的整个页面源

source_var = driver.execute_script("return document.getElementsByTagName('html')[0].innerHTML")

source_var=driver.page_source

【问题讨论】:

  • 请包含您目前无法使用的相关代码。这可能会帮助别人帮助你。
  • 这不是一个精确的解决方案,而是一个建议。最近刷了一下reddit,发现老版网站比新版的爬起来简单多了,新版严重依赖JavaScript。例如,您发布的链接的旧版本是old.reddit.com/user/loganb3171,您可以在名称下方看到用户的业力。我会尝试将其从新站点上删除,但请记住这一点,除非有特定原因您不想删除旧站点。还要记住在抓取时使用标题,因为 reddit 讨厌机器人。
  • 是的,问题是我确信他们很快就会强制每个人都使用新网站,而且我不希望我的代码工作一周,因为这个项目需要大约 6 个月才能完成

标签: python selenium


【解决方案1】:

好的,所以我看到您在问题中使用了来自 sn-p 的硒。如果是这种情况,则无法使用 Web 驱动程序设置请求标头。 Reddit 会知道你是机器人。

如果只需要页面源,可以使用requests获取页面并用selenium打开或者使用BeautifulSoup解析页面

from bs4 import BeautifulSoup
import requests

url = "https://www.reddit.com/user/loganb3171"
page = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(page.text, 'html.parser')

print(soup.prettify())

【讨论】:

  • 太棒了,这似乎有效。我有一个后续问题,你说:好的,所以我看到你在问题中使用了来自 sn-p 的 selenium。如果是这种情况,则无法使用 Web 驱动程序设置请求标头。 Reddit 会知道你是机器人。这是为什么呢?
  • @J.Doe 这是因为每当您向服务器发送请求时,服务器都会读取请求的标头以查看谁在发送请求,或者请求来自什么。如果您不手动将标头设置为看起来有点像浏览器的标头,Reddit 将假定请求来自机器人,它确实如此。
  • 我明白了,但我不能只更改 selenium 的标题吗?我自己也用 selenium 浏览?
  • Selenium 使用 Web 驱动程序来实现 Web 浏览器的自动化。当您使用 Web 驱动程序时,浏览器本身就是原始浏览器的变异副本。如果您使用的是 chrome Web 驱动程序,它在技术上称为无头 chrome。 Selenium 旨在自动化测试您自己的 Web 服务器。从本质上讲,无头 chrome 的请求没有任何标头。由于您通过网络驱动程序(无头 chrome)发送请求,因此它不会包含任何标头。您可以通过使用添加标头的代理来解决此问题,但这并不可靠,而且解决方案相当长。
  • 非常感谢!您是否有关于使用代理的起点?原因是我也使用 selenium 作为我自己的浏览器,因为我更容易将我的 IP 代理更改为另一个国家
猜你喜欢
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2019-06-15
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多