使用for循环梳理webscraping

时间:2017-09-22 03:59:33

标签: r for-loop rvest

我一直在抓取并组合多个数据集,但是,我觉得我的方法可以更有效率,目前卡住了。
我最初的方法是单独下载每个数据集,并使用rbind()创建一个大型数据集:

library(tidyverse)
library(rvest)

uber <- read_html("http://h1bdata.info/index.php?em=Uber&job=&city=&year=All+Years") %>%
  html_node("#myTable") %>%
  html_table()

airbnb <- read_html("http://h1bdata.info/index.php?em=Airbnb&job=&city=&year=All+Years") %>%
  html_node("#myTable") %>%
  html_table()

rbind(uber, airbnb)

然而,超过十个数据集,这可能是乏味和低效的。所以我尝试编写一个循环,到目前为止我有以下内容:

#I created a list of the tech companies for my loop index
tech.companies <-as.list(c("Airbnb", "Amazon", "Apple", "Facebook", "Google", "Linkedin", "Microsoft", "Twitter", "Uber", "Yahoo"))

#I then create the loop.  This has been my "best" attempt
for(i in 1:length(tech.companies)) {
  url <- paste0("http://h1bdata.info/index.php?em=", i, "&job=&city=&year=All+Years")
  tble <- read_html(url) %>%
    html_node("#myTable") %>%
    html_table()
  }

但是,我并不真正理解我的循环在做什么。什么是输出?如何将每个循环的结果存储在一个新变量中?是否可以使用rbind()来组合循环内的数据集?我阅读了很多应用函数更好地在R中循环使用,在这样的情况下仍然如此吗?

您可以分享的任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

一般情况下,我尽可能避免使用R中的印模循环。然而,在这种情况下,我更喜欢使用循环,但原因可能是我开始在Matlab中编码(循环更常见)。如果您坚持应用函数(我无法提供性能基准),则可以预定义,例如您在每个循环迭代中预先在列表中生成的所有URL /参数,编写抓取函数并运行[s] apply [list,myfun()]

要存储循环的结果,您可以使用list或rbind,每个循环使用一个temp var,使用一个“final”var,通过迭代迭代所有临时变量迭代。

在你的情况下,我会找一份清单,因为你显然希望每个雇主有一张桌子。一行一行(例如,如果你试图逐项刮取商品价格)在这种情况下我没有必要(开放供讨论)

循环本身与您期望的有些不同。

迭代参数import pandas as pd import numpy as np df = pd.read_csv('test_dataset.csv') df.head(3) one_column = df.iloc[:,0] one_column.head(3) 仅返回一个数字,而不是向量中的char值。所以“i”返回一个向量1:10(10个雇主),这意味着你在i in 1:length(x)循环中创建的url不会插入公司名称,只会插入迭代次数(1:10) 。在下面的代码中,您将看到如何使用“url <- paste0()”检索向量“tech.companies”的第i个元素来获取正确的URL

tech.companies[i]

然后,您可以访问结果data.frames,例如使用以下代码:

tech.companies <- c("Airbnb", "Amazon", "Apple", "Facebook", "Google", "Linkedin", "Microsoft", "Twitter", "Uber", "Yahoo")
result <- list() # init list (so R knows you store tble in a list)

for(i in 1:length(tech.companies)) {
   url <- paste0("http://h1bdata.info/index.php?em=", tech.companies[i], "&job=&city=&year=All+Years")
   tble <- read_html(url) %>%
      html_node("#myTable") %>%
      html_table()

   result[[i]] <- tble 
}