【问题标题】:Scraping Reddit using Nokogiri (429 too many requests)使用 Nokogiri 抓取 Reddit(429 太多请求)
【发布时间】:2016-08-16 18:10:22
【问题描述】:

我正在尝试用 Nokogiri 抓取 Reddit,但运行一次就一直告诉我我提出了太多请求。

require 'nokogiri'
require 'open-uri'
url = "https://www.reddit.com/r/all"
redditscrape = Nokogiri::HTML(open(url))

OpenURI::HTTPError: 429 Too Many Requests

这不是只有一个请求吗?如果不是,如何为 Nokogiri 创建睡眠间隔?

【问题讨论】:

  • 您将代码中 Nokogiri 的目的与 OpenURI 的目的混淆了。 OpenURI 建立连接,然后将其传递给 Nokogiri 进行读取,因此您的问题与 Nokogiri 无关,不应该这样标记。这是一个 OpenURI 问题,应该进行编辑以反映这一点。

标签: ruby-on-rails ruby open-uri


【解决方案1】:

Reddit 有一个 API

您可能会查询 API 以获取您想要抓取的特定子 reddit。考虑到高容量和嵌套的 cmets,试图刮掉所有 Reddit 似乎是一场等待发生的噩梦。

看起来 Reddit 正在阻止抓取功能以支持使用他们的公共 API

【讨论】:

  • 不应该只从相关页面中提取所有 html 数据吗?这只是首页。评论只是链接。
  • 您是否只想获取hot 主题?或者你真的只想要每个子reddit的名字吗?在不知道您要完成的工作的情况下,很难给出最佳答案。要回答您的第一个问题,理论上 nokogiri 应该返回该页面的 HTML。
  • Reddit 可能正在阻止 open-uri 使用的用户代理。它只是返回 429,表示我们期望 0。
  • @Vangel 我正要打字哈哈。看起来 youtube 不久前也上了那列火车,以便将用户吸引到他们的 API。无论如何,当网站提供 API 时,从开发人员的角度来看,使用 API 比使用抓取更有意义。
  • 把它写成我的答案,这样我就可以将它标记为已解决!编辑:对不起,我的意思是添加你不能使用的 nokogiri 部分
【解决方案2】:

真正的答案是您需要设置一个用户代理。

https://www.reddit.com/r/redditdev/comments/3qbll8/429_too_many_requests/

How to set a custom user agent in ruby

这让我可以使用 open-uri 和 nokogiri 并避免错误。

总结一下:

redditscrape = Nokogiri::HTML(open(url, 'User-Agent' => 'Nooby'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多