查看原文
其他

用R抓取拉手网深圳地区的美食数据--增加商店地址信息

2016-10-30 谢佳标 R语言中文社区

       自从上次在中大会场分享完RCurl爬虫和Shiny包的相关演讲后,有很多同学对这部分的内容很敢兴趣,昨晚有个同学问我演讲中提到的爬团购网数据的例子,按照代码尝试自己去抓商家地址和销售数量时却出错了。今天中午抽空重写了上次演讲内容的代码,增加了商家地址这部分信息,并力求代码的精简。

原文章:

首先拿深圳拉手网第一页做研究:http://shenzhen.lashou.com/cate/meishi

url1='http://shenzhen.lashou.com/cate/meishi'
web=readLines(url1,encoding='UTF-8')

查看抓取下面网页的关键信息,截图如下:


接下来要用正则表达式去抓取商家地址、商家名称、商家描述、折扣价和原来价格等信息。(因有些未有销售数量的商家是没有number描述,故在次先不研究销售数量。

如下面截图的商家因销售数量为0,故网页源码没有number统计:


接下来,利用正则表达式抓取团购网各商家名称,代码如下:

goods_name<-web[grep("goods-name",web)]

[1] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/8095699.html\" target=\"_blank\" title=\"【国贸】蓬客精品酒店(西餐厅)\">【国贸】蓬客精品酒店(西餐厅)</a>"                                      
 [2] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9417537.html\" target=\"_blank\" title=\"【科技园】大桥日本料理(科兴科学园店)\">【科技园】大桥日本料理(科兴科学园店)</a>"                      
 [3] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/7486383.html\" target=\"_blank\" title=\"【国贸】潮泰轩贵宾楼(彭年店)\">【国贸】潮泰轩贵宾楼(彭年店)</a>"                                      
 [4] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/8019130.html\" target=\"_blank\" title=\"【地王大厦/KKmall】摩登克斯酒店(无国界自助餐厅)\">【地王大厦/KKmall】摩登克斯酒店(无国界自助餐厅)</a>"
 [5] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9499473.html\" target=\"_blank\" title=\"【3店通用】台中牛排馆\">【3店通用】台中牛排馆</a>"                                                       
 [6] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/8572379.html\" target=\"_blank\" title=\"【2店通用】顺德天\">【2店通用】顺德天</a>"                                                                
.............................................................................................................................................                                       
[50] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/8748217.html\" target=\"_blank\" title=\"【市民中心】浅野台湾雪锅\">【市民中心】浅野台湾雪锅</a>"                                                 
[51] " <a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9610775.html\" target=\"_blank\" title=\"【沙头角】11区(壹海城店)\">【沙头角】11区(壹海城店)</a>"                                              
[52] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9613013.html\" target=\"_blank\" title=\"【沙井】藕厨\">【沙井】藕厨</a>"                                                                          
[53] " <a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9630235.html\" target=\"_blank\" title=\"【黄贝岭】当归巧坊Return\">【黄贝岭】当归巧坊Return</a>"                                                  
[54] " <a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9630887.html\" target=\"_blank\" title=\"【3店通用】M63法式甜品\">【3店通用】M63法式甜品</a>"                                                      
[55] "<a class=\"goods-name\" href=\"http://shenzhen.lashou.com/deal/9553105.html\" target=\"_blank\" title=\"【国贸】藤原寿司\">【国贸】藤原寿司</a>"                                                             

每页有55个商家,接下来提取商家名,

goods_name<-substr(goods_name,regexpr("\">",goods_name)+2,nchar(goods_name)-4)  #goods_name

结果如下:

[1] "【国贸】蓬客精品酒店(西餐厅)"                   
 [2] "【科技园】大桥日本料理(科兴科学园店)"           
 [3] "【国贸】潮泰轩贵宾楼(彭年店)"                   
 [4] "【地王大厦/KKmall】摩登克斯酒店(无国界自助餐厅)"
 [5] "【3店通用】台中牛排馆"                            
 [6] "【2店通用】顺德天"                                
 [7] "【2店通用】粤膳和养生坊"                          
 [8] "【海岸城/保利】蓬客精品酒店(海岸城店)"          
 [9] "【华侨城】四海一家(南山中心区)"                 
[10] "【黄贝岭】黄记煌"                                 
[11] "【34店通用】尊宝比萨"                             
[12] "【海岸城/保利】仙芋世家"                          
[13] "【1080店通用】幸福西饼"                           
[14] "【宝安南路沿线】金钱豹"                           
[15] "【龙岗中心区】隐秀山居酒店西餐厅"                 
[16] "【民治】汉釜宫韩式自助烤肉(民治店)"             
[17] "【观澜】冠菌海鲜肥牛火锅"                         
[18] "【宝安南路沿线】炭烤肥牛"                         
[19] "【龙岗中心区】大桥日本料理(龙岗店)"             
[20] "【西丽】常之乐猪肚鸡"                             
[21] "【沙井】希尔顿花园酒店"                           
[22] "【梅林】国宝通客家海鲜酒楼(梅林店)"             
[23] "【6店通用】芒果捞"                                
[24] "【港隆城】冠菌海鲜肥牛自助火锅(流塘店)"         
[25] "【香蜜湖】好世界国宴店"                           
[26] "【龙岗中心区】粿然茶餐厅"                         
[27] "【2店通用】圣多斯巴西烤肉"                        
[28] "【南头】廖记棒棒鸡"                               
[29] "【4店通用】五谷芳乳鸽王"                          
[30] "【坪山】重庆冒菜(八分店)"                       
[31] "【南油】绝味鸭脖(登良路店)"                     
[32] "【横岗】大世喜茶餐厅"                             
[33] "【南头】廖记棒棒鸡"                               
[34] "【沙头角】11区(壹海城店)"                       
[35] "【2店通用】安琪蛋糕店"                            
[36] "【白石洲】冠菌海鲜肥牛自助火锅"                   
[37] "【2店通用】王品台塑牛排"                          
[38] "【观澜】冠菌海鲜肥牛火锅"                         
[39] "【国贸】领鲜环球自助餐"                           
[40] "【6店通用】大汉堡"                                
[41] "【5店通用】亚马逊巴西烤肉"                        
[42] "【华强北】水城黄焖鸡米饭"                         
[43] "【坪山】重庆冒菜(八分店)"                       
[44] "【华强北】花园格兰云天大酒店"                     
[45] "【9店通用】哈根达斯"                              
[46] "【福田CBD】贵哥卤肉卷"                            
[47] "【4店通用】好景面包坊"                            
[48] "【沙井】艺丰美食"                                 
[49] "【南头】廖记棒棒鸡"                               
[50] "【市民中心】浅野台湾雪锅"                         
[51] "【沙头角】11区(壹海城店)"                       
[52] "【沙井】藕厨"                                     
[53] "【黄贝岭】当归巧坊Return"                         
[54] "【3店通用】M63法式甜品"                           
[55] "【国贸】藤原寿司"           

提取关键信息的完整代码如下:


因为拉手深圳地区美食一共有150页,如何统计网页数量请查看之前的文章。

利用for循环将网页都先抓下放一起,再重复刚才的提取字段代码即可完成所有商家的抓取工作。

循环代码如下:


短短几行代码就可以完成团购网的数据抓取工作,是否so easy呢。

最后,附上完整代码:

url1='http://shenzhen.lashou.com/cate/meishi'
web=readLines(url1,encoding='UTF-8')
for(i in 2:150){
  web1<-NULL
  url<-paste(url,"/page",i,sep="")
  web1<-readLines(url,encoding='UTF-8')
  web<-c(web,web1)
}
# #### 提取关键字段信息 #### 
place<-web[grep("class=\"goods-place\"",web)]
place<-substr(place,regexpr("\">",place)+3,regexpr("</",place)-2)  #place
goods_name<-web[grep("goods-name",web)]
goods_name<-substr(goods_name,regexpr("\">",goods_name)+2,nchar(goods_name)-4)  #goods_name
goods_text<-web[grep("goods-text",web)]
goods_text<-substr(goods_text,regexpr("\">",goods_text)+2,nchar(goods_text)-4)  #goods_text
price<-web[grep("class=\"price\"",web)]
price<-substr(price,regexpr("</em>",price)+5,nchar(price)-7)  #price
org_price<-web[grep("class=\"money\"",web)]
org_price<-substr(org_price,regexpr("<del>",org_price)+5,nchar(org_price)-13)  #org_price
result<-data.frame(place=place,goods_name=goods_name,goods_text=goods_text,price=price,
                   org_price=org_price)

head(result)


搞定,收工!

点击“阅读原文”,查看作者原文哦!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存