# 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` 后爬取的数据将存放到该文件中。 ![image-20240719093835319](./assets/image-20240719093835319.png) - `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 ``` ![image-20240719134400304](./assets/image-20240719134400304.png) 爬取过程中会有提示信息,爬取到的数据存放到 `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 的情况,欢迎反馈,还望见谅。 目前这个项目还有很大的不足,在于数据遍历依据城市页面提供的信息,覆盖面不够广,以及免费代理池使用不了。后续应该会在此基础上进一步拓展,找到更好的解决办法。如果有更好的渠道,也欢迎反馈!