一、发现网址规律
1.1 判断网站类型
这里我选择哈尔滨作为目标城市,采集哈尔滨的景点信息。第一页的网址
https://place.qyer.com/haerbin/sight/
点击页面下方翻页到第二页, 页面内容已经发生变化,但是网址栏中的网址没有变化,依然是
https://place.qyer.com/haerbin/sight/
所以可以判断该网站为动态网站类型,对付这类网站,需要打开开发者工具Network面板来构建网址规律。
1.2 抓包构建网址规律
1.2.1 Headers
我用的chrome浏览器, F12键(Mac 快捷键command+option+I)打开开发者工具,如下图。
打开开发者工具后, 点击Network面板。为了让 Network监测到数据流, 点击2 。这样就能发现下方截图中的
poi.php?action=list_json
可以基于上方截图确认,该网站现在用的是post请求方法, 写代码时可以用requests.post(url, data)方式发起请求。
1.2.2 Payload
网址规律翻页规律如何构造呢, 通过检查发现 Payload决定着翻页,我们也看到下面截图中,page: 2对应着页面 2。
1.2.3 Preview
我们顺便点击Preview,检查预览数据是否与页面数据有对应关系。 截图中「丁香公园」出现在页面和preview中。
1.3 构造网址规律
构造网址规律, 以第二页为例, 发起请求,查看数据
二、存储数据
采集的字段包括
- 景点名称
- 景点链接
- 评论人数
- 评级
- 图片链接
使用csv格式存储数据
import csv
with open('harbin_sight.csv', 'w', encoding='utf-8', newline='') as csvf:
fieldnames = ['sightName', 'sightUrl', 'commentCount', 'rate', 'imgUrl']
writer = csv.DictWriter(csvf, fieldnames = fieldnames)
writer.writeheader()
for sight in resp.json()['data']['list']:
sight_info = {'sightName': sight['cnname'],
'sightUrl': 'https:' + sight['url'],
'commentCount': sight['commentCount'],
'rate': sight['grade'],
'imgUrl': sight['photo']
}
writer.writerow(sight_info)
代码运行后, 尝试检查harbin_sight.csv, 现在该文件内暂时存储了第二页的景点信息
import pandas as pd
df = pd.read_csv('harbin_sight.csv')
print('景点数: ', len(df))
df.head()
三、批量采集
以哈尔滨为例, 景点页面一共有92页,批量采集这92页信息。完整代码
import requests
import csv
import time
url = 'https://place.qyer.com/poi.php?action=list_json'
#控制翻页的字典
formdata = {'page': 2,
'type': 'city',
'pid': 11597,
'sort': 32,
'subsort': 'all',
'isnominate': -1,
'haslastm': 'false',
'rank': 6}
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'}
#新建csv,存储数据
with open('harbin_sight.csv', 'w', encoding='utf-8', newline='') as csvf:
#设置csv的字段
fieldnames = ['sightName', 'sightUrl', 'commentCount', 'rate', 'imgUrl']
writer = csv.DictWriter(csvf, fieldnames = fieldnames)
writer.writeheader()
#采集哈尔滨从第1页到92页
for page in range(1, 93):
#更新formdata网页数信息,相当于翻页
formdata['page'] = page
#time.sleep(1) 控制访问速度,每秒访问1次
time.sleep(1)
resp = requests.post(url, data=formdata, headers=headers)
print('正在采集哈尔滨第{}页信息'.format(page))
#存储数据
for sight in resp.json()['data']['list']:
sight_info = {'sightName': sight['cnname'],
'sightUrl': 'https:' + sight['url'],
'commentCount': sight['commentCount'],
'rate': sight['grade'],
'imgUrl': sight['photo']
}
writer.writerow(sight_info)
Run
正在采集哈尔滨第1页信息
正在采集哈尔滨第2页信息
......
正在采集哈尔滨第91页信息
正在采集哈尔滨第92页信息
检查数据
import pandas as pd
df = pd.read_csv('harbin_sight.csv')
print('景点数: ', len(df))
df.head()