Python【xpath】实战下

news2024/9/27 17:33:06

项目要求:获取某二手租房平台关于房源信息的简介和价格

代码:python编写,实现需要准备的第三方库:requests ,lxml, time

代码分析:

导入需要使用的第三方库:

import requests
import time
from lxml import etree

构造方法:(代码只有在本文件中可以使用,不可被其他文件中的项目,避免了类似的文件名被重复调用的问题)

if __name__ == "__main__":

伪装浏览器发起者:(伪装成使用谷歌浏览器是普通用户在使用)

#UA检测:门户网站的服务器,会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器,浏览器会认为这是一个正常的用户,
#说白了就是伪装成用户通过浏览器去访问
headers = {
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36',
        'Referer': 'https://www.58.com/zufang/'
    }
'Referer': 'https://www.58.com/zufang/'

有的网站会鉴别你是从哪里访问本网页信息,一般是你在获取图片时,它会鉴别你来到本网页以前是在那个页面,'Referer',一般大写(其实这是一种错误翻译,正确英语拼法是referrer,只是后来错误的使用习以为常,所以就按照'Referer'这样写),后面一般跟随本网站的主网页。

批量获取数据:(实现翻页获取数据)

i=0
for page_turn in range(1,2,1):
    url = 'https://xa.58.com/ershoufang/p{page}/?PGTID=0d30000c-001e-3ac0-24b9-ea2c5f88d0c0&ClickID=1'.format(page=page_turn)

如果你需要实现多个页面数据获取,建议你多刷新几个页面,将它们的请求地址粘贴下来分析一番

第一页请求地址:
https://xa.58.com/ershoufang/
第二页请求地址:
https://xa.58.com/ershoufang/p2/?PGTID=0d30000c-001e-359a-4d8a-60a045eac6d5&ClickID=1
第三页请求地址:
https://xa.58.com/ershoufang/p3/?PGTID=0d30000c-001e-359a-4d8a-60a045eac6d5&ClickID=1
第四页请求地址:
https://xa.58.com/ershoufang/p4/?PGTID=0d30000c-001e-359a-4d8a-60a045eac6d5&ClickID=1

显然在请求地址的链接中只有,p后面跟随的数字在不断发生变化,其他数据信息都未发生变化,网页通过数字来区分此页面是第几页,p1 就是第一页,p2就是第二页,p3就是第三页,.......,有的朋友又要问第一页显然和其他页面的请求地址连接不一样啊?

那我们这样去试试,“https://xa.58.com/ershoufang/p4/?PGTID=0d30000c-001e-359a-4d8a-60a045eac6d5&ClickID=1”中的p4改为p1,试试看,能不能请求到第一页面的地址信息。

下面我改一下"https://xa.58.com/ershoufang/p4/?PGTID=0d30000c-001e-359a-4d8a-60a045eac6d5&ClickID=1"链接中的数据,将p4改为p1试试,看和我们通过:“https://xa.58.com/ershoufang/”访问的页面信息是否一样。

显然是一样的,这说明了什么?这种思想可以解决什么问题?

假如出现:你要获取的页面数据信息,第一页请求链接和其他例如第二页,第三页数据请求链接不一样,例如本项目,你可以通过这种方式测试一下,如果适用你可以按照本方法来,如果你修改了某些参数,它仍然访问不到预估出现的数据,你可以先把第一页页面数据拿到,然后以本项目的方法去拿到其他数据,然后把它们放在一起就好。

使用format函数修改固定位置参数,进行多个页面数据获取

i = 0
for page_turn in range(1,2,1):
    url = 'https://xa.58.com/ershoufang/p{page}/?PGTID=0d30000c-001e-3ac0-24b9-ea2c5f88d0c0&ClickID=1'.format(page=page_turn)

发起get请求:

page_text = requests.get(url=url,headers=headers).text

页面解析:(网页数据使用 HTML)

#xpath 数据解析,解析成html页面形式,因为解析的是网页数据所以要用etree.HTML,如果解析的是本地数据etree.parse
tree = etree.HTML(page_text)

用xpath方法解析html页面:

li_list = tree.xpath('//section[@class="list-main"]//section[@class="list"]')

for循环遍历section[@class="list"]中所有数据信息(因为section[@class="list"]中有很多div标签)

    for li in li_list:
        ctiy_span=li.xpath('./a/div[2]//div[@class="property-content-title"]/h3/text()')[0]
        titles = li.xpath('./a/div[2]/div[@class="property-price"]/p/span[1]/text()')[0]
  

每一个div标签就是一个租房信息通过for循环从section标签中,拿全部div标签,也就是获取本页面中的全部租房信息。

通过xpath方法解析html中租房文本信息(text() 的作用就是获取文本数据的作用):

ctiy_span=li.xpath('./a/div[2]//div[@class="property-content-title"]/h3/text()')
        
titles = li.xpath('./a/div[2]/div[@class="property-price"]/p/span[1]/text()')

