鱼C论坛

 找回密码
 立即注册
查看: 3562|回复: 4

[技术交流] python小练习(051):爬取大众点评网美食版块+数据库储存+大数据分析(一)

[复制链接]
发表于 2016-12-28 10:14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python小练习系列又重启啦!暂且叫第二季吧

在这一季里,我们要搞一个稍微大一点的项目,把之前学的知识融会贯通起来。

那么我初步的构想就是爬大众点评网(上海)的美食版块(谁让我是吃货呢 ),然后把爬取的数据存储到数据库中,再用Flask或者QT5(暂时还没想好用哪个做)做一个查询系统,运用统计分析的方法进行大数据分析,并生成分析报告。

基本上这就是这个项目大致的框架,感觉内容已经挺丰富了,后面我会边做边分享自己的编程过程,不定期更新,看我的进度而定吧。

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +10 收起 理由
冬雪雪冬 + 10 + 10 + 10 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-28 10:26:04 | 显示全部楼层
今天先更新个热身篇,大众点评网美食版块初探。
在盲目动手之前,当然先要知道我们的对手是谁(目标),我们要爬取的内容是什么(数据),这些内容可以从何处获得(数据地址或者来源)。
所以,我们可以打开一个大众点评的美食版块,可以看到美食版块中对每家店铺进行归类,可以按区域,按菜系,按商圈等等分类,我们的爬取也可以按照分类来进行分类爬取,这样可以分批得爬取我们需要的数据。
另外,预览界面中可以爬取的信息有:店铺名称、店铺url、商户等级、菜系分类、所属区域、人均价格、口味、环境、服务、评论数等等。
如果还要知道更详细的店铺信息,比如推荐菜啊、特色菜等等,就需要进入详细店铺界面才能爬取到。
所以我们又可以分步来进行,先爬整个预览,然后通过每个预览信息的“店铺url”再爬取详细信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-28 10:31:48 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-12-28 10:41 编辑

在真正动手之前,可以先下载一个大众点评的页面,在本地进行爬取练习,如果在本地都能把所要的信息都爬取到了,再切换到网上进行实战。
这样可以提高效率,也便于进行纠错。
比如我先下载了任意的一个页面后,存储为dianping.html
然后用BeautifulSoup和re对我感兴趣的内容进行抓取测试。
  1. #coding:utf-8
  2. import re
  3. from bs4 import BeautifulSoup as bs

  4. with open('dianping.html','rb') as f:
  5.         html = f.read().decode()
  6. dianping = bs(html,'lxml')
  7. allshops = dianping.find_all('div', attrs={'class':'shop-list J_shop-list shop-all-list'})[0]
  8. shops = allshops.find_all('li')
  9. for eachshop in shops:
  10.     name = eachshop.h4.string
  11.     shopurl = eachshop.a["href"]
  12.     try:
  13.         star = re.findall('title="(.*)">',str(eachshop.find_all('span')[0]))[0]
  14.     except:
  15.         star = ''
  16.     try:
  17.         cls = re.findall('<span class="tag">(.*?)</span>',str(eachshop.find_all('span')))[0]
  18.     except:
  19.         cls = ''
  20.     try:
  21.         area = re.findall('<span class="tag">(.*?)</span>',str(eachshop.find_all('span')))[1]
  22.     except:
  23.         area = ''   
  24.     try:
  25.         addr = re.findall('<span class="addr">(.*?)</span>',str(eachshop.find_all('span')))[0]
  26.     except:
  27.         addr = ''
  28.     try:
  29.         comments = re.findall('<b>(.*?)</b>',str(eachshop.find_all('b')[0]))[0]
  30.     except:
  31.         comments = ''
  32.     try:
  33.         mean = re.findall('<b>(.*?)</b>',str(eachshop.find_all('b')[1]))[0]
  34.     except:
  35.         mean = ''
  36.     try:
  37.         taste = re.findall('<b>(.*?)</b>',str(eachshop.find_all('b')[2]))[0]
  38.     except:
  39.         taste = ''
  40.     try:
  41.         envior = re.findall('<b>(.*?)</b>',str(eachshop.find_all('b')[3]))[0]
  42.     except:
  43.         envior = ''
  44.     try:
  45.         service = re.findall('<b>(.*?)</b>',str(eachshop.find_all('b')[4]))[0]
  46.     except:
  47.         service = ''
  48.    
  49.     print (name,shopurl,star,cls,area,addr,mean,taste,envior,service,comments)
