Python爬虫--美团美食信息



美团网也是动态加载的网页,但是我看了下,其美食信息也在源代码中有,因此可以按照Python爬虫–淘宝(2)其中的方式去爬美食信息。

步骤照搬:

1.获取网页源代码。

2.使用网页解析工具进行解析,构造翻页网址,提取所需信息。

3.整理并保存信息。


获取网页源代码

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import re

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'
}

# 以爬取北京美团美食列表为例
url = 'http://bj.meituan.com/meishi/'
# 请求网页
response = requests.get(url, headers=headers)
print(response.text)

提取信息

在上一步操作得到源代码之后,仔细观察,可以看到带有商家信息的部分为一段 json 数据,这里稍有不同的是,我们可以直接在源代码中使用正则表达式匹配出含有商家信息的 json 信息。

匹配 json 数据段

1
2
3
4
5
import json
# findall获取得到的是一个列表
items = re.findall(r'"poiLists":(.`?),"comHeader"', response.text, re.S)
# 而列表中只有一个元素
item = json.loads(items[0])

提取信息

1
2
3
4
5
6
7
8
9
if item.get('poiInfos'):
for info in item.get('poiInfos'):
id = info.get('poiId')
title = info.get('title')
addr = info.get('address')
avgScore = '平均分' + str(info.get('avgScore'))
allCommentNum = str(info.get('allCommentNum')) + '条评论'
avgPrice = str(info.get('avgPrice')) + '元/人'
print(id, title, addr, avgPrice, avgScore, allCommentNum)

构造翻页网址

通过翻页找到页码规律,每个网页最后面 pn 后面的数字就是页码。

1
2
3
# 爬取 1-9 页美食信息
for page in range(1, 10):
url = 'http://bj.meituan.com/meishi/pn{}'.format(page)

保存数据

保存到MongoDB数据库。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
import re
import json

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'
}
for page in range(1, 10):
url = 'http://bj.meituan.com/meishi/pn{}'.format(page)
response = requests.get(url, headers=headers)
items = re.findall(r'"poiLists":(.`?),"comHeader"', response.text, re.S)
item = json.loads(items[0])

if item.get('poiInfos'):
for info in item.get('poiInfos'):
id = info.get('poiId')
title = info.get('title')
addr = info.get('address')
avgScore = '平均分' + str(info.get('avgScore'))
allCommentNum = str(info.get('allCommentNum')) + '条评论'
avgPrice = str(info.get('avgPrice')) + '元/人'
print(id, title, addr, avgPrice, avgScore, allCommentNum)

-------------本文结束感谢您的阅读-------------
0%