【问题标题】:Unable to automate web-scraping process with rvest and follow_link无法使用 rvest 和 follow_link 自动化网络抓取过程
【发布时间】:2021-03-05 00:52:09
【问题描述】:

我的主管和我正在撰写一篇关于罗德岛室内性工作暂时去罪化的影响的研究论文。作为我们数据收集的一部分,我们正在尝试从 theeroticreview.com 中获取有关性工作者特征、平均价格和其他一些数据的数据。手动输入的配置文件太多了,所以我正在尝试编写一个 R 脚本来自动化该过程。

目前,我的代码如下所示:code。如您所见,我必须分别为每个配置文件输入每个名称,否则我会收到“没有链接有文本”错误。有 2000 个观测值。 Xpath 在格式方面表现不佳。

##Set Main Page 
TER <- html_session("https://www.theeroticreview.com/reviews/newreviewsList.asp?searchreview=1&gCity=region1%2Dus%2Drhode%2Disland&gCityName=Rhode+Island+%28State%29&SortBy=3&gDistance=0")
##Locate and follow link to profile
reviews <- TER %>% follow_link('Ashley')
## extract required information
reviews %>% html_nodes('h1') %>% html_text()
##back to main page 
rhea <- reviews %>% back()
revieww <- TER %>% follow_link("Lily")
revieww %>% html_nodes('h1') %>% html_text()
rhea <- revieww %>% back()
reviewa <- TER %>% follow_link("Coco")
reviewa %>% html_nodes('h1') %>% html_text()
rhea <- reviewa %>% back()
##Move to Next Page 
TER %>% jump_to('https://www.theeroticreview.com/reviews/newreviewsList.asp?Valid=1&mp=0&SortBy=3&searchreview=1&gCity=region1-us-rhode-island&gDistance=0&gCityName=Rhode%20Island%20(State)&page=2')
TER2 <- html_session('https://www.theeroticreview.com/reviews/newreviewsList.asp?Valid=1&mp=0&SortBy=3&searchreview=1&gCity=region1-us-rhode-island&gDistance=0&gCityName=Rhode%20Island%20(State)&page=2')
reviewd <- TER2 %>% follow_link('Danielle')
reviewd %>% html_nodes('h1') %>% html_text()

在网站的 HTML 中,每个链接都是 td-name。有什么方法可以编写算法/编写函数代码,使这个过程自动化吗?

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    首先,确保您在抓取这些数据时没有违反网站的服务条款,尤其是在您计划发布基于这些数据的研究时。

    我认为您不需要无头浏览器来获得所需的内容,如果您可以避免使用无头浏览器,那么您应该这样做。下面是一段代码,可以为您提供与每个配置文件相关联的链接。

    profile_url_lst <- list()
    for(page_num in 1:73){
      
      main_url <- paste0("https://www.theeroticreview.com/reviews/newreviewsList.asp?searchreview=1&gCity=region1%2Dus%2Drhode%2Disland&gCityName=Rhode+Island+%28State%29&SortBy=3&gDistance=0&page=", page_num)
      
      html_content <- read_html(main_url)
      
      profile_urls <- html_content %>% html_nodes("body") %>% html_children() %>% html_children() %>% .[2] %>% html_children() %>% 
        html_children() %>% .[3] %>% html_children() %>% .[4] %>% html_children() %>% html_children() %>% html_children() %>% 
        html_attr("href")
      
      profile_url_lst[[page_num]] <- profile_urls
    
    }
    

    这工作了几页。我还没有运行整个循环。您可能还想在循环末尾包含Sys.sleep(2),以免压倒他们的服务器。我会更深入地搜索这个网站,但我的电脑在窗户旁边,我不想给邻居留下错误的印象。

    【讨论】:

    • 非常感谢!这会抓取 URL。如果我将列出的个人资料 URL 与 follow_link 工具结合起来,然后从个人资料中抓取数据,那会是什么样子?
    • html_content %&gt;% html_nodes('.ter-table a') %&gt;% html_attr('href') 不会更简单、更健壮吗?
    • 是的,这似乎工作得很好。 @thenotsopolitecanadian,我会避免使用 follow_link 工具。相反,根据您收集的链接创建一个循环遍历配置文件 url。在每次迭代中,直接从每个个人资料页面收集您需要的任何内容。
    • 这是有道理的,但它的代码是什么样的?我的基本 URL 是搜索结果的页面,我需要它进入配置文件,从中提取,然后继续到下一个结果/配置文件并执行相同的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多