爬虫案例4——爬取房天下数据
简介:个人学习分享,如有错误,欢迎批评指正
任务:从房天下网中爬取小区名称、地址、价格和联系电话
目标网页地址:https://newhouse.fang.com/house/s/
一、思路和过程
目标网页具体内容如下:
我们的任务是将上图中小区名称、地址、价格和联系电话对应爬下来。
1.定义目标URL
由于网页普遍具有反爬程序,不加修饰的直接访问网页可能会失败,所以第一步学会伪装自己。
如何伪装自己呢,可以通过找到正常访问网页时的访问状态,将自己的这次爬虫模拟成一次正常访问网页,因此我们的目标是找到正常访问网页时的User-Agent。User Agent中文名为用户代理,(简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等)。User-Agent就是你访问网页的身份证明
。具体操作如下:
首先打开目标(/任意)网页,然后点击鼠标右键后选择检查打开网页的HTML 页面。
在HTML 页面里面依次点击网络,然后任意点一条网络请求(如果没有显示任何网络请求可以点击网页左上角的刷新),然后选择标头,下拉列表找到User-Agent,User-Agent后面那段内容就是我们用来伪装自己的身份码。
2.发送GET请求获取网页内容
通过上面的步骤我们获得了
url
= ‘https://newhouse.fang.com/house/s/’
User-Agent
:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0’
接下来发起网页访问请求,代码如下:
import requests # 引入requests库,用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块,用于解析HTML文档# 定义目标URL,即要爬取的网页地址
url = 'https://newhouse.fang.com/house/s/'# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}# 发送GET请求获取网页内容,并将响应内容存储在resp变量中
resp = requests.get(url, headers=headers)
# 设置响应内容的编码格式为utf-8,确保中文字符正常显示
resq.encoding = 'utf-8'
# 打印响应内容,检查获取到的HTML文本
print(resp.text)
查看print结果,我们发现成功获得了网页相关的html表达,
3.分析网页内容
接下来对html进行解析获得我们目标内容。
这里,我们需要借助工具xpath来辅助内容解析,xpath安装教程
安装成功后,按Ctrl+Shift+Alt 启动 xpath,网页上方出现如下图所示框,
找到目标内容方法
例:我们的目标是找到小区名字在html中的位置。点击如下图左边标记(1),该命令的含义是在网页中选择一个元素以进行检查,即当你把鼠标放在网页的某一位置,下面也会自动定位到html中该内容所在位置,如图所示,把鼠标放在北京城建·星誉BEIJING(2),下面显示小区名在html中所在位置(3)。
明确目标内容的位置。具体的,如下图所示,小区名北京城建·星誉BEIJING,它位于div class="nlcd_name"中的a里面。
因此,我们可以通过这个层层关系来找到目标所有小区名,借助刚才安装的工具xpath,下面一步步演示层层查找过程。
首先,在query中添加//div[@class=“nlcd_name”],可以发现右边的results将所有小区的名字返回了。
其次,加上筛选条件a得
同理,query中添加//div[@class=“nlcd_name”],可以发现右边的results将所有小区的地址返回了。
同理,query中添加//div[@class=“nhouse_price”],可以发现右边的results将所有小区的价格返回了。
同理,query中添加//div[@class=“tel”]/p/text(),可以发现右边的results将所有小区的联系方式返回了。
但是,我们发现上面只能取到单页的内容,而整个网页如下有很多页。
对于上述问题,我们通过对比下图情况,发现url地址不同的页码的url仅仅换了最后一个数字,数字即对应页码。
因此进一步添加一个for循环来取得所有页的url地址,代码如下:
for i in range(4):# 构建每一页的URLurl = f'https://newhouse.fang.com/house/s/b9{i}/'# 发送GET请求获取网页内容,并将响应内容存储在resq变量中resq = requests.get(url, headers=headers)# 设置响应内容的编码格式为utf-8,确保中文字符正常显示resq.encoding = 'utf-8'# 打印响应内容,检查获取到的HTML文本print(resq.text)
因此,通过xpath的可视化辅助,得上面地址
//div[@class="nlcd_name"]/a
可以获取小区名称,//div[@class="address"]/a/@title
可以获取小区地址,//div[@class="nhouse_price
可以获取小区价格,//div[@class="tel"]/p/text()
可以获取小区联系电话。
4.获取目标数据
上一步得到了目标数据的地址,接下来就是分别获得到目标数据,代码如下:
# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象e = etree.HTML(resq.text)# 使用XPath语法从HTML文档中提取出小区名称,并去除字符串前后的空白字符names = [n.strip() for n in e.xpath('//div[@class="nlcd_name"]/a/text()')]# 使用XPath语法从HTML文档中提取出小区地址addreses = e.xpath('//div[@class="address"]/a/@title')# 使用XPath语法从HTML文档中提取出小区价格,并去除多余的空白字符price = [pr.xpath('string(.)').strip() for pr in e.xpath('//div[@class="nhouse_price"]')]# 使用XPath语法从HTML文档中提取出联系电话tel = e.xpath('//div[@class="tel"]/p/text()')
5.保存数据
存为一个txt文件
with open('fangtianxia.txt', 'w', encoding='utf-8') as f:# 使用zip函数将名称、地址、价格、电话数据组合在一起,逐行写入文件for na, ad, pr, te in zip(names, addreses, price, tel):# 写入格式为:红球号码:xxx 蓝球号码:xxxf.write(f'姓名:{na} 地址:{ad} 价格:{pr} 电话:{te}\n')
二、完整python代码
import requests # 引入requests库,用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块,用于解析HTML文档
import pandas as pd # 引入pandas库,用于处理和存储数据# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}# 初始化一个空列表,用于存储爬取的数据
data = []# 循环遍历4个页面,每个页面的URL末尾数字依次递增
for i in range(4):# 构建每一页的URLurl = f'https://newhouse.fang.com/house/s/b9{i}/'# 发送GET请求获取网页内容,并将响应内容存储在resq变量中resq = requests.get(url, headers=headers)# 设置响应内容的编码格式为utf-8,确保中文字符正常显示resq.encoding = 'utf-8'# 打印响应内容,检查获取到的HTML文本print(resq.text)# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象e = etree.HTML(resq.text)# 使用XPath语法从HTML文档中提取出小区名称,并去除字符串前后的空白字符names = [n.strip() for n in e.xpath('//div[@class="nlcd_name"]/a/text()')]# 使用XPath语法从HTML文档中提取出小区地址addreses = e.xpath('//div[@class="address"]/a/@title')# 使用XPath语法从HTML文档中提取出小区价格,并去除多余的空白字符price = [pr.xpath('string(.)').strip() for pr in e.xpath('//div[@class="nhouse_price"]')]# 使用XPath语法从HTML文档中提取出联系电话tel = e.xpath('//div[@class="tel"]/p/text()')with open('fangtianxia.txt', 'w', encoding='utf-8') as f:# 使用zip函数将名称、地址、价格、电话数据组合在一起,逐行写入文件for na, ad, pr, te in zip(names, addreses, price, tel):# 写入格式为:红球号码:xxx 蓝球号码:xxxf.write(f'姓名:{na} 地址:{ad} 价格:{pr} 电话:{te}\n')
结~~~
相关文章:

