zoukankan      html  css  js  c++  java
  • 一个站点的诞生04--抓取一个餐厅的某个月的所有评论

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

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

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

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

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

    URLhttp://www.dianping.com/shop/2269717/review_more?pageno=1是一家餐厅点评的首页。pageno=1表示第1页,每条点评实用户id,点评时间。

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

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

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

    2. 从http://www.dianping.com/shop/2269717/review_more?

    pageno=1http://www.dianping.com/shop/2269717/review_more?

    pageno=24,抓取页面。

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

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

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

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

    Spider的代码例如以下:

    import datetime
    import random
    import time
    
    from scrapy.spider import BaseSpider
    from scrapy.selector import HtmlXPathSelector
    from scrapy.http import Request
    
    class 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 " meet 404, mark shop fetched and return " 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-31
    1198927
    <div class="J_brief-cont">
                            这家店换了一家又一家<br>不知道什么时候才会消停<br>整体来说工作日中午的商务餐生意非常不错<br>没有特别的菜<br>整体感觉还不错
                    </div>
    ----------------
    2014-07-29
    1942230
    <div class="J_brief-cont">
                            给孩子庆祝六一节。住附近酒店,经点评研究发现了这家店,在5点差1分钟的时候要求点下午茶套餐。被接受了!呵呵<br>环境非常港式,下午茶不错!

    </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>。

  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6900494.html
Copyright © 2011-2022 走看看