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无效,应避免访问以免程序报错
网友评论