爬虫案例4——爬取房天下数据
简介:个人学习分享,如有错误,欢迎批评指正 任务:从房天下网中爬取小区名称、地址、价格和联系电话 目标网页地址:https://newhouse.fang.com/house/s/ 一、思路和过程 目标网页具体内容如下: …...

网络硬盘录像机NVR程序源码NVR全套运用方案
在当今社会,随着科技的飞速发展和人们对安全需求的日益增长,安防监控系统已成为保障公共安全、维护社会稳定的重要手段。其中,网络视频录像机(NVR)作为安防监控系统的核心设备,其智能化升级运用方案对于提高…...

03:电容的充放电特性及应用举例
1.电容的基本特性:电容两端的电压不能突变 2.影响电容两端电压的参数:整个回路中电阻,电容大小 3.如何计算电容的电压变化时间? τRC R1k C1uF 则得到τ1ms的时间 应用:芯片使能延时...

【专题】2023-2024中国游戏企业研发竞争力报告合集PDF分享(附原数据表)
原文链接: https://tecdat.cn/?p37447 在当今的数字时代,游戏产业已然成为经济与文化领域中一股不可忽视的重要力量。2023 年,中国自研游戏市场更是呈现出一片繁荣且复杂的景象,实际销售收入达到了令人瞩目的 2563.8 亿元&#x…...

会话跟踪方案:Cookie Session Token
什么是会话技术? Cookie 以登录为例,用户在浏览器中将账号密码输入并勾选自动登录,浏览器发送请求,请求头中设置Cookie:userName:张三 ,password:1234aa ,若登录成功,服务器将这个cookie保存…...

