首页 > 解决方案 > 如何从 2004 Wayback 机器站点上抓取此文本/为什么我运行错误的代码?

问题描述

注意:我之前没有在这里问过问题,并且仍然不确定如何使它清晰易读,所以让我知道任何混淆或提示以使其更具可读性

我正在尝试从 2004/06 到 2004/09 Internet Archive 下载 makeoutclub.com 的用户信息(一个古怪的,现已不存在的社交网络,针对另类音乐迷,创建于 2000 年左右,使其成为Internet 上最古老的基于个人资料的社交网络)使用 r,* 特别是 rcrawler 包。到目前为止,我已经能够使用该包来获取数据框中的用户名和配置文件链接,使用 xpath 来识别我想要的元素,但不知何故,它不适用于配置文件的位置或兴趣部分,两者都只是文本,而不是 html 中的其他元素。对于我正在谈论的站点/数据的想法,这是我一直在给我的 xpath 发短信的页面:https://web.archive.org/web/20040805155243/http://www.makeoutclub。

我一直在使用 rcrawler 的 ContentScraper 函数测试我的 xpath 表达式,该函数从您需要抓取的站点的一个特定页面中提取与指定 xpath 匹配的一组元素。这是我的功能表达式,它标识了网站上的用户名和链接,并指定了我正在使用的特定页面,并返回一个向量:

testwaybacktable <- ContentScraper(Url = "https://web.archive.org/web/20040805155243/http://www.makeoutclub.com/03/profile/html/boys/2.html", XpathPatterns = c("//tr[1]/td/font/a[1]/@href", "//tr[1]/td/font/a[1]"), ManyPerPattern = TRUE)

这是坏的,我正在测试“位置”,最终返回一个空向量

testwaybacklocations <- ContentScraper(Url = "https://web.archive.org/web/20040805155243/http://www.makeoutclub.com/03/profile/html/boys/2.html", XpathPatterns = "//td/table/tbody/tr[1]/td/font/text()[2]", ManyPerPattern = TRUE)

还有一个不好的,这个在“interests”下寻找文字:

testwaybackint <- ContentScraper(Url = "https://web.archive.org/web/20040805155243/http://www.makeoutclub.com/03/profile/html/boys/2.html", XpathPatterns = "//td/table/tbody/tr[2]/td/font/text()", ManyPerPattern = TRUE)

当我尝试在 Chrome Inspect 中搜索它们时,我在这里使用的 xpath 表达式似乎选择了正确的元素,但程序似乎没有读取它们。我也试过为每个字段只选择一个元素,它仍然产生一个空向量。我知道这个工具可以读取这个网页中的文本——我测试了另一段随机文本——但不知何故,当我运行这个测试时,我什么也没得到。我的 xpath 表达式有问题吗?我应该使用不同的工具来做到这一点吗?谢谢你的耐心!

*这是一个数字人文项目,希望使用一些 nlp 来分析特别是关于性别和性的语言,与网站上最受欢迎乐队的歌词的一些 nlp 分析对话。

标签: rxpathweb-crawlerrcrawler

解决方案


一个迟到的答案,但也许它会有所帮助。此外,我不确定整个 TOS 问题,但我认为这是你要弄清楚的。长话短说......我将尝试解决您问题的技术方面;)

我不熟悉 rcrawler-package。通常我使用 rvest 进行网页抓取,我认为这是一个不错的选择。要获得所需的输出,您必须使用类似的东西

# parameters
url <- your_url
xpath_pattern <- your_pattern
# get the data
wp <- xml2::read_html(url)
# extract whatever you need
res <- rvest::html_nodes(wp,xpath=xpath_pattern)

我认为不可能使用具有多个元素的向量作为模式参数,但是您可以为要单独提取的每个模式运行 html_nodes 。

我认为前两个 urls/patterns 应该这样工作。您最后一个网址中的模式似乎是错误的。如果要提取表格中的文本,它可能应该类似于“//tr[2]/td/font/text()[2]”


推荐阅读