R rvest抓取产品市场价格,对有不同列的表格进行统一抓取

rvest爬取表格,这个之前操作过简单的,也就是用html_table(fill=T)丝毫没有技术含量,1+1的感觉,但是这次用到了循环语句和判断语句,这对我来说有点难度,所以做出来还挺有成就感的。

1.首先判断网页链接形式,发现每个网页都是放在同一个链接下,也就是说这个网站隐藏了实际的链接,需要用F12进行查找


可根据上面截图,判断出真正的链接,得到链接后总结规律,结果发现链接没规律,那就需要下载全部链接。

2.下载链接的方法(代码)
```{r}
library(rvest)
library(data.table)
library(dplyr)
library(stringr)
ts<-data.frame()
i<-1:67
for (i in 1:67)
{
tdist<-read_html(str_c("http://58.49.94.60/chinaData/template/zhsjdjmh/list.jsp?categoryId=1201308281158540004&pageNum=",i), encoding = 'utf-8')
t1<-tdist %>%html_nodes(".box_02 .topline td a")%>%html_attr("href")
t1<-data.frame(t1)
ts<-rbind(ts,t1)
}
write.csv(ts,"D:/121212.csv")
```

3.得到链接后,就要最关键的一步,对不同列的表格进行统一抓取。
对Error:argument is of length zero
Error:(list) object cannot be coerced to type 'double'的处理

```{r}
library(rvest)
library(data.table)
library(dplyr)
library(stringr)
library(XML)
ts<-data.frame()
ts1<-data.frame()
ts2<-data.frame()
con <- file("D:/321000.csv", "r")
line=readLines(con,n=1)
i<-1:1200
for (i in 1:1200)
    {
      tbls<-readHTMLTable
      tbls<-readHTMLTable(line)
      sapply(tbls,nrow)
      t<-sapply(tbls,ncol)
      t<-unlist(t[13])
      as.numeric(t)
      mode(t)
      if(length(t)!= 0)
      {
         if (t==5)
         {pop<-readHTMLTable(line,which = 13)
          t1<-data.frame(pop)
          ts<-rbind(ts,t1)}
        else
         {t1<-data.frame(line)
          ts1<-rbind(ts1,t1)}
       }
      else
      {t2<-data.frame(line)
      ts2<-rbind(ts2,t1)}
      line=readLines(con,n=1)
    }
write.csv(ts2,"D:/OPQwe19.csv")
write.csv(ts1,"D:/OPQ19.csv")
write.csv(ts,"D:/zxc19.csv")
```

以上就是整个逻辑,这样会有点麻烦,但处理了意外的两种情况:1)批量抓取不同列数的表格;2)对于列数不能体现或者为空值或零,进行处理,最终得到全部数据。

以上就是对表格抓取的方法。

猜你喜欢

转载自blog.csdn.net/weixin_41725746/article/details/80384690
R:
R
今日推荐