复制代码


输出的结果:
花隐日式怀石料理(上海五角场店) /shop/37765452 五星商户 日本菜 五角场/大学区 淞沪路8号百联又一城7楼 ¥331 9.1 9.2 9.2 4166
将太无二(合生汇店) /shop/45829550 准五星商户 日本菜 五角场/大学区 翔殷路1099号合生汇三层L3-01 ¥173 8.4 8.6 8.8 3457
掌柜的店纯朴中原菜(政通路店) /shop/5712781 四星商户 其他 五角场/大学区 政通路189号万达广场特力时尚屋4楼402号铺 ¥72 7.9 8.2 8.1 7679
A&S牛油果&牛排创意餐吧 /shop/69858430 准五星商户 西餐 五角场/大学区 伟成路68号 ¥92 8.5 9.1 8.9 62
OUTBACK澳拜客(五角场合生汇店) /shop/66964097 四星商户 西餐 五角场/大学区 黄兴路2228号 ¥203 7.7 9.0 8.3 849
喜来稀肉(国定路店) /shop/23972720 准五星商户 韩国料理 五角场/大学区 国定路506号8幢101室 ¥89 9.0 8.7 8.8 3660
Fish’s Fish 鱼就是鱼 /shop/68213232 准五星商户 其他 五角场/大学区 国济路28号2楼 ¥71 8.2 8.7 8.7 224
今日牛事潮汕鲜牛肉火锅(五角场... /shop/32512961 五星商户 火锅 五角场/大学区 黄兴路1766号 ¥123 9.1 9.0 9.1 2077
爱晒蒸汽海鲜主题餐厅 /shop/58638982 准五星商户 海鲜 五角场/大学区 五角场国济路30—16 ¥148 8.8 8.2 8.3 1251
乐韵亚洲餐厅(五角场店) /shop/38163600 准五星商户 东南亚菜 五角场/大学区 国安路758弄29号星汇广场法式风情街 ¥107 8.4 8.7 8.7 263
莱甘地异国料理 /shop/8977492 准五星商户 西餐 五角场/大学区 大学路135号 ¥110 8.2 8.8 8.4 1635
丰收日(五角场店) /shop/2683825 准四星商户 本帮江浙菜 五角场/大学区 四平路2152号1-3楼 ¥146 7.6 7.4 7.0 3099
王品牛排(上海五角场店) /shop/10343688 五星商户 西餐 五角场/大学区 淞沪路8号百联又一城7F ¥378 8.9 9.2 9.1 2383
詹姆士芝士排骨(五角场特力时尚... /shop/32482421 准五星商户 韩国料理 五角场/大学区 政通路189号特力时尚汇1楼16—B ¥92 8.3 8.3 8.7 6982
港欣茶餐厅(合生汇店) /shop/45829445 三星商户 粤菜 五角场/大学区 翔殷路1099号合生广场B1 ¥76 6.5 7.7 7.5 687
八道江山火炉炭烤(武川路店) /shop/24112770  韩国料理 五角场/大学区 武川路49号 ¥80 9.1 9.0 9.1 2669
夜航者吧式串烤餐厅(五角场店) /shop/32573686 准五星商户 烧烤 五角场/大学区 四平路2138号2楼 ¥93 8.4 8.6 8.6 957
独钓寒江砂锅鱼(五角场万达店) /shop/38117025 准五星商户 川菜 五角场/大学区 政通路189号万达广场特力时尚汇3楼 ¥91 8.5 8.4 8.6 1973
海底捞火锅(五角场店) /shop/21274580 五星商户 火锅 五角场/大学区 邯郸路585号苏宁电器五层 ¥129 9.0 9.1 9.2 6894
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-28 10:35:19 | 显示全部楼层
之所以,每句正则匹配都用了try和except语句,是由于我发现在抓取过程中,有些标签的内容会写得不规范,或者内容为空,这样正则匹配就会出错,为了避免错误而中断整个爬取,所以我都增加了容错性的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-28 10:48:09 | 显示全部楼层
看了爬下来的数据,为了便于数据标准化后的分析,所以应该把“人均”里面的人民币符号去除。
所以调整一下正则的代码:
  1. mean = re.findall('<b>.(\d+?)</b>',str(eachshop.find_all('b')[1]))[0]
复制代码

这样爬的内容里就没有人民币符号了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 22:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表