博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个站点的诞生04--抓取一个餐厅的某个月的所有评论
阅读量:6217 次
发布时间:2019-06-21

本文共 5067 字,大约阅读时间需要 16 分钟。

第一个Spider是抓上海的城市id。顺带抓它的下一级行政区id。

第二个Spider是抓上海的Top一万家餐厅的Shopid。

本文是第三个Spider,依据一个餐厅的Shopid,抓取它在某个月内的所有评论。

三个Spider的累加效果,就是抓取随意一个城市的TopN家餐厅的所有评论。第三个Spider改动一下,还能够做到仅仅抓取某天的评论,仅仅抓取某人的评论,从抓取的角度看就全齐了。

经过前两次的spider热身。这次做个复杂点的。

URL是一家餐厅点评的首页。pageno=1表示第1页,每条点评实用户id,点评时间。

假设点评是在当前年份的,点评时间不写年份,否则有年份。最下方有分页数,它家的所有点评一共24页。

假如要抓取2014年7月的评论。流程是这种:

1. 2014年7月有31天,也就是说说。要抓取的是日期从2014-0701到2014-0731。

2. 从

pageno=1到

pageno=24,抓取页面。

3. 假设pageno=1。抓取最底下的分页数。保存最大分页数。

3. 抽取点评,假设点评的创建日期没有年份,用当前年份补上。假设点评的创建日期在2014-0701到2014-0731之间就存储点评。

假设在当前页面上,遇到一个点评的创建日期早于2014-0701,就不再抓取新的页面。由于下一页的点评都比要抓取的日期早。

4. 假设遇到403错误,暂停十分钟再继续抓,假设遇到404错误,不继续抓取。返回。

Spider的代码例如以下:

import datetimeimport randomimport timefrom scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelectorfrom scrapy.http import Requestclass ShopreviewSpider(BaseSpider):    name = "shopreview_spider"    allowed_domains = ["dianping.com"]    start_urls = []    handle_httpstatus_list = [404,403]    def __init__(self):        """        year_mon = '2014-04'        shopid = '2269717'        """        self._shopid = "2269717"        self._thisyear_int = datetime.date.today().year        year_g = 2014        mon_g = 7        max_day = 31        self._min_date = datetime.date(year_g, mon_g, 1)        self._max_date = datetime.date(year_g, mon_g, max_day)                #set start url        self.pagno = 1        self.start_urls = ["http://www.dianping.com/shop/%s/review_more?

pageno=%s" % (self._shopid,self.pagno)] def parse(self, response): if response.status == 403: time.sleep(10*60) yield Request(response.url,callback=self.parse, headers={'Referer':'http://www.baidu.com/s?psid=sdafwewer'+str(1)}) elif response.status == 404: print "\n\nmeet 404, mark shop fetched and return\n\n" else: hxs = HtmlXPathSelector(response) #extract reviews xs = hxs.select('//div[@class=\"comment-list\"]/ul/li') generate_new_request = True if len(xs) == 0: print "len(xs) == 0" generate_new_request = False for x in xs: reviewer = x.select('div[@class=\"pic\"]/a/@href').extract()[0].split('/')[-1] review = x.select('div[@class=\"content\"]/div[@class=\"comment-txt\"]/div[@class=\"J_brief-cont\"]').extract()[0].strip() reviewdate_t = x.select('div[@class=\"content\"]/div[@class=\"misc-info\"]/span[@class=\"time\"]/text()').extract()[0].split()[0] reviewdate="" if len(reviewdate_t) == 5: reviewdate = ("%s"%(self._thisyear_int))+"-"+reviewdate_t else: reviewdate = "20"+reviewdate_t rd1,rd2,rd3 = reviewdate.split('-') dd = datetime.date(int(rd1), int(rd2), int(rd3)) if dd < self._min_date: generate_new_request = False elif dd >= self._min_date and dd <= self._max_date: print "----------------" print reviewdate print reviewer print review else: pass xs = hxs.select('//a[@class=\"PageLink\"]') num_page_link = len(xs) max_pages = -1 if num_page_link > 0: max_pages = max( [int(x.select("text()").extract()[0]) for x in xs] ) if generate_new_request: self.pagno += 1 if num_page_link == 0 or self.pagno > max_pages: pass else: new_url = "http://www.dianping.com/shop/%s/review_more?pageno=%s" % (self._shopid, self.pagno) rand_int = random.randint(1,999999) yield Request(new_url, callback=self.parse, headers={'Referer':'http://www.baidu.com/s?psid=sdafwewer'+str(rand_int)})

这个spider在/tmp/scrapy-test/crawdp/crawdp/spiders/shopreview_spider.py。

在/tmp/srcapy-test/crawdp文件夹下执行"scrapy crawl shopreview_spder",效果是这种:

