xpath解析库(懒加载)

JSON用在哪里?

前端和后端交互数据的时候,我们将数据保存为json格式的数据

xml

和JSON的位置是一样的,也是用来存储和传输数据的

xml和html的不同

(1)xml是用来存储和传输数据,html被用来显示数据

(2)xml是纯文本信息,html是超文本信息
(3)xml标签可以自定义,htnl标签不可以

xpath:写一个路径表达式,用来在xml结构的数据中提取指定内容的

xpath是用来解析xml数据的,用在爬虫中,解析内容有什么用?

在爬虫中,你发送请求的相应内容格式是html格式的,也可以通过xpath解析,有一个第三方库(lxml),实现xpath解析html数据

安装

pip install lxml

基本语法

http://www.w3school.com.cn/xpath/xpath_intro.asp

学习xpath

常用的路径表达式

xpath解析库(懒加载)_第1张图片
13.png

eg:

bookstore/book       查找bookstore的book节点(直接子节点)
bookstore//book       查找bookstore的所有book节点
div/a                               div > a(css选择器)
div//a                         div a(css选择器)
//book                          查找文档中所有的book节点
//@lang                           查找所有拥有lang属性的节点
bookstore/book[1]       查找bookstore下面的所有直接子节点book,取第一个
bookstore/book[last()]                取出最后一个
bookstore/book[last()-1]                  取出倒数第二个
bookstore/book[position()<3]       取出前两个
//title[@lang] nbsp;                查找所有拥有lang属性title节点
//title[@lang='eng']       查找所有lang属性值为eng的title节点
bookstore/*                  bookstore下面所有的直接子节点
//*                               所有节点
//title[@*]                   拥有属性的所有title节点

很重要的两个函数

starts-with()
contains()

xpath如何解析html数据?

(1)给谷歌浏览器安装一个xpath插件

使用

开启和关闭插件:ctrl+shift+x

属性筛选

//input[@id='kw']
#如果class有多个,需要全部写进来
//span[@class='bg s_btn_wr']

层级、索引筛选

//a[@class='mnav'][2]       
//a[@class='mnav'][last()]
//a[@class='mnav'][last()-1]
//a[@class='mnav'][position()<3]
//div[@id='head']/div/div[3]/a[2]
//div[@id='head']/div/div[@id='u1']/a[2]
//div[@id='head']//a

获取属性

//div[@id='u1']/a[2]/@href
//div[@id='u1']/a/@href

获取文本

//div[@id='u1']/a[2]/text()
//div[@id='u1']/a/text()

函数starts-with() 以..开头

//div[@id='u1']/a[starts-with(@href,'https')]
//div[@id='u1']/a[starts-with(text(),'新')]

函数contains()

//div[@id='u1']/a[contains(@href,'hao')]
//div[@id='u1']/a[contains(text(),'hao')]

代码中使用xpath

xpath智能解析html格式的数据,将html格式的数据生成一个对象,然后通过对象的xpath方法得到指定内容

转化本文件

tree = etree.parse('xxx.html')
ret = tree.xpath('xxx')
#返回一个列表

转化网络文件

tree = etree,HTML(网页内容)
ret = tree.xpath('xxx')

懒加载lazy-load

图片网页:里面有100个图片,这个网页要呈现出来,需要次请求 101

用户体验不好,所以需要使用懒加载技术
用到的时候在加载,出现在可视区的图片才会加载,企图图片不用加载
前段在实现的时候,都写image标签格式为   data-src      data-original       class='lazy'
通过js判断如果这个图片出现在了可视区,那么js动态的将src2修改为src

案例(懒加载)

import os
import random
import time
from lxml import etree
import urllib.request


def handle_request(page, url):
    if page == 1:
        url = 'http://sc.chinaz.com/tupian/rentiyishu.html'
    else:
        url = url.format(page)
    # print(url)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        # 'Connection': 'keep - alive',
        # 'Referer': 'http://www.meizitu.com/'

    }
    # url_page = url.format(page)
    request = urllib.request.Request(url=url, headers=headers)
    return request


def parse_content(content):
    tree = etree.HTML(content)
    # print(tree)
    # exit()
    # images = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')
    titles = tree.xpath('//div[@id="container"]/div/div/a/img/@alt')
    href = tree.xpath('//div[@id="container"]/div/div/a/@href')
    for url in href:
        parse_content2(url)


    # dirname = 'yishu'
    #
    #
    # for imagesrc in images:
    #     filename = titles[images.index(imagesrc)]+'.'+imagesrc.split('.')[-1]
    #     # print('正在下载%s' % filename)
    #     filepath = os.path.join(dirname,filename)
    #     urllib.request.urlretrieve(imagesrc,filepath)


def parse_content2(url):
    request = handle_request(page=None,url=url)
    content = urllib.request.urlopen(request).read().decode('utf8')
    parse_content3(content)

def parse_content3(content):
    tree = etree.HTML(content)
    src = tree.xpath('//div[@class="imga"]/a/img/@src')
    try:
        alt = tree.xpath('//div[@class="imga"]/a/img/@alt')[0]
    except Exception as e:
        print('cuole',e)

    dirname = 'yishu'


    for imagesrc in src:
        l = range(1,9999999)
        num = str(random.choice(l))
        filename = imagesrc[src.index(imagesrc)]+num+'.'+imagesrc.split('.')[-1]
        print('正在下载%s' % filename)
        filepath = os.path.join(dirname,filename)
        urllib.request.urlretrieve(imagesrc,filepath)


def main():
    url = 'http://sc.chinaz.com/tupian/rentiyishu_{}.html'
    start_page = int(input('开始'))
    end_page = int(input('结束'))
    for page in range(start_page, end_page + 1):
        request = handle_request(page, url)
        content = urllib.request.urlopen(request).read().decode('utf8')
        parse_content(content)


if __name__ == '__main__':
    main()

xpath解析库(懒加载)_第2张图片
gfg.jpeg

你可能感兴趣的:(xpath解析库(懒加载))