爬虫案例4——爬取房天下数据

news2024/9/23 23:25:52

简介:个人学习分享,如有错误,欢迎批评指正

任务从房天下网中爬取小区名称、地址、价格和联系电话

目标网页地址: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):
    # 构建每一页的URL
    url = 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 蓝球号码:xxx
            f.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):
    # 构建每一页的URL
    url = 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 蓝球号码:xxx
            f.write(f'姓名:{na} 地址:{ad} 价格:{pr} 电话:{te}\n')

结~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046629.html

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

相关文章

揭秘面试必备:高频算法与面试题全面解析

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统…

SystemUI手势操作隐藏显示导航栏

在Android 12中,通过SystemUI手势操作来隐藏和显示导航栏主要涉及对系统UI的定制和编程控制。以下是一些实现这一功能的方法: 第一类. 使用WindowInsetsController Android 12引入了一个新的WindowInsetsController类,它允许开发者更好地控…

加速科技精彩亮相2024中国(深圳)集成电路峰会

8月16日,2024中国(深圳)集成电路峰会(简称“ICS2024峰会”)在深圳如期开展,为行业带来一场技术盛宴。在这场盛会中,加速科技携2款核心产品——ST2500EX、ST2500E重磅亮相,凭借领先的…

【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)

前缀和的优势 给定一个数组,前缀和的特点在于,任意给出一对始末位置,能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。 题型分析 这道题目正是“给出始末位置,检测其中元素特点”那一类,那我们就想&#…

【机器学习西瓜书学习笔记——概率图模型】

机器学习西瓜书学习笔记【第十四章】 第十四章 概率图模型概率图模型分类14.1 隐马尔可夫模型贝叶斯网络马尔科夫链隐马尔科夫模型 14.2 马尔可夫随机场( M R F MRF MRF)马尔可夫场定理算法原理概率推理参数学习算法对比 14.3 条件随机场( C R F CRF CRF)优缺点优点缺点 链式条…

Redis -LFU(Least Frequently Used,最少使用频率)缓存淘汰算法

在 Redis 的 LFU(Least Frequently Used,最少使用频率)缓存淘汰算法中,lru 字段被拆分成两部分:高 16 位存储 ldt(Last Decrement Time),低 8 位存储 logc(Logistic Coun…

【图像特效系列】卡通特效的实践 | 包含代码和效果图

目录 一 卡通特效 代码 效果图 图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈圆形范…

【就业】中国铁路人才招聘

中国国家铁路集团有限公司,是中国财政部直接出资的大型国有企业,与国资委直接管理的央企不同,它是由财政部代表国务院履行出资人职责 ,由中央管理的国有独资公司。其前身是由国家铁道部政企分离后剥离出来的全民所有制企业&#x…

Docker 基础—— 数据卷

1.数据卷 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便,例如: 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了? …

idea安装二进制文本阅读插件

引言 在软件开发过程中,有时需要查看二进制文件的内容以调试或分析问题。虽然有许多专用工具可以处理这类任务,但直接在 IDE 内集成这些功能无疑更加方便高效。本文将介绍如何在 IntelliJ IDEA 2023中安装和配置一个名为 BinEd的插件,以及如…

Python实验-选择结构

实验目的 (1)掌握条件语句中逻辑表达式的正确书写规则 (2)掌握单分支、双分支和多分之条件语句的使用方法 实验内容 1.某校三好学生的评定标准为:语文和数学两科的平均成绩大于90,且每科成绩不低于85分&…

人工智能系统测试生命周期详解之测试分析

前面的文章里我们已经整体介绍过了人工智能测试的生命周期,它需要经历测试需求的分析、测试环境的准备、数据的准备与验证、测试的执行预分析以及上线后的监控这样一个过程。前面的文章已经为大家介绍了人工智能系统测试生命周期的“需求分析”环节、“测试环境准备…

【TCP协议】

一、TCP分层 TCP/IP协议是Internet互联网中最基本的协议,其在一定程度上参考了OSI七层模型,但在TCP/IP协议中,七层被简化成了四层,如下: OSI模型TCP/IP协议第七层应用层 应用层 HTTP/FTP/SMTP/Telnet 第六层显示层第…

UI设计:具备什么特征,就可以被认定为时尚风格

一、时尚风格的特征 时尚风格的UI设计通常具备以下一些特征: 扁平化设计:时尚风格的UI设计通常采用扁平化的设计风格,包括简洁的图标、清晰的排版和简约的色彩搭配。极简主义:时尚风格的UI设计追求极简主义,注重简洁、…

CAN总线-----帧格式

目录 前言 一、CAN总线帧格式分类 1.数据帧(重点) 2.遥控帧 3.错误帧 4.过载帧 5.间隔帧 二、位填充 三、波形实例 前言 本期我们就开始学习CAN总线的帧格式,对应帧格式的话,在前面我们学习I2C协议和SPI协议等协议的时候…

gitlab修改默认访问端口

GitLab 自带了一个 Nginx 服务器实例,用于处理 HTTP 和 HTTPS 请求。这个内置的 Nginx 服务器被配置为与 GitLab 应用程序实例一起工作,并且它负责处理所有前端的网络通信。 通过yum或者apt安装Gitlab时,nginx通常是被自带安装并配置好的。 …

基于C# winform部署图像动漫化AnimeGANv2部署onnx模型

【界面截图】 【效果演示】 【部分实现代码】 using System; using System.Diagnostics; using System.Windows.Forms; using OpenCvSharp;namespace FIRC {public partial class Form1 : Form{Mat src null;public Form1(){InitializeComponent();}private void button1_Cli…

10 Checkbutton 组件

10 Checkbutton 组件 Tkinter 是 Python 的标准 GUI 库,它提供了一系列的控件来创建图形用户界面。Checkbutton 是其中的一个组件,用于创建可以被选中或取消选中的按钮,通常用于实现布尔值的开关功能。 创建 Checkbutton 创建一个基本的 C…

Linux运维篇-误删/bin,/sbin目录怎么修复系统

这里写自定义目录标题 前言实例挂载镜像,重启系统进入救援模式拷贝镜像系统中的/bin和/sbin目录到原系统重启系统 总结 前言 当你看到这篇文章的时候,你的系统可能已经无法登录,或者正在处于登录状态但是不能执行任何常规的命令,…