一、发现网址规律

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()



四、获取代码

点击下载本文代码



广而告之