爬取贝壳和房天下——北京二手房在售和已成交百万级别数据(附详细思路和部分源码)

本文介绍了作者在港校做RA期间,爬取贝壳和房天下北京二手房在售和已成交数据的过程。文章涉及前期调研、网页结构分析,包括对各个平台的比较、选择原因,以及在爬取过程中遇到的iframe问题、性能优化等。最终,作者使用了request带cookies访问和多线程技术来提高爬取速度。

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

前言

在港校做RA期间,本周老师安排了爬取国内二手房的交易网站,我先调研对比了各平台,之后选取了房天下和贝壳的数据进行爬取

贝壳

房天下

贝壳需要注册登录才能访问,房天下不需要

因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据


提示:以下是本篇文章正文内容,思路和代码可供参考

一:前期调研

1.1 各二手房平台详细对比

1.1.1链家

网址:

贝壳

在售数据

在这里插入图片描述

成交:

在这里插入图片描述

列表页:

在这里插入图片描述

详情页:

例如:https://bj.lianjia.com/ershoufang/101108567289.html

分为:三个部分

  • 图片展示

在这里插入图片描述

  • 基本信息

在这里插入图片描述

  • 房源特色

在这里插入图片描述

1.1.2安居客

网址:

安居客

列表页:

在这里插入图片描述

缺点:

  • 没有在售和已成交的区分
  • 没有直观显示有多少房源
  • 网站维护有问题,我在登陆时都没法登陆,难以保障数据的实时更新
详情页:

以此为例:

https://beijing.anjuke.com/prop/view/A5183579374?from=filter&spread=commsearch_p&uniqid=pc5f27c655bde998.84281277&position=1&kwtype=filter&now_time=1596442197

分为:两个部分

  • 图片展示

在这里插入图片描述

  • 房屋信息

在这里插入图片描述

1.1.3 房天下

网址:

[房天下])https://esf.fang.com/)

列表页:

上面显示有16万套待售,但真实性存疑,我查阅此软件评价较差,存在数据造假的问题

本网站也没有已成交的房源信息,不够全面

在这里插入图片描述

详情页:

感觉对房源的介绍极为敷衍随意,不如其他平台的仔细介绍,真实感较差

在这里插入图片描述

1.1.4贝壳网

网址:

贝壳网

在售:

在这里插入图片描述

已成交:

在这里插入图片描述

详情页:

贝壳的二手房详情更为丰富,网页主体分为四个部分,:

  • 图片展示区

在这里插入图片描述

  • 房源基本信息

在这里插入图片描述

  • 房源特色:

在这里插入图片描述

  • 户型空间

在这里插入图片描述

1.2 综合评价

贝壳网和链家是多名网友较为推崇的两个平台,经过查询,两个平台的数据相差不大,且都有在售和已成交的数据

而其他平台,网友评价较低,主要原因为数据造假,在本次查询中也出现此问题

链家和贝壳在房源数据方面,展示极为清晰,方便我们获知总成交数量,在详情页的介绍也明显比其他两个平台更加翔实,真实性,可靠性更高

1.3 最后需求确定

和老师进一步讨论之后,我们最后选择了贝壳和房天下,爬取北京市 近两年的二手房的在售和已成交

本次需求是先将新闻的概览信息保存到EXCEL文件,最后格式如下

   |标题|时间|报社|版面号|版面信息|文章描述|正文url|

在这里插入图片描述
因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据

在保存上述简要信息的时候,我便将正文的url保存进txt文件,方便后续直接读写txt进行正文爬取

这种设计模式我觉得是做到了不同模块的解耦,如果有朋友有更好的想法也可以和我交流

最后正文保存格式如下:
按照 关键词-报道报社 - 新闻标题-正文 保存
在这里插入图片描述
因课题保密的要求,数据和完整代码无法分享,如果有需要的朋友或老师可以联系我个人微信(liguopingHNU)进行定制化爬取数据

二:网页结构的分析

2.1 网站首页

目标的url 为 :

http://www.apabi.com/pku/?pid=usp.advsearch&db=newspaper&cult=CN

除了pku 是不同机构或高校会改变这个字段,在检索查看的其他过程中,本url不变,完全使用Ajax的异步加载

给我们的自动化翻页,匹配信息,查询都带来了极大的挑战

在这里插入图片描述

