手把手教你用Python网络爬虫爬取新房数据

2023-10-08 23:50

本文主要是介绍手把手教你用Python网络爬虫爬取新房数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

念天地之悠悠,独怆然而涕下。

项目背景

大家好,我是J哥。

新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备。

今天J哥以「惠民之家」为例,手把手教你利用Python将惠州市新房数据批量抓取下来,共采集到近千个楼盘,包含楼盘名称、销售价格、主力户型、开盘时间、容积率、绿化率等「41个字段」。数据预览如下:

后台回复「新房」二字,可领取本文代码。

项目目标

惠民之家首页网址:

http://www.fz0752.com/

新房列表网址:

http://www.fz0752.com/project/list.shtml

选择一个新房并点击「详情信息」即可找到目标字段:

项目准备

软件:Pycharm

第三方库:requests,fake_useragent,lxml

网站地址:http://www.fz0752.com/

网页分析

列表页分析

打开新房列表网页,点击「下一页」后,网址变成:

http://www.fz0752.com/project/list.shtml?state=&key=&qy=&area=&danjia=&func=&fea=&type=&kp=&mj=&sort=&pageNO=2

很显然,这是静态网页,翻页参数为「pageNO」,区域参数为「qy」,其余参数也很好理解,点击对应筛选项即可发现网页链接变化。咱们可以通过遍历区域和页码,将新房列表的房源URL提取下来,再遍历这些URL,抓取到每个房源的详情信息。

详情页分析

选择一个新房URL,点击进去,链接如下:

http://newhouse.fz0752.com/fontHtml/html/project/00020170060.html

即这个新房的id为「00020170060」,再点击详情信息,链接变为:

http://newhouse.fz0752.com/project/detail.shtml?num=20170060

即这个新房的「详情信息」的id为「20170060」,我们可以大胆假设这个id就是新房id截取的一部分。多找几个新房点击尝试,很容易验证这个规律。

反爬分析

相同的ip地址频繁访问同一个网页会有被封风险,本文采用fake_useragent,将随机生成的User-Agent请求头去访问网页,将减少ip封锁的风险。

代码实现

导入爬虫相关库,定义一个主函数,构建区域列表(不同区域对应不用的区域id),遍历并用requests去请求由区域参数和页码参数拼接的URL。这里将页码设置50上限,当遍历的某个房源URL长度为0(即不存在新房数据)时,直接break,让程序进行下一个区域的遍历,直至所有数据抓取完毕,程序停止。

# -*- coding = uft-8 -*-
# @Time : 2020/12/21 9:29 下午
# @Author : J哥
# @File : newhouse.pyimport csv
import time
import random
import requests
import traceback
from lxml import etree
from fake_useragent import UserAgentdef main():#46:惠城区,47:仲恺区,171:惠阳区,172:大亚湾,173:博罗县,174:惠东县,175:龙门县qy_list = [46,47,171,172,173,174,175]for qy in qy_list:   #遍历区域for page in range(1,50):   #遍历页数url = f'http://www.fz0752.com/project/list.shtml?state=&key=&qy={qy}&area=&danjia=&func=&fea=&type=&kp=&mj=&sort=&pageNO={page}'response = requests.request("GET", url, headers = headers,timeout = 5)print(response.status_code)if response.status_code == 200:re = response.content.decode('utf-8')print("正在提取" + str(qy) +'第' + str(page) + "页")#time.sleep(random.uniform(1, 2))print("-" * 80)# print(re)parse = etree.HTML(re)get_href(parse,qy)num = ''.join(parse.xpath('//*[@id="parent-content"]/div/div[6]/div/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/a/@href'))print(len(num))if len(num) == 0:breakif __name__ == '__main__':ua = UserAgent(verify_ssl=False)headers = {"User-Agent": ua.random}time.sleep(random.uniform(1, 2))main()

发送请求,获取新房列表网页,并解析到所有新房URL,同时将新房id替换为详情信息id。在程序运行中发现有少数新房URL不一致,因此这里做了判断,修改后可以获取完整的详情信息id,并拼接出对应的URL。

def get_href(parse,qy):items = parse.xpath('//*[@id="parent-content"]/div/div[6]/div/div[1]/div[2]/div')try:for item in items:href = ''.join(item.xpath('./div[2]/div[1]/div[1]/a/@href')).strip()print("初始href为:",href)#print(len(href))if len(href) > 25:href1 = 'http://newhouse.fz0752.com/project/detail.shtml?num=' + href[52:].replace(".html","")else:href1 = 'http://newhouse.fz0752.com/project/detail.shtml?num=' + href[15:]print("详情href为:",href1)try:get_detail(href1,qy)except:passexcept Exception:print(traceback.print_exc())

打印结果如下:

详情信息URL找到后,定义一个函数去请求详情页数据,同时携带qy参数,最后将其保存到csv中。

def get_detail(href1,qy):time.sleep(random.uniform(1, 2))response = requests.get(href1, headers=headers,timeout = 5)if response.status_code == 200:source = response.texthtml = etree.HTML(source)

开始解析详情页中的各个字段,这里用到xpath进行数据解析,由于需要解析的字段太多,高达41个,限于篇幅,以下仅给出部分字段解析代码。当然,其他字段解析基本一样。

#项目状态
try:xmzt = html.xpath('//*[@id="parent-content"]/div/div[3]/div[3]/div[1]/div[1]/text()')[0].strip()
except:xmzt = None
#项目名称
try:name = html.xpath('//*[@id="parent-content"]/div/div[3]/div[3]/div[1]/h1/text()')[0].strip()
except:name = None
#项目简介
ps = html.xpath('//*[@id="parent-content"]/div/div[3]/div[5]/div[2]/div')
for p in ps:try:xmjj = p.xpath('./p[1]/text()')[0].strip()except:xmjj = None
infos = html.xpath('//*[@id="parent-content"]/div/div[3]/div[5]/div[1]/div/table/tbody')
for info in infos:#行政区域try:xzqy = info.xpath('./tr[1]/td[1]/text()')[0].strip()except:xzqy = None#物业类型try:wylx = info.xpath('./tr[2]/td[1]/text()')[0].strip()except:wylx = None#销售价格try:xsjg = info.xpath('./tr[3]/td[1]/text()')[0].strip()except:xsjg = None······data = {'xmzt':xmzt,'name':name,'xzqy':xzqy,······'qy':qy}print(data)

解析完数据后,将其置于字典中,打印结果如下:然后追加保存为csv:

try:with open('hz_newhouse.csv', 'a', encoding='utf_8_sig', newline='') as fp:fieldnames = ['xmzt','name','xzqy',······,'qy']writer = csv.DictWriter(fp, fieldnames = fieldnames)writer.writerow(data)
except Exception:print(traceback.print_exc())

当然,我们也可以读取csv文件,并写入Excel:

df = pd.read_csv("newhouse.csv",names=['name','xzqy','wylx',······,'state'])
df = df.drop_duplicates()
df.to_excel("newhouse.xlsx",index=False)

总结

  1. 本文基于Python爬虫技术,提供了一种更直观的抓取新房数据的方法。

  2. 不建议抓取太多,容易使得服务器负载,浅尝辄止即可。

  3. 如需本文完整代码,后台回复「新房」两个字即可获取。

------------------- End -------------------

往期精彩文章推荐:

  1. 反爬虫策略手把手教你使用FastAPI来限制接口的访问速率

  2. 一篇文章带你解锁Python库中操作系统级别模块psutil

  3. 盘点5种基于Python生成的个性化语音方法

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~

这篇关于手把手教你用Python网络爬虫爬取新房数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/168819

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常