【问题标题】:How to fix an HTTP 403 error when webscraping in R?在 R 中进行网络抓取时如何修复 HTTP 403 错误?
【发布时间】:2019-12-01 03:24:44
【问题描述】:

我正在尝试收集 3,600 多个 Wikipedia 页面的统计数据以供工作。我正在尝试使用 R 中的网络抓取使其自动化。

直接在 R 中提取 HTML 代码时遇到问题。

download_html("xtools.wmflabs.org/articleinfo/fr.wikipedia.org/1re_Convention_nationale_acadienne")

这是控制台告诉我的:

download_html("xtools.wmflabs.org/articleinfo/fr.wikipedia.org/1re_Convention_nationale_acadienne")
Error in curl::curl_download(url, file, quiet = quiet, mode = mode, handle = handle) : HTTP error 403.

这不起作用的可能原因是什么?

当我将 HTML 保存为文件并通过 R 运行时,一切正常,我可以用结果制作一个数据框:

# ID webpage link first
setwd("C:\\Users\\judit\\Scraping dans R")
webpage <- read_html("HTML_1e.html")
# read_html("https://xtools.wmflabs.org/articleinfo/fr.wikipedia.org/1re_Convention_nationale_acadienne?uselang=fr")


# Statistiques: extraction ----

# Stats: titre
titre <- html_nodes(webpage, ".back-to-search+ a")
titre <- html_text(titre, trim=TRUE)

# Stats: Taille de page
taille <- html_nodes(webpage, ".col-lg-5 tr:nth-child(3) td+ td")
taille <- html_text(taille, trim=TRUE)

# Stats: Total des modifications
mod <- html_nodes(webpage, ".col-lg-5 tr:nth-child(4) td+ td")
mod <- html_text(mod, trim=TRUE)

# Stats: Nombre de redacteurs
red <- html_nodes(webpage, ".col-lg-5 tr:nth-child(5) td+ td")
red <- html_text(red)

# Stats: Evaluation
evaluation <- html_nodes(webpage, ".col-lg-5 tr:nth-child(6) td+ td")
evaluation <- html_text(evaluation, trim=TRUE)

# Stats: Liens vers cette page
liens_vers <- html_nodes(webpage, ".stat-list--group tr:nth-child(2) a")
liens_vers <- html_text(liens_vers, trim=TRUE)

# Stats: Liens depuis cette page
liens_depuis <- html_nodes(webpage, ".col-lg-offset-1 .stat-list--group tr:nth-child(4) td+ td")
liens_depuis <- html_text(liens_depuis, trim=TRUE)

# Stats: Mots
mots <- html_nodes(webpage, ".col-lg-3 tr:nth-child(3) td+ td")
mots <- html_text(mots, trim=TRUE)

wikipedia <- data.frame(titre, taille, red, mod, evaluation, liens_vers, liens_depuis)

非常感谢任何建议! PS:请原谅我在代码中的法语。这是我的第一语言。

【问题讨论】:

  • 我以前在一个特定的网站上遇到过这种情况,我的解释(完全没有受过教育)是该网站认为我是黑客并阻止了我。几分钟后,我能够运行相同的代码,要么永远不会出现 403 错误,要么在不同的 URL 上得到它,我决定不再进一步排除故障。
  • 没错,当我手动完成工作时,打开足够多的页面后,它会要求我登录,因为它认为我是机器人。也许我需要找到一种通过 R 登录的方法?
  • 如果你想在短时间内快速下载大量文件,网站可能会有每秒页面请求数的报价。使用Sys.sleep() 函数在每个页面请求之间添加延迟。如果您使用 0.5 到 1 秒的延迟(可能稍微少一点),它应该可以防止报价违规。
  • @Dave2e,这听起来像是解决此问题的绝佳通用解决方案。你愿意把它写下来作为答案吗?几个月前,这个答案对我正在处理的一些代码真的很有帮助:-)
  • @Dave2e 感谢您的提醒!我还没有开始一次在超过一页上运行代码,但我相信当我开始使用它时这会很有用。

标签: html css r xml


【解决方案1】:

对于那些还希望从 Wikipedia 页面提取数据的人,我发现了一些软件包,它们可以通过直接从 R 获取我的数据来帮助我规避 403 问题。

我使用以下软件包:

  • 维基百科R
  • 维基百科R

这是我收集文章基本信息的代码:

# Basic information ----

library("WikipediR")

pageinfo <- page_info(language = "fr", 
                      project = "wikipedia", 
                      page = "1re Convention nationale acadienne",
                      properties = c("url"),
                      clean_response = T)

pageinfo_df1=data.frame(pageinfo)
pageinfo_df2=data.frame(id=pageinfo_df1$pageid, title=pageinfo_df1$title, lang=pageinfo_df1$pagelanguage, sizeBytes=pageinfo_df1$length, url=pageinfo_df1$fullurl)

然后为了收集可以通过 XTools 获得的一些特定数据,我现在使用编码直接从 Wikipedia 获取数据,如下所示:

# Links from this article
links_page <- links(page = "1re Convention nationale acadienne", domain = "fr")
links_page_df <- as.data.frame(links_page$links)
nrow(links_page_df)

在网页抓取时如果不出现 403 或 404 错误,则很难收集一些数据。由于这只是我在 R 中的第二个项目,我可能会更改我正在收集的数据,以便更容易找到数据。

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 2021-12-15
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2022-12-18
    • 2020-09-22
    相关资源
    最近更新 更多