第一个爬虫

with rvest 包

爬取梧桐果网页关于企业的行业分类信息

输入:企业名

输出:企业行业分类

1.基本信息

任务描述:给200家公司做行业分类,200家公司的名字存在.csv文件中

逻辑:在红框处依次输入公司名,再截取其分类信息

网页描述:基本url: http://www.wutongguo.com/industry/?txtCompany=


红框处输入“公司名”

2.观察规律

红框处输入公司名(eg:中国建筑),url相应变化为


,第一层次网页,“中国建筑”搜索页面

新url中,%D6%D0%B9%FA%BD%A8%D6%FE 为“中国建筑”的gbk转码而非utf-8转码

注意:gbk转码与utf-8转码结果十分相似,不要搞混

3.进一步深入

此时发现网页中仍然没有相应的行业分类信息,需要进一步点击“中国建筑”处的链接

结果如下,出现了待爬信息:“所属行业:建筑/建材/工程”

第二层次网页,公司主页


4.具体过程

a.转码与第一级url列表

描述:

将.csv文件中储存的公司名字转换成gbk编码,以将该编码与base_url “http://www.wutongguo.com/industry/?txtCompany=”组合,形成待访问网页列表uurl_1,其中该urrl_1是一个数组,每一个cell储存一个公司名称所对应的第一层次搜索结果页的url。

实现:

本来准备用RCurl::curlEscape()函数来实现汉字的转码,但该函数只能实现utf-8转码。也即url地址中包含中文时,可以用该函数转码,否则不能。实际上用了一个网站http://www.atool.org/urlencode.php 来进行汉字到gbk的转码。并且只能一次性复制粘贴全部公司名称进行转换,得到全部公司名的gbk转码,以%0D%0A(换行符的gbk转码)。于是需要首先将得到的全部转码存为.txt文件,再导入R存为gbk对象,并用unlist(strsplit(char object,分隔符,fixed=T/F))的函数组合进行分割。注意strsplit只接受character对象进行分割,故需要将读入的.txt文件转化为character类型对象。代码如下:

gbk <- read.table("C:/Users/LEON/Desktop/gbk.txt", quote="\"", comment.char="")

gbk<-as.character(gbk[1,1])

gbk_list<-unlist(strsplit(gbk, "%0D%0A", fixed = TRUE))

uurl_1列表的构造用paste()函数实现。paste(a,b,c,...,sep="sep char")。a、b、c等对象为待拼接对象,sep为分隔符,若无缝连接,应设为“”。代码如下

base_url<-"http://www.wutongguo.com/industry/?txtCompany="

uurl_1<-paste(base_url,gbk_list,sep = "")

b.开始爬虫及rvest结构

逻辑与结构

html

首先read_html(网页地址url,编码方式encoding=“”)读取该网页全部内容,并将其储存为一个XML类型对象,命名为wweb

node

其次html_node(wweb,css or xpath)从该XML对象(储存该网页全部信息)选取一个特定node类型对象,而我们想要爬取的对象就储存在该node对象中exactly。

那么问题来了,怎么才能知道所需信息所属的node名。我们使用selectorgadget在线chrome拓展工具即可知道

得到待爬取信息的node名

我们需要的其二级链接的信息就保存在这个名为.insutryName的node里面。接着查看该node的结构以确定二级url的在该node的哪个位置。

可发现该url存在href中

attributes

通过html_attr(node,attr_name)来得到该node的特定attributes

再将得到的二级url与其base url拼接,得到新的二级url列表uurl_2

实现代码如下:

uurl_2<-array(NA,200)

for (i in 1:1) {

wweb_1<-read_html(uurl_1[i],encoding = "GB18030")

node_1<-html_node(wweb_1,".industryName")

uurl_2[i]<-html_attr(node_1,name = 'href')

uurl_2[i]<-paste("http://www.wutongguo.com",as.character(uurl_2[i]),sep = "")

html_text

html_text可以截取node中的text信息,不需要知道其具体位置

以此实现第二层爬虫,逻辑类似,代码如下:

Ind_list<-array(NA,200)

for (i in 100:200) {

if(uurl_2[i]!='http://www.wutongguo.comNA'){

wweb_2<-read_html(uurl_2[i],encoding = "GB18030")

node_2<-html_node(wweb_2,".brandInd")

Ind_list[i]<-html_text(node_2) }}

当没有搜索结果相匹配时,uurl_2[i]包括NA,该url无效,应避免访问以免程序报错

你可能感兴趣的:(第一个爬虫)