python之爬虫入门实例

devtools/2025/3/13 21:12:27/

链家二手房数据抓取与Excel存储

目录

  1. 开发环境准备
  2. 爬虫流程分析
  3. 核心代码实现
  4. 关键命令详解
  5. 进阶优化方案
  6. 注意事项与扩展

一、开发环境准备

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 开发环境验证

python">import requests
from bs4 import BeautifulSoup
import pandas as pdprint("所有库加载成功!")

二、爬虫流程分析

2.1 技术路线图

发送HTTP请求
获取HTML源码
解析房源列表
提取字段数据
数据清洗
存储Excel

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 完整代码(带详细注释)

python">"""
链家二手房数据采集器
版本: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参数解析
python">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 防反爬策略

python"># 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 数据存储优化

python"># 多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 异常监控体系

python"># 错误日志记录
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)

六、注意事项

  1. 法律合规
    严格遵守《网络安全法》和网站Robots协议,控制采集频率
  2. 数据清洗
    建议增加字段校验:
python">def validate_price(price):return 10 < price < 2000  # 重庆房价合理范围校验
  1. 性能调优
    • 启用多线程采集(需控制并发数)
    • 使用lxml解析器替代html.parser
    • 禁用BeautifulSoup的格式化功能
  2. 存储扩展
存储方式优点缺点
Excel查看方便大数据性能差
CSV通用格式无多Sheet支持
SQLite轻量级数据库需要SQL知识
MySQL适合大规模存储需要部署数据库

# 快速使用指南1. 安装依赖库:
```bash
pip install -r requirements.txt
  1. 运行爬虫
python lianjia_spider.py
  1. 输出文件:
  • house_data.xlsx:清洗后的完整数据
  • spider.log:错误日志记录

通过本方案可实现日均10万级数据的稳定采集,建议根据实际需求调整采集频率和存储方案。请务必遵守相关法律法规,合理使用爬虫技术。

http://www.ppmy.cn/devtools/166854.html

相关文章

【计算机网络】UDP

1.基本概念 UDP全名叫做用户数据报协议&#xff0c;它是存在于传输层的一个协议 2.核心特点 无连接 它不用像TCP那样每次发送数据之前都需要建立连接&#xff0c; 不可靠传输 这也叫尽最大努力交付&#xff0c;也就是UDP无法保证数据的完整和有序传输&#xff0c;只能尽自…

重生之我在学Vue--第6天 Vue 3 状态管理(Pinia)

重生之我在学Vue–第6天 Vue 3 状态管理&#xff08;Pinia&#xff09; 文章目录 重生之我在学Vue--第6天 Vue 3 状态管理&#xff08;Pinia&#xff09;前言一、Pinia 核心概念速览1.1 为什么需要状态管理&#xff1f;1.2 Pinia 核心三要素 二、Pinia 快速上手2.1 安装与初始化…

[动手学习深度学习]13.丢弃法 Dropout

权重衰退是常见处理过拟合的方法 丢弃法比权重衰退效果要好 动机 一个好的模型 需要第输入数据的扰动具有鲁棒性 使用有噪音的数据等价于Tikhonov正则丢弃法&#xff1a;在层之间加入噪音 &#xff08;所以丢弃法其实是一个正则&#xff09; 无偏差的加入噪音 对x加入噪音…

重新认识OpenCV:C++视角下的历史演进、功能特性以及OpenCV 4.11新特性

&#xff08;基于2025年最新技术动态&#xff0c;面向工业级C开发者&#xff09; 一、OpenCV的历史迭代与技术定位 自1999年英特尔实验室诞生以来&#xff08;记住这个人-加里 布拉德斯基&#xff0c;是他怀揣着美好愿景启动了这个项目&#xff09;&#xff0c;OpenCV已成长…

leetcode日记(92)从前序与中序遍历序列构造二叉树

想了很久很久&#xff0c;其实思路很简单&#xff0c;应该是在数据结构上讲过的方法。 意思是前序遍历中&#xff0c;正中间一定是第一位&#xff0c;而中序遍历&#xff0c;正中间在中间位置&#xff0c;将左右节点分开。 有了这个思路就好做了。 每次取前序遍历的下一位&a…

Pygame实现射击鸭子游戏3-1

基于pygame的打鸭子游戏如图1所示。 图1 打鸭子游戏 从图1中可以看出&#xff0c;玩家通过鼠标控制瞄准镜的移动&#xff0c;点击鼠标左键射击鸭子。而鸭子则从屏幕左边向右边游动&#xff0c;当游到屏幕右侧边界后&#xff0c;重新回到屏幕左侧继续游动。 游戏需要创建两个类…

【每日学点HarmonyOS Next知识】类型判断、刘海高度、隐私弹窗、滑动下一页效果、清楚缓存

1、HarmonyOS instanceof判断错误&#xff1f; ArkTS部分支持instanceof&#xff0c;可参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5 instanceof运算符在传递的过程中可能会发生以下情况&…

CTFHub-上传文件

打开网址 新建一个文档&#xff0c;在其中写下面的内容&#xff0c;将名字该为1.php <?php eval($_POST[cmd]);?> 将1.php提交上去&#xff0c;发现没反应 按f12查看后发现没有提交的代码&#xff0c;右键编辑&#xff0c;自己写一个 <input type"submit"…