python之爬虫入门实例

news2025/3/6 16:06:41

链家二手房数据抓取与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 开发环境验证

import requests
from bs4 import BeautifulSoup
import pandas as pd

print("所有库加载成功!")

二、爬虫流程分析

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

"""
链家二手房数据采集器
版本: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):
        # 构造分页URL
        url = 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)}")
                    continue
        
        except requests.exceptions.RequestException as e:
            print(f"网络请求失败:{str(e)}")
            continue
    
    return 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_workbook
    book = load_workbook(filename)
    writer = pd.ExcelWriter(filename, engine='openpyxl')
    writer.book = book
    df.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)

六、注意事项

  1. 法律合规
    严格遵守《网络安全法》和网站Robots协议,控制采集频率
  2. 数据清洗
    建议增加字段校验:
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.coloradmin.cn/o/2310599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】

大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题&#xff0c;包含&#xff1a;• 社会偏见&#xff08;Social Bias&#xff09;LLM在生成文本时强化对特定社会群体的刻板印象&#xff0c;例如将穆斯林与恐怖主义关联&#xff0c;或…

SPI驱动(三) -- SPI设备树处理过程

文章目录 参考资料&#xff1a;一、SPI设备树节点构成二、SPI设备树示例2.1 SPI控制器节点属性2.2 SPI设备节点属性 三、SPI设备树处理过程四、总结 参考资料&#xff1a; 内核头文件&#xff1a;include\linux\spi\spi.h内核文档&#xff1a;Documentation\devicetree\bindin…

MARL零样本协调之Fictitious Co-Play学习笔记

下列引用来自知乎作者Algernon 知乎link FCP作为ZSC领域两阶段训练方法的开创者 论文《Collaborating with Humans without Human Data》来自 NeurIPS 2021。这篇论文提出 Fictitious Co-Play (FCP) 来解决 ZSC 问题。论文认为&#xff0c;ZSC 的第一个重要问题是对称性&#x…

idea中的查看git历史记录,不显示详细信息

一、正常情况显示 1、idea中git查看history正常显示如下图&#xff1a; 二、非正常情况下显示 1、idea中git查看history&#xff0c;现在不显示提交的历史文件详细信息&#xff0c;如下图&#xff1a; 三、解决方式 1、找到如下窗口中画红色框的黑色线条&#xff0c;鼠标放在…

Redis——快速入门

目录 Redis简介 安装配置(Windows) GUI工具RedisInsight的使用 十大数据类型&#xff08;5基本5高级&#xff09; 字符串String 列表List 集合Set(S) 有序集合SortedSet(Z) 哈希Hash(H) 发布订阅模式 消息队列Stream(X) 地理空间Geospatial(GEO) HyperLogLog(PF) …

LLM 模型 Prompt 工程

目录 1、Prompt 基础概念 2、Prompt 主要构成 3、Prompt 相关技术 3.1、思维链 3.2、自洽性 3.3、思维树 1、Prompt 基础概念 Prompt 工程是通过设计和优化自然语言提示&#xff08;Prompt&#xff09;&#xff0c;引导LLM生成符合特定任务需求的输出的技术。其核心目标是…

Vue中实现大文件的切片并发下载和下载进度展示

Vue中实现大文件的切片下载 切片下载需要后端提供两个接口&#xff0c;第一个接口用来获取当前下载文件的总切片数&#xff0c;第二个接口用来获取具体某一个切片的内容。 界面展示 数据流展示 代码 接口 // 切片下载-获取文件的总切片数 export function getChunkDownload…

开源表单、投票、测评平台部署教程

填鸭表单联合宝塔面板深度定制,自宝塔面板 9.2 版本开始,在宝塔面板-软件商店中可以一键部署填鸭表单系统。 简单操作即可拥有属于自己的表单问卷系统,快速赋能业务。即使小白用户也能轻松上手。 社区版体验地址:https://demo.tduckapp.com/home 前端项目地址: tduck-fro…

GaussDB性能调优技术指南

​一、性能调优核心目标 ​降低响应时间&#xff1a;缩短单次查询或事务的处理时间&#xff08;如从秒级优化到毫秒级&#xff09;。 ​提高吞吐量&#xff1a;支撑更高并发请求&#xff08;如从千次/秒提升到百万次/秒&#xff09;。 ​资源高效利用&#xff1a;减少 CPU、…

【后端开发】go-zero微服务框架实践(goland框架对比,go-zero开发实践,文件上传问题优化等等)

【后端开发】go-zero微服务框架实践&#xff08;goland框架对比&#xff0c;go-zero开发实践&#xff0c;文件上传问题优化等&#xff09; 文章目录 1、go框架对比介绍2、go-zero 微服务开发实践3、go-zero 文件上传问题优化 1、go框架对比介绍 国内开源goland框架对比 1 go-…

C#—csv文件格式操作实例【在winform表格中操作csv】

C#—csv文件格式操作实例【在winform表格中操作csv】 实例一 实例效果 当在winform界面中点击读取按钮时 将csv中的所有数据读取出来放置在datagridview控件&#xff0c;可以在datagridview控件中编辑数据&#xff0c;当点击保存按钮时 将datagridview控件中的所有数据存储在…

一周学会Flask3 Python Web开发-WTForms表单验证

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…

23种设计模式一览【设计模式】

文章目录 前言一、创建型模式&#xff08;Creational Patterns&#xff09;二、结构型模式&#xff08;Structural Patterns&#xff09;三、行为型模式&#xff08;Behavioral Patterns&#xff09; 前言 设计模式是软件工程中用来解决特定问题的一组解决方案。它们是经过验证…

GPIO及其应用

GPIO及其应用 文章目录 GPIO及其应用1.GPIO概括2.GPIO工作基本结构3.GPIO寄存器3.1寄存器总览3.2寄存器功能3.3BIT简写的代表 4.GPIO的电气特性4.1拉电流与灌电流4.2驱动大功率负载4.3电平逻辑兼容性 5.LED闪烁(实操)6.LED交替闪烁&#xff08;实操&#xff09;7.开关控制LED灯…

NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别

1. 说⼀下你理解的 C 中的四种智能指针 智能指针的作用是管理指针&#xff0c;可以避免内存泄漏的发生。 智能指针就是一个类&#xff0c;当超出了类的作用域时&#xff0c;就会调用析构函数&#xff0c;这时就会自动释放资源。 所以智能指针作用的原理就是在函数结束时自动释…

Vue 关于如何在vue中实现跨域请求问题

&#x1f4da;首先&#xff0c;让我们了解一下什么是跨域。当一个请求的URL的协议、域名、端口三者中任意一个与当前页面的URL不同&#xff0c;就称为跨域请求。 &#x1f512;为什么会出现跨域问题呢&#xff1f;这是因为浏览器的同源策略限制。同源策略是浏览器最核心的安全…

毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

torch.einsum 的 10 个常见用法详解以及多头注意力实现

torch.einsum 是 PyTorch 提供的一个高效的张量运算函数&#xff0c;能够用紧凑的 Einstein Summation 约定&#xff08;Einstein Summation Convention, Einsum&#xff09;描述复杂的张量操作&#xff0c;例如矩阵乘法、转置、内积、外积、批量矩阵乘法等。 1. 基本语法 tor…

【DeepSeek】一文详解GRPO算法——为什么能减少大模型训练资源?

GRPO&#xff0c;一种新的强化学习方法&#xff0c;是DeepSeek R1使用到的训练方法。 今天的这篇博客文章&#xff0c;笔者会从零开始&#xff0c;层层递进地为各位介绍一种在强化学习中极具实用价值的技术——GRPO&#xff08;Group Relative Policy Optimization&#xff09…

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!

Ollama 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…