一个站点的诞生03--抓取评论数最多的一万家餐厅
2015-03-05 19:08
309 查看
在大众点评网上,有非常多种方式对餐厅进行排序,比方http://www.dianping.com/search/category/1/10/o10,是上海全市依照评论总数最多对餐厅进行排序,以下有50个分页,也就是上海历年累计评论综述最多的750家餐厅。但仅仅有750家,少了点。上海有18个区,逐区点击的话,每区都会显示前750家餐厅,比方这个http://www.dianping.com/search/category/1/10/r802o10,是浦东新区八佰伴地段的前750家。上海如今有十万家餐厅,以这样的方式至少能够得到top8万家餐厅的数据。
可是拿到这么多数据是没有意义的,由于大部分餐厅都是普通餐厅,提供的是常规餐饮,吃了就吃了,不会有人想着去点评一下。仅仅有特别赞的餐厅,才有人点评。或者仅仅有非常在意生意的餐厅,才会雇水军帮自己写点评。
经过数据分析发现,上海仅仅有300家左右的餐厅每月的评论数超过100条,占餐厅总数的0.3%。假设一家餐厅每一个月的评论数超过20条,那它就进入了前3000名,事实上蛮不可思议的。公众參与度不够高,餐厅參与度不够高,这说明点评界还是大有可为的!
闲话少说,这次我们的目的是抓取上海评论数最多的前一万家餐厅,从上海的每一个区抓750个,18个区就是13500个,去掉几百个同一时候属于两个或者两个以上区的餐厅,一万多个就足够了。这一万多个,足以覆盖每一个区有料的餐厅。
以浦东新区为例做抓取。浦东新区评论数最多的前750个餐厅,相应的网址是http://www.dianping.com/search/category/1/10/r5o10p1,注意,category后面的1是上海的城市代码,r5是浦东新区的代码,p1是第一页,有15个餐厅,其它的各符号意义暂且不用管。上海每一个区至少有上千家餐厅,所以不用考虑餐厅不到750个的情况,不用处理这个异常。那么,我们至少把这个链接最后一个数,从1到50列出来,抓取html页面,然后提取餐厅信息就能够了。
在抓取前,要把配置文件改动一下,/tmp/srcapy-test/crawdp/crawdp/setting.py,要加入四行代码,改动成例如以下形式:
------------------------------------
-------------------------------------
最后四行代码是新加入的。这次要连续抓取50次页面,每次抓取的间隔时间是5秒,要做随机下载延迟,要禁用Cookie,这些措施为了避免官方server禁止抓取。
在/tmp/scrapy-test/crawdp/crawdp/spiders/文件夹加入文件shopids_spider.py,内容例如以下
------------------------------------
------------------------------------
然后,在/tmp/scrapy-test/crawdp文件夹下运行"scrapy crawl shopids_spider",就能够看到抓取到的餐厅名称,以及它们在大众点评王的shopid,其结果是类似这种:
那么,怎样知道上海18个区的id呢?在http://www.dianping.com/search/category/1/10/o10的左側,点击“按行政区”,就可以列出上海18个区的链接,里面包括了每一个区的id,仅仅要做一次抓取就能够得到。
这个做法是最简单的方式。事实上还能够增加很多其它的功能,让抓取过程更智能化,比方推断reponse的返回状态,在被403之后,能够暂停若干秒然后继续抓取,再比方将结果存入数据库,或者存入到json文件。这些东东參考scrapy就可以搞定。
可是拿到这么多数据是没有意义的,由于大部分餐厅都是普通餐厅,提供的是常规餐饮,吃了就吃了,不会有人想着去点评一下。仅仅有特别赞的餐厅,才有人点评。或者仅仅有非常在意生意的餐厅,才会雇水军帮自己写点评。
经过数据分析发现,上海仅仅有300家左右的餐厅每月的评论数超过100条,占餐厅总数的0.3%。假设一家餐厅每一个月的评论数超过20条,那它就进入了前3000名,事实上蛮不可思议的。公众參与度不够高,餐厅參与度不够高,这说明点评界还是大有可为的!
闲话少说,这次我们的目的是抓取上海评论数最多的前一万家餐厅,从上海的每一个区抓750个,18个区就是13500个,去掉几百个同一时候属于两个或者两个以上区的餐厅,一万多个就足够了。这一万多个,足以覆盖每一个区有料的餐厅。
以浦东新区为例做抓取。浦东新区评论数最多的前750个餐厅,相应的网址是http://www.dianping.com/search/category/1/10/r5o10p1,注意,category后面的1是上海的城市代码,r5是浦东新区的代码,p1是第一页,有15个餐厅,其它的各符号意义暂且不用管。上海每一个区至少有上千家餐厅,所以不用考虑餐厅不到750个的情况,不用处理这个异常。那么,我们至少把这个链接最后一个数,从1到50列出来,抓取html页面,然后提取餐厅信息就能够了。
在抓取前,要把配置文件改动一下,/tmp/srcapy-test/crawdp/crawdp/setting.py,要加入四行代码,改动成例如以下形式:
------------------------------------
BOT_NAME = 'crawdp' BOT_VERSION = '1.0' SPIDER_MODULES = ['crawdp.spiders'] NEWSPIDER_MODULE = 'crawdp.spiders' USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION) DOWNLOAD_DELAY = 5 RANDOMIZE_DOWNLOAD_DELAY = True USER_AGENT = 'Mozilla AppleWebKit/537.36 Chrome/27.0.1453.93 Safari/537.36' COOKIES_ENABLED = False
-------------------------------------
最后四行代码是新加入的。这次要连续抓取50次页面,每次抓取的间隔时间是5秒,要做随机下载延迟,要禁用Cookie,这些措施为了避免官方server禁止抓取。
在/tmp/scrapy-test/crawdp/crawdp/spiders/文件夹加入文件shopids_spider.py,内容例如以下
------------------------------------
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector class ShopidsSpider(BaseSpider): name = "shopids_spider" start_urls = [] for i in range(1,51): start_urls.append( "http://www.dianping.com/search/category/1/10/r5o10p%s" % i) def parse(self, response): hxs = HtmlXPathSelector(response) xs = hxs.select('//ul[@class=\"detail\"]') for x in xs: print "---------" shopid = x.select('li[@class=\"shopname\"]/a[@class=\"BL\"]/@href').extract()[0].split('/')[-1] shopname = x.select('li[@class=\"shopname\"]/a[@class=\"BL\"]/text()').extract()[0] print "shopid, shopname = %s, %s" % (shopid, shopname)
------------------------------------
然后,在/tmp/scrapy-test/crawdp文件夹下运行"scrapy crawl shopids_spider",就能够看到抓取到的餐厅名称,以及它们在大众点评王的shopid,其结果是类似这种:
--------- shopid, shopname = 5391580, 泰妃阁(新梅广场店) --------- shopid, shopname = 4043482, 西贝莜面村(金桥店) --------- shopid, shopname = 2748850, 望湘园(96广场店) --------- shopid, shopname = 500068, 避风塘(八佰伴店) --------- shopid, shopname = 5473698, 上上谦串串香火锅(浦东新梅店) --------- shopid, shopname = 501019, 廊亦舫酒楼(正大店) --------- shopid, shopname = 559844, 渝乡人家(陆家嘴店)
那么,怎样知道上海18个区的id呢?在http://www.dianping.com/search/category/1/10/o10的左側,点击“按行政区”,就可以列出上海18个区的链接,里面包括了每一个区的id,仅仅要做一次抓取就能够得到。
这个做法是最简单的方式。事实上还能够增加很多其它的功能,让抓取过程更智能化,比方推断reponse的返回状态,在被403之后,能够暂停若干秒然后继续抓取,再比方将结果存入数据库,或者存入到json文件。这些东东參考scrapy就可以搞定。
相关文章推荐
- 一个网站的诞生03--抓取评论数最多的一万家餐厅
- 一个网站的诞生04--抓取一个餐厅的某个月的全部评论
- 一个站点的诞生02--用Scrapy抓取数据
- 【Heritrix基础教程之4】开始一个爬虫抓取的全流程代码分析 分类: H3_NUTCH 2014-06-04 20:10 1039人阅读 评论(0) 收藏
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- 推荐一个 github 项目 spider163,抓取网络数据,歌曲评论等数据
- 一个网站的诞生02--用Scrapy抓取数据
- 一个站点的诞生09--自己主动监控
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- 一个站点的诞生06-- ORM
- 一个对众多CMS(内容管理系统)进行比较、评论的网站
- Asp.net中如何处理一个站点不同Web应用通用Session的问题
- 一个Oracle的技术站点,8错的说
- 一个部分有免费ASPTODAY文章的站点
- 一个对初学者有益的站点
- 转帖:我和ERP的故事:一个女CIO的诞生
- 如何处理一个站点不同Web应用通用Session
- 一个网友提供的ftp站点可以练jsp
- 发现一个非常好的ftp站点,有大量的程序
- 又一个不错的ftp站点