# Weibo-POI-Crawler
**Repository Path**: Jongsh/weibo-poi-crawler
## Basic Information
- **Project Name**: Weibo-POI-Crawler
- **Description**: 微博 poi 数据爬虫
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2024-07-14
- **Last Updated**: 2025-03-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: POI, 微博爬虫
## README
# 微博 POI 数据爬虫
## 项目概述
本项目用于爬取微博 POI(Point of Interest,兴趣点) 数据,爬取的内容包括 poiid、poi名称、经纬度、地址和文本描述。其中最关键的部分是文本描述。内容来源于 `https://weibo.com/p/100101{poiid}` 。
项目结构:
```python
weibo-poi-crawler
│ search.py
│ clean.py
│ login.py
│ proxy.py
│ README.md
│ requirements.txt
│
├─config
│ headers.txt
│ landmark_params.txt
│ restaurant_params.txt
│ weibo_cookies.txt
│
├─data
│ data.csv
│ new_data.csv
```
根目录下四个 Python 源文件:
- `search.py`:主文件,用于爬取所需数据。
- `login.py`:执行登录操作,获取 cookies 信息。
- `proxy.py`:代理池接口(微博反爬机制好严格,这个文件的代理池接口全部失效,暂时用不了)。
- `clean.py`:清洗爬取后的数据。
config 目录下的配置文件:
- `weibo_cookies.txt`:执行登录逻辑后,cookies 保存的位置。
- `headers.txt`:项目中用到的某个微博接口所需请求头,已经写好,不需要修改(如果有问题,可以到这个[微博页面](https://place.weibo.com/wandermap/?pcid=B2094251DB6FABFC489A),尝试进行一次搜索,把 `/wandermap/search2` 接口用到的请求标头依照该文件已有内容进行重写)。
- `landmark_params.txt`、`restaurant_params.txt`:某接口的参数配置。
data 目录存放的是已经爬取好的数据:
- `data.csv`:执行 `search.py` 后爬取的数据将存放到该文件中。

- `new_data.csv`:执行 `clean.py` 对 `data.csv` 清洗后得到的新文件,清洗的依据是补充 "文本描述" 为空的行。
## 快速上手
该项目的运行环境是 Python 3.9,浏览器使用 Chrome。
- 克隆项目到本地,进入根目录,安装必要依赖:
```bash
pip install -r requirements.txt
```
- 这一步是准备 cookies,可以在浏览器下登录微博,选择其中一个页面,利用浏览器开发工具复制自己的 cookies 到 `config/weibo_cookies.txt` 下,记得改成 json 格式。
这里也提供了另一种方法,稍显麻烦一些。运行 `login.py` 登录逻辑,此处会弹出 Chrome 浏览器界面,会有几十秒的时间输入自己的微博账号。如果觉得时间太短不好操作,可以直接到该源文件中修改 `time.sleep()` 的参数。**记得填写完不要直接关闭浏览器**,等待程序运行完后看到成功提示。
```bash
python login.py
```
由于代码用到了 `selenium` 库,所以需要安装 chrome 拓展,这里也附上安装的[教程](https://blog.csdn.net/Z_Lisa/article/details/133307151)。
> 此方法与网络环境有比较大的关系,如果遇到卡住的情况,可以多试几次。
- 修改配置文件 `config/landmark_params.txt`、`config/restaurant_params.txt`。这一步用于设置你想爬取的地点。修改的内容是 `containerid`,比如北京地标参数是:
```json
{
"containerid": "2304410027__8008611000000000000",
"page_type": "01",
"page": 1
}
```
修改方式参考新浪微博开放平台的[省份城市编码表](https://open.weibo.com/wiki/省份城市编码表)。上述例子中北京的编码是1100(北京的城市编码不起效果,于是后两位取00),假设你要爬取福建泉州的数据,依据编码表可知是3505,于是`containerid`的后半部分就改为8008635050000000000。记得两个配置文件都要修改,方法是一样的。
**有些城市编码不能使用,建议修改参数前先到页面(https://m.weibo.cn/p/10010180086{城市编码}0000000000)检查是否有数据。**
- 运行主体逻辑,爬取数据:
```bash
python search.py
```

爬取过程中会有提示信息,爬取到的数据存放到 `data/data.csv` 中。
本项目的代理池失效了,所以暂时没有使用。而微博会对频繁访问的 IP 禁用一段时间。如果你看到代码卡主了,那是因为程序正在 sleep & try,继续等待即可。
> 没有代理池会导致频繁等待,我在服务器上跑了一晚上才爬了几万条数据,具体执行了多久不清楚。
- 在 `search.py` 中我设置了爬取一个页面的次数限制,避免因一个 poi 数据有误导致卡死,所以如果因为网络问题或微博反爬机制导致 `data/data.csv` 的数据不完整,可以运行 `clean.py` 脚本做数据清洗,该文件会重新爬取 `data.csv` 中没有文本数据的部分,将新数据写到 `data/new_data.csv` 中。
```bash
python clean.py
```
## 开发指南
该[博客](https://blog.jongsh.top/coding-diary/weibo-poi-crawler/)有对本项目源码级的分析,如果需要二次开发,可以参考。
## 写在最后
由于是本人第一次正儿八经地写爬虫,可能遇到有 bug 的情况,欢迎反馈,还望见谅。
目前这个项目还有很大的不足,在于数据遍历依据城市页面提供的信息,覆盖面不够广,以及免费代理池使用不了。后续应该会在此基础上进一步拓展,找到更好的解决办法。如果有更好的渠道,也欢迎反馈!