爬取下来的数据如何去重

博客介绍了不同数据量下的网页去重方法。数据量不大时,可在内存用 Python 的 set() 或 Redis 的 set 结构去重;数据量稍大,可用加密算法压缩后去重;数据量极大时,可用 Bloomfilter 去重。还提到在 Redis 上用 Bloomfilter 可解决持久化和分布式统一去重问题,以及 simhash 和 scrapy_redis 的去重方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 通过 MD5 生成电子指纹来判断页面是否改变
  2. nutch 去重。nutch 中 digest 是对采集的每一个网页内容的 32 位哈希值,如果两个网页内容完 全一样,它们的 digest 值肯定会一样。
  3. 数据量不大时,可以直接放在内存里面进行去重,python 可以使用 set()进行去重。当去重数据 需要持久化时可以使用 redis 的 set 数据结构。
  4. 当数据量再大一点时,可以用不同的加密算法先将长字符串压缩成 16/32/40 个字符,再使用 上面两种方法去重。
  5. 当数据量达到亿(甚至十亿、百亿)数量级时,内存有限,必须用“位”来去重,才能够满足需 求。Bloomfilter 就是将去重对象映射到几个内存“位”,通过几个位的 0/1 值来判断一个对象是 否已经存在。
  6. 然而 Bloomfilter 运行在一台机器的内存上,不方便持久化(机器 down 掉就什么都没啦),也不 方便分布式爬虫的统一去重。如果可以在 Redis 上申请内存进行 Bloomfilter,以上两个问题就都能解 决了。
  7. simhash 最牛逼的一点就是将一个文档,最后转换成一个 64 位的字节,暂且称之为特征字,然后 判断重复只需要判断他们的特征字的距离是不是<n(根据经验这个 n 一般取值为 3),就可以判断两个 文档是否相似。
  8. 可见 scrapy_redis 是利用 set 数据结构来去重的,去重的对象是 request 的 fingerprint(其实 就是用 hashlib.sha1()对 request 对象的某些字段信息进行压缩)。其实 fp 就是 request 对象加密 压缩后的一个字符串(40 个字符,0~f)。
<think>好的,我现在需要回答用户关于如何使用Python爬虫抓取POI数据的请求。首先,用户提到了百度地图API和相关引用,特别是引用[3]中的示例代码。我需要先确保自己了解POI数据抓取的基本流程,并结合引用内容给出具体步骤。 首先,用户需要明确POI是什么。POI即“兴趣点”,包括商店、景点等地理位置信息。抓取这些数据通常通过API,比如百度地图API或高德地图API。根据引用[3],用户可能已经有一些基础,比如使用Python写入文件,但需要更详细的指导。 接下来,我应该分步骤讲解整个过程。第一步是注册和获取API密钥,这是使用任何地图服务API的前提。需要指导用户如何注册百度地图开放平台,创建应用,并获取AK(访问密钥)。 第二步是安装必要的库。引用[2]提到安装Python库,比如requests用于发送HTTP请求。这里需要确认用户是否已经安装了这些库,如果没有,给出安装命令。 第三步是了解API接口文档。百度地图的Place API文档会有详细参数说明,比如查询关键字、区域、输出格式等。用户需要知道如何构造请求URL,包括必填参数和可选参数。 第四步是编写爬虫代码。这里需要提供一个简单的示例代码,展示如何发送请求、处理响应,并提取POI数据。引用[3]中的代码片段可能涉及文件操作,可以借鉴这部分,比如将数据保存到CSV文件中。 第五步是处理分页和循环请求。因为单次API返回的数据有限,需要循环请求获取所有数据。这里需要注意百度API的返回结果中的总数量,计算需要的页数,同时注意API的频率限制,避免被封禁。 第六步是数据存储。将获取的数据保存到文件或数据库中,可能需要使用pandas库来处理数据框,或者直接写入CSV文件。 此外,需要提到法律和道德规范,确保用户遵守网站的使用条款,不侵犯隐私。引用[1]和[2]中提到的数据清洗和可视化可能作为后续步骤,但用户当前主要关注爬取,所以可以简要提及。 最后,生成相关问题,帮助用户深入理解,比如如何提高爬取效率、处理反爬机制等。这些问题需要与POI数据抓取相关,并基于引用的内容。 现在需要检查步骤是否清晰,代码示例是否正确,参数是否准确,比如百度API的URL格式是否正确,是否有必填参数遗漏。同时确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但在这个回答中可能数学公式较少,主要关注代码和步骤。最后,确认引用标识正确添加,比如在提到API使用和数据存储时引用对应的引用源。</think>以下是如何使用Python爬虫抓取POI数据的详细步骤: --- ### **1. 获取API密钥** 百度地图开放平台提供Place API用于POI数据检索[^3]。 - 注册账号并创建应用,获取`AK`(访问密钥)。 - 服务端类型应用可设置IP白名单(如`0.0.0.0/0`临时测试)。 --- ### **2. 安装依赖库** ```bash pip install requests pandas ``` --- ### **3. 构造API请求** 百度Place API基础参数: - `query`: POI关键词(如“酒店”) - `region`: 限定区域(如“北京市”) - `output`: 返回格式(默认`json`) - `page_size`: 单页数据量(最大20) - `page_num`: 页码 请求URL示例: ```python url = f"http://api.map.baidu.com/place/v2/search?query=学校®ion=贵阳&output=json&ak=你的AK" ``` --- ### **4. 编写爬虫代码** ```python import requests import pandas as pd def get_poi_data(api_key, keyword, city, max_pages=10): results = [] for page in range(max_pages): params = { "query": keyword, "region": city, "output": "json", "ak": api_key, "page_num": page, "page_size": 20 } response = requests.get("http://api.map.baidu.com/place/v2/search", params=params) data = response.json() if "results" in data: results.extend(data["results"]) return pd.DataFrame(results) # 示例:抓取贵阳市的学校POI df = get_poi_data(api_key="你的AK", keyword="学校", city="贵阳") df.to_csv("poi_data.csv", index=False, encoding="utf-8") ``` --- ### **5. 处理分页与限制** - 根据API返回的`total`字段计算总页数。 - 添加`time.sleep(1)`避免触发频率限制(通常QPS≤50)。 --- ### **6. 数据存储与清洗** 使用`pandas`保存为结构化数据,并过滤无效字段: ```python clean_df = df[["name", "address", "province", "city", "area", "telephone"]] ``` --- ### **注意事项** - **遵守协议**:百度API禁止未经授权商业化使用。 - **数据**:POI可能存在复项,需通过`df.drop_duplicates()`处理。 - **坐标系转换**:百度地图使用BD09坐标,需转换(如转WGS84)可调用其他API。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值