进行分页如果第一页数据拿到,通过print打印第一页数据获取完成:

i+=1
    print("第{}页爬取完成".format(i))

在代码的开始将i定义为0表示为未开始获取数据,通过i+=1,i自增一,来完成第一页数据完成后,打印第一页爬取完成,接下来获取第二页数据,如果获取完毕,将会打印第二页爬去完成,以此类对。

设置time函数设置休眠时间,来规避反扒虫的检测:

time.sleep(2)

本项目容易诱发的问题:获取xpath 解析数据时获取到空列表

什么原因呢?被反扒机制检测到了(还是我们的伪装的不够有效,主要是我的能力有限),它会把你的爬虫请求到的页面诱导到其他位置导致你的xpath写法失效

全部代码:(xpath写法哪里有点问题,获取不到数据)个人认为网站的设计设计阴阳合同,你通过阳合同的网页html,来写xpath语法,它不让你获取数据,你只有找到阴合同页面的html,来写xpath语法,这样才能获取导数据

import pprint
,
import requests
import time
from lxml import etree
if __name__ == "__main__":
    #爬取页面页面数据
    # https://xa.58.com/ershoufang/p2/?PGTID=0d30000c-0000-144c-1515-b98489c92dbc&ClickID=1
    # https://xa.58.com/ershoufang/p3/?PGTID=0d30000c-0000-144c-1515-b98489c92dbc&ClickID=1
    headers = {
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36',
        'Referer': 'https://www.58.com/zufang/'
    }
i=0
for page_turn in range(1,2,1):
    url = 'https://xa.58.com/ershoufang/p{page}/?PGTID=0d30000c-001e-3ac0-24b9-ea2c5f88d0c0&ClickID=1'.format(page=page_turn)
    # print(url)
    page_text = requests.get(url=url,headers=headers).text
    # pprint.pprint(page_text)
    #xpath 数据解析,解析成html页面形式,因为解析的是网页数据所以要用etree.HTML,如果解析的是本地数据etree.parse
    tree = etree.HTML(page_text)
    # print(tree)
    #用xpath方法解析html页面,为什么拿到的是li标签呢? 因为所有的租房简介在ul中,ul下层有很多li标签,一个li标签就是一个租房信息简介
    li_list = tree.xpath('//section[@class="list-main"]//section[@class="list"]')
    li_lists = tree.xpath('//*[@id="esfMain"]/section/section[3]/section[1]/section[2]/div[1]/a/div[2]/div[1]/div[1]/h3/text()')
    print(li_lists)
    #
    all_city_name = []
    for li in li_list:
        ctiy_span=li.xpath('./a/div[2]//div[@class="property-content-title"]/h3/text()')[0]
        print(ctiy_span)
    #     titles = li.xpath('./a/div[2]/div[@class="property-price"]/p/span[1]/text()')[0]
    #     # print(titles)
    #     all_city_name.append(ctiy_span)
    #     all_city_name.append(titles)
    # i+=1
    # print("第{}页爬取完成".format(i))
    time.sleep(2)
    # print(all_city_name)

阳合同页面:(文本信息在h3标签里)

阴合同页面:(文本信息在span标签中)

通过查看阴合同的html页面,来写xpath语法是没有任何的可以获取到数据。

总结:(论语二则)

子在川上曰:“逝者如斯夫,不舍昼夜。”《子罕》

君子站在河流穿过河谷中说:流逝的一切如同奔流不息的河水,不分白天与黑夜

子夏曰:“博学而笃志,切问而近思,仁在其中矣。”《子张》

卜商(子夏)说:广泛的获取知识,且坚定自己的志向,恳切地提问且多考虑当前的事情,仁德就体现在当前这些事情中。

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

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

相关文章

java ssm校园快递代领系统的设计与实现idea maven

近几年随着国民经济的不断发展,电子商务行业的不断创新。作为物流业一个重要分支的校园快递代领逐渐兴起,各种快递公司层出不穷。校园快递代领在不断向前发展的同时也存在一些无法避免的小问题,例如许多小型的快递公司在信息处理和管理上存在…

基于微信小程序的民宿短租系统小程序

文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…

Spring Boot Actuator详解

Actuator简介 什么是Spring Boot Actuator? Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用。这个模块是一个采集应用内部信…

react知识点整理

1、react hooks是用来做什么的? 加入hooks,让react函数组件更加的灵活 hooks之前,React存在很多问题: 1、组件间服用状态逻辑难2、复杂组件变的难以理解,高阶组件和函数组件的嵌套过深3、class组件的this问题4、难以记忆的生命周期hooks有: useState()useEffects()useR…

从头开始创建一个OData SAP Gateway Service

可能用到的事务代码:/IWFND/IWF_ACTIVATE – Activate / Deactivate SAP GatewaySEGW – SAP Gateway Service Builder/IWFND/MAINT_SERVICE – Activate and Maintain Services/IWFND/EXPLORER – Service Explorer/IWFND/GW_CLIENT – SAP Gateway Client/IWFND/S…