我使用了request进行测试,发现没有办法获取到返回的信息,页面总是不相符,测试了好久,一直没有得到正确的内容

一筹莫展之际,我只能使用selenium就行匹配(但这也给后续的爬去埋下了一个巨大的坑)

查看网页源代码发现,请求之后,返回的是iframe,直接更新下面的搜索结果,我们需要的信息是在iframe里面去进行匹配,如果直接匹配页面的话,是匹配不到的

Selenium的好处是所见即所得,但是因为是模仿人的点击,速度极慢,而且书写代码时非常繁杂,点击选项时可能就是网页滑动了一下,便导致定位错误,无法匹配

2.2 使用selenium访问

以下是模拟点击页面的代码,可以看到匹配元素时非常麻烦

driver_path = r"G:\Daily_Life\Google_driver\chromedriver.exe"

def config(head_keyword,con_keyword,office_key):
    url = "http://www.apabi.com/pku/?pid=usp.advsearch&db=newspaper&cult=CN"
    
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    try:
        driver = webdriver.Chrome(executable_path=driver_path,chrome_options=chrome_options)

        driver.get(url)
        time.sleep(1)
        
        webdriver.common.action_chains.ActionChains(driver)
        
        #保存详细信息结果
        rows=[]
        #保存文章
        arts = []
        
        #报纸
### 如何用 Python 爬虫抓取贝壳挂牌及成交数据 为了实现对贝壳平台上的二手房挂牌成交数据爬取,可以按照以下方法设计并实施爬虫程序。 #### 数据目标定义 在开始编写爬虫前,需明确所需的数据字段。根据已有资料[^1],常见的目标数据包括但不限于:源基本信息(如地址、面积、朝向)、挂牌价格、历史成交记录以及相关标签等。 #### 技术选型与工具准备 通常情况下,Python 的 `requests` `BeautifulSoup` 是最常用的网页解析组合之一;如果页面加载依赖 JavaScript,则可能需要用到 Selenium 或 Pyppeteer 来模拟浏览器行为。此外,还需要安装一些辅助库来处理 JSON 格式的 API 响应或者存储结构化数据数据库中。 #### 实现步骤概述 以下是构建此类爬虫的一些关键技术要点: 1. **发送请求** 使用 requests 库发起 GET 请求访问指定 URL 地址,并设置合适的 headers 参数模仿真实用户的浏览习惯以减少被封禁的风险。 2. **解析 HTML/XML 文档** 利用 BeautifulSoup 解析返回的内容提取有用的信息片段。假设这些信息分布在特定 class 属性下的 div 元素里,则可以通过 find_all 方法定位它们。 3. **处理分页逻辑** 循环遍历每一页的结果直到最后一页为止。注意观察翻页按钮链接模式的变化规律以便动态生成下一页URL。 4. **保存结果** 将收集来的各项指标存入 CSV 文件或者是关系型数据库表单之中方便后续统计分析操作。 下面给出一段简单的代码示例用于演示基本流程: ```python import csv from bs4 import BeautifulSoup as soup import requests def get_page(url): try: response = requests.get(url, timeout=30) if response.status_code == 200: return response.text else: print(f"Failed to load page {url}") return None except Exception as e: print(e) def parse_html(html_content): data_list = [] sp = soup(html_content,"lxml") items = sp.find_all('div',class_='item') # 这里的 item 需要替换为实际项目中的具体类名 for i in range(len(items)): title = items[i].find('h3').text.strip() price = items[i].select_one('.price .total').string record={ 'title':title, 'price':float(price.replace(',','')) } data_list.append(record) return data_list if __name__=='__main__': base_url="https://bj.ke.com/ershoufang/pg{}" all_data=[] for pagenum in range(1,5): # 只做简单测试,默认只看前四页 url_to_scrape = base_url.format(pagenum) html=get_page(url_to_scrape) parsed_results=parse_html(html) all_data.extend(parsed_results) keys=all_data[0].keys() with open('ke_bei_jing.csv', mode='w', newline='', encoding='utf8')as output_file: dict_writer =csv.DictWriter(output_file,fieldnames=keys) dict_writer.writeheader() dict_writer.writerows(all_data) ``` 上述脚本仅作为入门级参考模型,在正式部署生产环境之前还需考虑更多细节优化比如异常捕获机制完善度提升等方面的工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值