jemeter压力测试入门
1. 安装jemeter的压缩包并且解压 点击运行 2. 添加线程组 3. 线程组的参数设置 4. 添加http请求 5. 填写请求信息 添加监听器——结果树(结果),聚合报告(吞吐量报告) 6. 通过cvs数据文件设置,配置元件&…...

SpringBoot3 简单集成 Spring AI 并使用
文章目录 准备JDK17api key 创建项目编写配置文件创建controller启动并测试角色预设流式响应\异步响应ChatModel(聊天模型)ImageModel(文生图)文生语音语言翻译多模态Function Calling (函数调用第三方API)…...

【C/C++】程序设计基础知识(数据类型与表达式、控制语句、数组与结构)
【C/C】程序设计基础知识(数据类型与表达式、控制语句、数组与结构) 一、数据类型与表达式1.1C语言符号1.2C语言运算符1.3数据类型1.4常量与变量1.5基本运算1.6优先级和结合性1.7输入与输出 二、控制语句2.1顺序结构2.2选择结构2.3循环结构2.4break,cont…...
python库——sklearn的关键组件和参数设置
文章目录 模型构建线性回归逻辑回归决策树分类器随机森林支持向量机K-近邻 模型评估交叉验证性能指标 特征工程主成分分析标准化和归一化 scikit-learn,简称sklearn,是Python中一个广泛使用的机器学习库,它建立在NumPy、SciPy和Matplotlib这些…...

CAS-ViT实战:使用CAS-ViT实现图像分类任务(一)
摘要 在视觉转换器(Vision Transformers, ViTs)领域,随着技术的不断发展,研究者们不断探索如何在保持高效性能的同时,降低模型的计算复杂度,以满足资源受限场景(如移动设备)的需求。…...
处理数组下标的代码
以下是某个Ada编译器生成的一段汇编代码: mov ecx, eaxmov ebx, eaxsar ebx, 1Fhmov edx, ebxsar edx, 1Fhnot edxmov eax, edxsar eax, 1Fhand ecx, eax以上代码相当于以下C代码: ecx ((~(eax >> 62) >&…...

数学建模算法总结
数学建模常见算法总结 评价决策类模型 层次分析法 层次分析法根据问题的性质和要达到的总目的,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成一个多层次的分析结构模型,从…...
代码随想录算法训练营第五十五天 | 并查集理论基础、107. 寻找存在的路径
一、并查集理论基础 文章链接:并查集理论基础 | 代码随想录 (programmercarl.com) 二、107. 寻找存在的路径 题目连接:107. 寻找存在的路径 (kamacoder.com) 文章讲解:代码随想录 (programmercarl.com)——107. 寻找存在的路径...

ROS_package 、CMakeLists.txt、package.xml、ROS_node之间的关系
一、整体框架结构 二、关系描述 1、ROS.cpp 里面初始化了一个ROS节点,注意我的源文件里面只初始化了一个节点 // ROS.cpp #include "ros/ros.h"int main(int argc, char **argv) {ros::init(argc, argv, "node_name"); // 指定节点名称为 &…...

嵌入式学习----网络通信之TCP协议通信
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) 适用情况: 1. 适合于对传输质量要求较高,以及传输大量数据 的通信。…...
【信息学奥赛一本通】1007:计算(a+b)×c的值
1007:计算(ab)c的值 时间限制: 1000 ms 内存限制: 65536 KB 提交数:184662 通过数: 150473 【题目描述】 给定3个整数a、b、c,计算表达式(ab)c的值。 【输入】 输入仅一行,包括三个整数a、b、c, 数与数之间以一个空格分开。(-10,…...

Linux系统之部署俄罗斯方块网页小游戏(三)
Linux系统之部署俄罗斯方块网页小游戏(三) 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看…...

XSS- - - DOM 破坏案例与靶场
目录 链接靶场: 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场: XS…...

Arco Design,字节跳动出品的UI库
Arco Design是字节跳动出品的UI库,支持Vue和React。还是比较美观的。并且Arco Design还提供了中后台模版。但是通过提供的arco-cli连接了github,正常情况下无法构建。但效果还是挺好的,下面是效果图: 更新: 传送门可…...

常用API:object
文章目录 Object类toString()方法equals()方法总结其他方法 黑马学习笔记 Object类 是所有类的父类,所有的类都默认继承Object类。Java中所有的类的对象都可以直接使用Object类提供的一些方法。 toString()方法 equals()方法 默认是判断两个对象的地址 也是判断…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...