asp网站开发移动端,建筑工程管理系统平台,青岛建设项目环评公示网站,php开发链家二手房数据抓取与Excel存储
目录
开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备
1.1 必要组件安装
# 安装核心库
pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明#xff1a;
- requests#x…链家二手房数据抓取与Excel存储
目录
开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备
1.1 必要组件安装
# 安装核心库
pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明
- requests网络请求库版本≥2.25.1
- beautifulsoup4HTML解析库版本≥4.11.2
- openpyxlExcel文件操作库版本≥3.1.2
- pandas数据分析库版本≥2.0.31.2 开发环境验证
import requests
from bs4 import BeautifulSoup
import pandas as pdprint(所有库加载成功)二、爬虫流程分析
2.1 技术路线图 #mermaid-svg-dSFbzOPD0BoTsUuj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .error-icon{fill:#552222;}#mermaid-svg-dSFbzOPD0BoTsUuj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dSFbzOPD0BoTsUuj .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dSFbzOPD0BoTsUuj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dSFbzOPD0BoTsUuj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dSFbzOPD0BoTsUuj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dSFbzOPD0BoTsUuj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dSFbzOPD0BoTsUuj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dSFbzOPD0BoTsUuj .marker.cross{stroke:#333333;}#mermaid-svg-dSFbzOPD0BoTsUuj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dSFbzOPD0BoTsUuj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .cluster-label text{fill:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .cluster-label span{color:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .label text,#mermaid-svg-dSFbzOPD0BoTsUuj span{fill:#333;color:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .node rect,#mermaid-svg-dSFbzOPD0BoTsUuj .node circle,#mermaid-svg-dSFbzOPD0BoTsUuj .node ellipse,#mermaid-svg-dSFbzOPD0BoTsUuj .node polygon,#mermaid-svg-dSFbzOPD0BoTsUuj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dSFbzOPD0BoTsUuj .node .label{text-align:center;}#mermaid-svg-dSFbzOPD0BoTsUuj .node.clickable{cursor:pointer;}#mermaid-svg-dSFbzOPD0BoTsUuj .arrowheadPath{fill:#333333;}#mermaid-svg-dSFbzOPD0BoTsUuj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dSFbzOPD0BoTsUuj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dSFbzOPD0BoTsUuj .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dSFbzOPD0BoTsUuj .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dSFbzOPD0BoTsUuj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dSFbzOPD0BoTsUuj .cluster text{fill:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj .cluster span{color:#333;}#mermaid-svg-dSFbzOPD0BoTsUuj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dSFbzOPD0BoTsUuj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发送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 完整代码带详细注释 链家二手房数据采集器
版本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;q0.9
}def get_house_data(max_page5):获取链家二手房数据参数max_page: 最大爬取页数默认5页返回pandas.DataFrame格式的清洗后数据all_data []for page in range(1, max_page1):# 构造分页URLurl fhttps://cq.lianjia.com/ershoufang/pg{page}/try:# 发送HTTP请求加入延迟防止封IPresponse requests.get(url, headersheaders, timeout10)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, filenamehouse_data.xlsx):将数据保存为Excel文件参数df: pandas.DataFrame数据框filename: 输出文件名# 配置Excel写入参数writer pd.ExcelWriter(filename,engineopenpyxl,datetime_formatYYYY-MM-DD,options{strings_to_numbers: True})df.to_excel(writer,indexFalse,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_page3)# 数据保存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_nameSheet1,# 工作表名称na_rep, # 缺失值填充float_formatNone, # 浮点数格式化columnsNone, # 指定输出列headerTrue, # 是否包含列名indexTrue, # 是否保留索引index_labelNone, # 索引列标题startrow0, # 起始行startcol0, # 起始列engineNone, # 写入引擎merge_cellsTrue, # 合并单元格encodingNone, # 文件编码inf_repinf # 无穷大表示
)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, engineopenpyxl)writer.book bookdf.to_excel(writer, startrowwriter.sheets[Sheet1].max_row, indexFalse)writer.save()5.2 异常监控体系
# 错误日志记录
import logging
logging.basicConfig(filenamespider.log,levellogging.ERROR,format%(asctime)s - %(levelname)s - %(message)s
)try:# 爬虫代码
except Exception as e:logging.error(f严重错误{str(e)}, exc_infoTrue)六、注意事项
法律合规 严格遵守《网络安全法》和网站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万级数据的稳定采集建议根据实际需求调整采集频率和存储方案。请务必遵守相关法律法规合理使用爬虫技术。