----------------2014-07-311198927
这家店换了一家又一家
不知道什么时候才会消停
整体来说工作日中午的商务餐生意非常不错
没有特别的菜
整体感觉还不错
----------------2014-07-291942230
给孩子庆祝六一节。住附近酒店,经点评研究发现了这家店,在5点差1分钟的时候要求点下午茶套餐。被接受了!呵呵
环境非常港式,下午茶不错!

</div> ---------------- 2014-07-29 428660 <div class="J_brief-cont"> 荷叶饭非常不错。铁板鱿鱼也非常不错。

</div> ---------------- 2014-07-24 57148861 <div class="J_brief-cont"> 金桔柠檬甜甜的可是我比較喜欢酸的 非常多菜看起来都非常好吃 服务态度好 环境简单干净 两个人早茶吃了117 </div> ---------------- 2014-07-20 5186406 <div class="J_brief-cont"> 是地道的港式餐厅,口味正宗,菜式多样,还常常推陈出新。常常去会有惊喜 </div> ---------------- 2014-07-14 1836211 <div class="J_brief-cont"> 这家店的分数说实话,以我个人的看法。是偏低了。这样的店假设放在我曾经住的五毛厂周围,完暴万达广场内的那些难吃的店了。煲仔饭尤其推荐。 </div> ---------------- 2014-07-13 10365 <div class="J_brief-cont"> 纯粹是 为了到隔壁的虾满堂买小龙虾才来的。隔壁龙虾店5点不到不开业,仅仅得在这家店歇歇脚。点了一份 下午茶套餐,奶茶+鱼蛋肠粉,味道非常地道,旁边几桌的 顾客都说广东话应该这家店满正宗的,不好的地方就是一楼好像是吸烟区,坐在里面被动吸二手烟了。 </div> ---------------- 2014-07-08 48406752 <div class="J_brief-cont"> 炸鲜奶非常好吃。各色菜品量非常大,晚上去的环境非常不错,值得推荐! </div> ---------------- 2014-07-03 57580045 <div class="J_brief-cont"> 翔记生蚝考的味道还能够,我和同事有时会去吃吃。环境一般。服务一般, </div> ---------------- 2014-07-02 14718103 <div class="J_brief-cont"> 服务员态度绝对点赞。海鲜粥。烧得有点小胡,还算鲜,干贝有点太咸。

滑鸡煲,有非常多脆脆得藕片。鸡挺嫩。萝卜牛肉煲,萝卜炖得能够。炸鲜奶,挺奇怪得一道菜,为什么甜甜得东西里头会有蒜味? </div> ---------------- 2014-07-01 36276873 <div class="J_brief-cont"> 一家港式茶餐厅,看见非常多人都直接点一份主食(炒河粉或炒米线之类)当晚饭。大厅挂着非常大的电视在播粤语节目,邻桌就是一桌香港人在用餐。<br>非常喜欢他家的白灵菇牛肉片,除了有一点点咸之外,白灵菇吃起来非常饱满有筋道。招牌猪脚味道不错但仅仅有五六个,还是略咸。有一道蔬菜凉菜的,不好吃。紫甘蓝都切好大片,并且芝麻酱不多,摆盘和曾经吃的都不一样,端上来非常大一盆事实上并没有那么多,里面用料也一般;主食是排骨河粉,无功无过。<br>服务员态度都还不错。 </div>

Scrapy在处理<br>元素的时候,会有点小问题,所以点评的原文不得以要保留了<div>和<br>。

转载地址:http://zxsja.baihongyu.com/

你可能感兴趣的文章
window IIS6/IIS7取消脚本执行权限,禁止运行脚本木马
查看>>
windows下elasticsearch配置及spring boot 简单demod的 整合
查看>>
降低硬件要求!戴尔新品将VR内容的渲染移到云端
查看>>
javascript高级程序设计第一章
查看>>
1.ASP.NET全栈开发之服务端验证基础
查看>>
Android NDK错误:Error: Unable to get the CMake verion located at
查看>>
消息队列三
查看>>
四大平台、八大领域,阿里云ET城市大脑全面开放平台AI能力
查看>>
他们的心声,让无数人温暖一生
查看>>
seastar中apply模板的实现
查看>>
freemarker模板修改后不生效
查看>>
JDK 11 进入特性冻结阶段,17 个最终 JEP 一览
查看>>
IO流学习总结(下)---字节流
查看>>
API Monitor简介(API监控工具)
查看>>
新华三:纵深防御落实行业私有云安全等级保护
查看>>
中国智慧家庭大会胜利召开,畅听未来主义者的AI宣言
查看>>
[开发笔记]-分隔字符串
查看>>
开发人员如何成为架构师
查看>>
LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
查看>>
Clear Linux镜像在云市场发布
查看>>