Android | 输入系统(IMS)

前言 一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEvetn 这几个方法,对于 View 层的了解都不属性。 自从对于应用层面的分发过程了…

logging日志模块详解

说到日志,无论是写框架代码还是业务代码都离不开日志的记录,其能给我们定位问题带来极大的帮助。 记录日志最简单的方式是在你想要记录的地方加上一句print。我相信无论是新手还是老鸟都经常这么干,在简单的代码或者小型项目中这么干一点问题…

这样吃才能有效补脑

核桃长得像大脑,还含有Ω-3,一直被认为补脑效果很好。但是现代科学研究发现,Ω-3并不是核桃专有的,很多坚果都有,所以核桃在补脑这方面并没有什么特殊功效。补脑其实就是维持大脑的正常工作,还要延缓大脑认…

SAP ADM100-Unit4 数据库工作原理:监控数据库

概览 除了执行数据备份之外,还需要对数据库进行大量的周期性检查。 课程目标 对数据库计划额外的周期性检查。 1、数据库定期监控 除了日常监控数据库备份外,还有大量的其他检查不得不定期执行。有的检查可以通过DBA Cockpit Planning Calendar来计划。 例如: 当存取数…

Mac电脑使用:查看本机已连接Wi-Fi密码的方法

前言 在使用Mac电脑的时候,电脑自身所连接成功的Wi-Fi一般都不显示密码,这是苹果出于安全考量的保护措施,但是有时候遇到新的设备想要连接已经连过的Wi-Fi,由于时间太久忘记Wi-Fi密码,这就需要查看一下电脑连接的Wi-Fi…

点击化学标记1817735-33-3,Pyrene-PEG5-propargyl,芘甲酰胺五聚乙二醇丙炔

Pyrene-PEG5-propargyl,芘甲酰胺-五聚乙二醇-丙炔Product structure:Pyrene-PEG5-propargyl结构式Product specifications:1.CAS No:1817735-33-32.Molecular formula:C30H33NO63.Molecular weight:503.64.…

终于有多位大神联手把计算机基础知识与操作系统讲清楚了

操作系统的定义 指的是控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。 计算机系统的层级结构 1、用户 应用程序 2、操…

vue前端框架课程笔记(三)

目录条件渲染v-ifv-show列表渲染关于:key列表过滤watch属性实现computed属性列表排序表单数据收集input是否配置value属性过滤器本博客参考尚硅谷官方课程,详细请参考 【尚硅谷bilibili官方】 本博客以vue2作为学习目标(请勿混淆v2与v3的代码规范&…

Azure 语音用人工智能改变游戏开发的三种方式

通过 Azure 认知服务的智能语音功能[1],用户可以使用语音 SDK 开发工具包快速构建支持语音交互的各种应用。将语音转录为准确的文本 (STT,或语音识别)或者将文本转换成生动的语音 (TTS,或语言合成&#xff…

大数据NiFi(十五):NiFi入门案例二

文章目录 NiFi入门案例二 一、配置“GenerateFlowFile”处理器 1、拖拽“Processor”在弹框中输入“GenerateFlowFile” <

如何解决缓存雪崩、击穿、穿透难题?

缓存雪崩、缓存击穿和缓存穿透这三个问题是我们在使用redis做缓存的时候要面临的&#xff0c;一旦发生这三个问题&#xff0c;就会导致大量的请求都积压到了数据库层&#xff0c;有可能导致数据库宕机&#xff0c;进入导致整个系统不可用。 下边&#xff0c;具体看一下这三个问…

Qt扫盲-Qt资源系统概述

Qt资源系统概述一、概述二、资源文件(.qrc)三、外部二进制资源四、内嵌资源五、压缩资源文件六、在应用中使用资源七、使用Library 库中的资源一、概述 Qt资源系统是一种独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一…

Spring Boot学习之集成Dubbo+Zookeeper小案例

文章目录一 框架搭建1. [Dubbozookeeper下载和安装](https://blog.csdn.net/yang2330648064/article/details/128790320)二 项目创建2.1 服务者部分2.2 消费者部分2.3 注意点2.3.1 在service的实现类中配置服务注解&#xff0c;发布服务&#xff01;注意导包问2.3.2 服务接口的…

[Vulnhub] DC-8

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 知识点&#xff1a; sqlmap 注入出用户名密码msfvenom 生成脚本msf反弹shellsuid-exim 提权 目录 <1> 信息搜集 <2> 反弹shell (1) 利用kali自带webshell代码 (2) msfvenom制作反弹shell脚本…

SaaS平台数据表单组件设计技巧分享

SaaS平台数据表单组件设计技巧分享&#xff0c;数据表单方法&#xff1a;固定表头、固定侧栏、自定义栏、分页器、过滤器、数据排序、多选项同时操作、简单且简约、普通的字体样式、项目链接、鼠标悬停设计指南&#xff0c;为大家提供有关数据表单设计的实用性建议。在实际的数…