python爬虫学习(xpath)

xpath解析:最常用且最便捷高效的一种解析方式。

- xpath解析原理

1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

- 环境安装

pip install lxml

- 如何实例化一个etree对象:from lxml import etree

1.将本地的html文档中的源码数据加载etree对象中:
etree.parse(filePath)
2.可以将从网站获取的源码数据加载到该对象中:
etree.HTML(page_text)

3.xpath(‘xpath表达式’)

/:表示的是从根节点开始定位,表示的是一个层级。
//:表示的是多个层级,可以表示从任意位置开始定位。
属性定位://div[@class=‘song’]
索引定位://div[@class=“song”]/p[3] 这里的索引是从1开始。
取文本:
/text() 获取的是标签中直系的文本内容
//text() 获取的是标签中非直系的文本内容(所有文本内容)
取属性:
//div[@class=‘song’]/img/@src

练习1.爬取58二手房信息

import requests
from lxml import etree

url = 'https://bj.58.com/ershoufang/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'
}
page_text = requests.get(url=url, headers=headers).text
# print(page_text)
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
fp = open('58.txt', 'w', encoding='utf-8')
for li in li_list:
    title = li.xpath('./div[2]/h2/a/text()')[0]
    href = li.xpath('./div[2]/h2/a/@href')[0]
    price_sum = li.xpath('./div[3]/p[@class="sum"]//text()')[0]
    price_unit = li.xpath('./div[3]/p[@class="unit"]//text()')[0]

    # 将结果写入到txt文档
    fp.write('\r'+'房屋介绍:'+title+'\n'+'房屋链接:'+href+'\n' +
             '房屋单价:'+price_unit+'\n'+'房屋总价:'+price_sum+'万'+'\n')
print('爬取结束')

练习2.爬取4k图片

import requests
from lxml import etree
import os

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0'
}

# 实现分页操作
for page in range(2, 4):
    page = str(page)
    url = 'http://pic.netbian.com/4kmeinv/'+'index_'+page+'.html'
    # print(url)
    # 解析数据
    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//ul[@class="clearfix"]/li')

    # 创建存储路径
    if not os.path.exists('./picLibs'):
        os.mkdir('./picLibs')
    # print(li_list)
    
    for li in li_list:
        img_src = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
        img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
        # 乱码处理
        img_name = img_name.encode('iso-8859-1').decode('gbk')
        # print(img_name,img_src)

        # 持久化存储
        img_data = requests.get(url=img_src, headers=headers).content
        img_path = 'picLibs/' + img_name
        with open(img_path, 'wb')as fp:
            fp.write(img_data)
            print(img_name, '下载成功')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值