文档章节

一个网站的诞生03--抓取评论数最多的一万家餐厅

brian_2017
 brian_2017
发布于 2017/01/17 09:42
字数 1121
阅读 3
收藏 0
在大众点评网上,有很多种方式对餐厅进行排序,比如 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,要添加四行代码,修改成如下形式:

------------------------------------

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,这些措施为了避免官方服务器禁止抓取。

在/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即可搞定。

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
原创 | 一点资讯分类新闻爬虫及其文本挖掘

【通往数据自由之路导读】好久不见,手提代码来见,这篇文章分享的是一点资讯新闻网站的抓取和数据分析,机器学习。直接放代码! 流程思路:一点资讯是一个类似今日头条的新闻资讯类网站,我...

何红亮
2017/04/10
0
0
Python 爬下的必胜客数据背后,藏着什么样的信息?

笔者从大学开始就接触 Python,起初是好奇为什么 Python 不需要浏览器就能抓取网站数据。深感奇妙之余,也想亲身体验这种抓取数据的乐趣,所以写了很多爬虫程序。 后随着知识面的拓展,开始了...

CSDN资讯
2018/12/28
0
0
python统计前十出现最多的词

一、描述 这是一道python面试题: “一个可读文件,有一万行,一行只有一个单词,单词可以重复的,求出这一万行中出现频繁次数最多的前10个单词” 二、思路 先读取文件变为列表,再用集合去重...

dyc2005
2017/09/29
0
0
不要迷信米其林餐厅

转载自微信公众号 城市数据研究院(ID:SHDATA)前几天米其林发布了上海美食指南,然而副院长并不觉得所有上榜的米其林餐厅都是出类拔萃的。副院长打算结合某点评网站(因法律风险,不宜透露...

沈雨潇
2016/09/26
0
0
使用 BeautifulSoup 和 Selenium 进行网页爬取

概述 HTML几乎是平铺直叙的。CSS是一个伟大的进步,它清晰地区分了页面的结构和外观。JavaScript添加一些魅力。道理上讲是这样的。现实世界还是有点不一样。 在本教程中,您将了解在浏览器中...

开源中国首席屌炸天
2018/08/28
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
687
9
oracle ORA-39700: database must be opened with UPGRADE option

ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option 进程 ID: 3650 会话 ID: 29......

Tank_shu
今天
3
0
分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
聊聊DubboDefaultPropertiesEnvironmentPostProcessor

序 本文主要研究一下DubboDefaultPropertiesEnvironmentPostProcessor DubboDefaultPropertiesEnvironmentPostProcessor dubbo-spring-boot-project-2.7.3/dubbo-spring-boot-compatible/au......

go4it
昨天
2
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部