爬虫xpath方法基础学习分享

该文介绍了如何利用Python的requests和lxml库,通过XPath语法抓取网页上的特定数据,包括设置请求头、解析HTML、检查数据、存储数据等步骤,强调了理解HTML结构和检查数据完整性的重要性。
摘要由CSDN通过智能技术生成
  1. xpath爬虫顺序(以找一些简单的数据为例)

  1. 导入模块request(请求),lxml(解析)

导入模块: pip install 模块名字, 网速慢用清华源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 模块名
import requests
from lxml import etree
  1. 确定目标网址,以及需要的数据是否在网页源代码里

网页右键查看网页源代码,C+f 查找数据是否在网页源代码中确认后就可以开始准备入手请求了

  1. 设置url,以及请求头headers(一般的网页就够了,不行就加上cookie)

url = 'https://cs.lianjia.com/ershoufang/'
head_data = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'}
html = requests.get(url, headers = head_data)
  1. 代码部分

import requests
from lxml import etree

url = 'https://cs.lianjia.com/ershoufang/'
head_data = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'}

html = requests.get(url, headers = head_data)
#第七行写完的时候我们首先要确认我们是否获取到数据可以用print(html.text)确定
html = etree.HTML(html.text)#树形分析文档
#接下来就是找数据
title = html.xpath('//div[@class="info clear"]/div[1]/a/text()')
#以11行为例 变量 = html.xpath 注意这里的xpath要手打,点的话后面可能点不出来的

('//div[@class="info clear"]/div[1]/a/text()')以这一行为例

//div[@class="info clear"中“//”意思是不管之前有多少条,我要从“//”后面的一个div里有class="info clear"的开始。

首先要确定的是,代码中是否是唯一的class="info clear",如果不唯一就会获取多条class="info clear"里的数据,这个唯一是指同类型数据唯一类而不是同文本唯一,接下来找到这个class="info clear"后“/”代表继续往下找(子目录)里面的 div[1],也就是第一个div,然后是a标签,到这里就找到最后了假设我们需要a标签里的文本数据,就可以用/text()代表要获取文本数据。

现在我们拿到了这个网页中所有的class="info clear"中第一个div里的a标签里的文本数据,可以根据网页来确定一下数量,我们print(title)和print(len(title)),看看数据是否正确以及完整数量够。确定没问题了我们在进行下一步,每完成一步,都要检查数据,这样报错的话处理会方便一点,等都写完了报错很难第一时间知道问题在哪里。

获取数据后,可以整理数据,然后以我们想要的方式保存数据,我们可以以文件的方式保存或者存放到数据库。以上就是xpath的基础用法。

附:

/ 从根节点触发 绝对路径

// 当前节点选择文档中的节点 相对路径

@ 选取属性。

| 或者 可以同时满足多个路径

text() 获取元素内容

//title[@lang] 获取title里面有lang属性的元素

未知元素 * //*[@rel] 获取元素里面有rel属性的元素 不会受到标签的限制

提示:如果不想自己写xpath路径可以右键直接复制xpath路径,但是有时候不一定能获取数据,最好还是要学会自己看HTML结构,找到自己需要的数据位置。

附上完整的代码

import requests

from lxml import etree



l1 = ['https://xxxxxxxxx.com/']

l2 = [f'https://xxxxxxxxx.com/pg{i}/' for i in range (2, 6)]
#获取前五页数据

l3 = l1 + l2

f = open("xx.text", "w", encoding="utf-8")

for url in l3:

    head_data = {

            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'



        }



    html = requests.get(url, headers = head_data)

    # #请求网页

    html = etree.HTML(html.text)

    title = html.xpath('//div[@class="info clear"]/div[1]/a/text()')


    href = html.xpath('//div[@class="flood"]/div[1]/a[1]/text()')

    href1 = html.xpath('//div[@class="flood"]/div[1]/a[2]/text()')

    href2 = zip(href, href1)



    pic = html.xpath('//div[@class="info clear"]/div[6]/div[1]//span/text()')

    pic1 = html.xpath('//div[@class="info clear"]/div[6]/div[2]//span/text()')



    for title, href2, pic, pic1 in zip(title, href2, pic, pic1):

        f.write('   |   '.join([title, '- '.join(href2).replace(' ', ''), pic + "万", pic1]) + "\n")

        print(title, href2, pic, pic1)

f.close()

注:zip的用法可以参考菜鸟教程Python zip()函数

3.尾声

希望分享能帮助到别人,如果我有写错或者不全面欢迎各路大神来纠正我一下(抱拳),特别鸣谢耐心的苯环老师和星星班主任

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢三火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值