python之爬虫入门实例
链家二手房数据抓取与Excel存储
目录
- 开发环境准备
- 爬虫流程分析
- 核心代码实现
- 关键命令详解
- 进阶优化方案
- 注意事项与扩展
一、开发环境准备
1.1 必要组件安装
# 安装核心库
pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明:
- requests:网络请求库(版本≥2.25.1)
- beautifulsoup4:HTML解析库(版本≥4.11.2)
- openpyxl:Excel文件操作库(版本≥3.1.2)
- pandas:数据分析库(版本≥2.0.3)
1.2 开发环境验证
import requests
from bs4 import BeautifulSoup
import pandas as pdprint("所有库加载成功!")
二、爬虫流程分析
2.1 技术路线图
2.2 目标页面结构
https://cq.lianjia.com/ershoufang/
├── div.leftContent
│ └── ul.sellListContent
│ └── li[data-houseid] # 单个房源
│ ├── div.title > a # 标题
│ ├── div.flood > div # 地址
│ ├── div.priceInfo > div.totalPrice # 总价
│ └── div.followInfo # 关注量
三、核心代码实现
3.1 完整代码(带详细注释)
"""
链家二手房数据采集器
版本:1.2
"""import requests
from bs4 import BeautifulSoup
import pandas as pd
from time import sleep# 配置请求头(模拟浏览器访问)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Accept-Language': 'zh-CN,zh;q=0.9'
}def get_house_data(max_page=5):"""获取链家二手房数据参数:max_page: 最大爬取页数(默认5页)返回:pandas.DataFrame格式的清洗后数据"""all_data = []for page in range(1, max_page+1):# 构造分页URLurl = f"https://cq.lianjia.com/ershoufang/pg{page}/"try:# 发送HTTP请求(加入延迟防止封IP)response = requests.get(url, headers=headers, timeout=10)response.raise_for_status() # 检测HTTP状态码sleep(1.5) # 请求间隔# 解析HTML文档soup = BeautifulSoup(response.text, 'lxml')# 定位房源列表house_list = soup.select('ul.sellListContent > li[data-houseid]')for house in house_list:# 数据提取(带异常处理)try:title = house.select_one('div.title a').text.strip()address = house.select_one('div.flood > div').text.strip()total_price = house.select_one('div.totalPrice').text.strip()unit_price = house.select_one('div.unitPrice').text.strip()follow = house.select_one('div.followInfo').text.split('/')[0].strip()# 数据清洗cleaned_data = {'标题': title,'地址': address.replace(' ', ''),'总价(万)': float(total_price.replace('万', '')),'单价(元/㎡)': int(unit_price.replace('元/㎡', '').replace(',', '')),'关注量': int(follow.replace('人关注', ''))}all_data.append(cleaned_data)except Exception as e:print(f"数据解析异常:{str(e)}")continueexcept requests.exceptions.RequestException as e:print(f"网络请求失败:{str(e)}")continuereturn pd.DataFrame(all_data)def save_to_excel(df, filename='house_data.xlsx'):"""将数据保存为Excel文件参数:df: pandas.DataFrame数据框filename: 输出文件名"""# 配置Excel写入参数writer = pd.ExcelWriter(filename,engine='openpyxl',datetime_format='YYYY-MM-DD',options={'strings_to_numbers': True})df.to_excel(writer,index=False,sheet_name='链家数据',float_format="%.2f",freeze_panes=(1,0))# 保存并优化列宽writer.book.save(filename)print(f"数据已保存至 {filename}")if __name__ == '__main__':# 执行数据采集house_df = get_house_data(max_page=3)# 数据保存if not house_df.empty:save_to_excel(house_df)print(f"成功采集 {len(house_df)} 条数据")else:print("未获取到有效数据")
四、关键命令详解
4.1 核心方法说明
4.1.1 pandas.to_excel参数解析
df.to_excel(excel_writer, # Excel写入器对象sheet_name='Sheet1',# 工作表名称na_rep='', # 缺失值填充float_format=None, # 浮点数格式化columns=None, # 指定输出列header=True, # 是否包含列名index=True, # 是否保留索引index_label=None, # 索引列标题startrow=0, # 起始行startcol=0, # 起始列engine=None, # 写入引擎merge_cells=True, # 合并单元格encoding=None, # 文件编码inf_rep='inf' # 无穷大表示
)
4.2 防反爬策略
# 1. 请求头伪装
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)','Accept-Encoding': 'gzip, deflate, br','Referer': 'https://cq.lianjia.com/'
}# 2. IP代理池示例
proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}# 3. 请求速率控制
import random
sleep(random.uniform(1, 3))
五、进阶优化方案
5.1 数据存储优化
# 多Sheet存储
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='重庆')df2.to_excel(writer, sheet_name='北京')# 追加模式写入
def append_to_excel(df, filename):from openpyxl import load_workbookbook = load_workbook(filename)writer = pd.ExcelWriter(filename, engine='openpyxl')writer.book = bookdf.to_excel(writer, startrow=writer.sheets['Sheet1'].max_row, index=False)writer.save()
5.2 异常监控体系
# 错误日志记录
import logging
logging.basicConfig(filename='spider.log',level=logging.ERROR,format='%(asctime)s - %(levelname)s - %(message)s'
)try:# 爬虫代码
except Exception as e:logging.error(f"严重错误:{str(e)}", exc_info=True)
六、注意事项
- 法律合规
严格遵守《网络安全法》和网站Robots协议,控制采集频率 - 数据清洗
建议增加字段校验:
def validate_price(price):return 10 < price < 2000 # 重庆房价合理范围校验
- 性能调优
- 启用多线程采集(需控制并发数)
- 使用lxml解析器替代html.parser
- 禁用BeautifulSoup的格式化功能
- 存储扩展
| 存储方式 | 优点 | 缺点 |
|---|---|---|
| Excel | 查看方便 | 大数据性能差 |
| CSV | 通用格式 | 无多Sheet支持 |
| SQLite | 轻量级数据库 | 需要SQL知识 |
| MySQL | 适合大规模存储 | 需要部署数据库 |
# 快速使用指南1. 安装依赖库:
```bash
pip install -r requirements.txt
- 运行爬虫:
python lianjia_spider.py
- 输出文件:
house_data.xlsx:清洗后的完整数据spider.log:错误日志记录
通过本方案可实现日均10万级数据的稳定采集,建议根据实际需求调整采集频率和存储方案。请务必遵守相关法律法规,合理使用爬虫技术。
相关文章:
python之爬虫入门实例
链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明: - requests&#x…...
Blender常用快捷键的汇总
一、基础操作 全选/取消全选:A(全选)、AA(连续按两次A取消全选)复制物体:Shift D(复制后需点击确认位置)移动物体:G(按X/Y/Z可约束轴向移动)旋转…...
鸿蒙启动页开发
鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...
Unity 文字高度自适应
期望 文字有字号限制,输入文字文字后先判断高度是否适用于限制字号,若处于最小字号时高度任不适用,则调整RectTransform 的高度。 核心代码 每次输入文字时先将字号设定为原始字号。 comp.fontSize fontSize; comp.text content; 拓展T…...
Teaching Small Language Models Reasoning throughCounterfactual Distillation
2024.emnlp-main.333.pdfhttps://aclanthology.org/2024.emnlp-main.333.pdf 1.概述 大型语言模型(LLM),如GPT-3,在各种下游任务中表现出色,包括通过链式思维(CoT)进行问题解答。CoT鼓励模型在解决问题时生成中间推理步骤。尽管LLM取得了成功,但由于模型大小的限制,其…...
快速开始React开发(一)
快速开始React开发(一) React是一个JavaScript库,用于构建交互式网站,并且能够快捷创建SPA(Single Page App),其组件化的思想也是被一再传播,无论是普通的Web网站还是嵌入移动端交互…...
2025最新Transformer模型及深度学习前沿技术应用
第一章、注意力(Attention)机制 1、注意力机制的背景和动机(为什么需要注意力机制?注意力机制的起源和发展里程碑)。 2、注意力机制的基本原理(什么是注意力机制?注意力机制的数学表达与基本公…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
[环境搭建篇] Windows 环境下如何安装Docker工具
Windows 环境下如何安装Docker工具 1. 检查系统要求2. 启用WSL 2和虚拟化步骤一:启用WSL步骤二:启用虚拟化(Hyper-V)步骤三:安装WSL 2内核 3. 安装Docker Desktop4. 配置Docker5. 家庭版用户替代方案6. 常见问题解决问…...
JavaScript 数组和字符串方法详解
一、数组方法 数组方法是操作数组的核心工具,分为修改原数组和返回新数组两类。 1. 常用修改原数组的方法 方法参数返回值说明示例push...items新长度末尾添加元素arr.push(4) → [1,2,3,4]pop无删除的元素删除最后一个元素arr.pop() → 3(原数组变[1,…...
达梦数据库系列之Mysql项目迁移为达梦项目
达梦数据库系列之Mysql项目迁移为达梦项目 1 达梦数据库安装及MySql数据迁移2 SpringBoot项目迁移2.1 驱动包引入2.2 驱动类配置2.3 数据源配置2.4 flowable迁移2.4.1 异常问题2.4.2 解决 3 迁移常见问题3.1 不是 GROUP BY 表达式3.1.1 dm.ini 开启Mysql兼容模式3.1.2 修改动态…...
10个实用IntelliJ IDEA插件
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是为提升开发效率推荐的10个实用IntelliJ IDEA插件,涵盖代码质量、效率工具及热门框架支持: 一、代码质量与规范 SonarLint 实时…...
10分钟从零开始搭建机器人管理系统(飞算AI)
1. 安装插件 https://www.feisuanyz.com/ 2. Intellij IDEA中运行 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3…...
[自动驾驶-传感器融合] 多激光雷达的外参标定
文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人,每个雷达的位置和姿态不同,需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系(…...
怎么让呼叫中心支持高并发
基于FreeSWITCH的呼叫中心系统并发性能优化指南 在呼叫中心系统建设中,高并发处理能力是衡量系统稳定性和效率的核心指标。作为开源软交换平台的代表,FreeSWITCH凭借其线程模型和模块化架构,天然适合高并发场景。然而,实际应用中仍…...
Elasticsearch简单学习
1、依赖的导入 <!--ES依赖--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客户端链接 RestHighLevelClient client new RestHigh…...
就像BGP中的AS_PATH一样,无论路途多远,我愿意陪你一起走——基于华为ENSP的BGP的路由负载均衡及过滤深入浅出
本篇技术博文摘要 🌟 本文内容涵盖了BGP负载均衡的基本概念、配置技巧和在实际网络中的应用,包括如何在华为ENSP上实现负载均衡和路由过滤。通过配置BGP的前缀列表、ACL以及路由过滤策略,可以实现网络流量的精确控制和优化,提高网…...
valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…...
游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...
异步操作返回原始上下文
是什么? 在讨论同步上下文执行回调的概念时,我们首先需要了解一些基本概念:同步与异步操作、上下文以及回调函数。 同步与异步操作: 同步操作是指代码按照顺序依次执行,每个操作必须等待前一个操作完成才能开始。这便…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
