【爬虫_解析】


一、xpath

xpath的使用:
先安装xpath插件
在浏览器的扩展里进行安装
安装后,先关闭浏览器,再打开,按住ctrl+shift+x
在这里插入图片描述会显示出这个框框(说明xpath安装成功)

  1. 安装lxml库

pip install lxml
镜像安装;pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple lxml

在这里插入图片描述

在这里插入图片描述

  1. 导入lxml.etree

from lxml import etree

  1. etree.parse() — 解析本地文件

html_tree = etree.parse(‘xx.html’)
先创建一个html文件
随便写入一点数据
在这里插入图片描述在html 文件中加入一个斜杠(/),表示没有结束标签
在这里插入图片描述

xpath解析本地文件

打印tree
在这里插入图片描述打印结果:
在这里插入图片描述

xpath基本语法
(1) 路径查询

//:查找所有子孙节点,不考虑层级关系
/:之间找子节点

(2) 谓词查询

//div[@id]
//div[@id=“maincontent”]

(3)属性查询

@class

(4)模糊查询

div[contains(@id,“he”)]
div[starts-with(@id,“he”)]

(5)内容查询

//div/h1/text()

具体使用代码块:

from lxml import etree

tree = etree.parse('解析_xpath的基本使用.html')

# tree.xpath('xpath路径')

# 查找ul下面的li
# li_list = tree.xpath('//body/ul/li')

# 查找所有有id属性的li标签
# text()获取标签中的内容
# li_list = tree.xpath('//ul/li[@id]/text()')


# 查找id为1的li标签
# li_list = tree.xpath('//ul/li[@id="l1"]/text()')

# 查找到id为l1的li标签的class的属性值
# li = tree.xpath('//ul/li[@id="l1"]/@class')


# 查询id中包含l的li标签(模糊查询)
# li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')

# 查询id的值以l开头的li标签
# li_list = tree.xpath('//ul/li[starts-with(@id,"c")]/text()')


解析_xpath的基本使用.html
在这里插入图片描述

  1. 服务器响应文件 — etree.HTML()

html_tree = etree.HTML(response.read().decode(‘utf-8’))

二、获取百度网站的“百度一下”

  1. 获取网页的源码
  2. 解析
  3. 打印

获取xpath:
在这里插入图片描述

import urllib.request

url = 'https://www.baidu.com/'


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

# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)

# 模拟浏览器访问服务器
response = urllib.request.urlopen(request)

# 获取网页源码
content = response.read().decode('utf-8')

# 解析网页源码 来获取我们想要的数据
from lxml import etree

# 解析服务器响应的文件
tree = etree.HTML(content)

# 获取想要的数据
result = tree.xpath('//input[@id="su"]/@value')[0]

print(result)

三、站长素材

需求:下载前十页图片
先找到第一页
在这里插入图片描述在检查中的预览结合响应,查看是否是第一页
如果是就复制url:https://sc.chinaz.com/tupian/qinglvtupian.html
同样的方法找到第二页的url:https://sc.chinaz.com/tupian/qinglvtupian_2.html

可以发现第一页的页码和其他页的页码不一样

具体实现完整代码:
最后将图片都存入到loveImg文件夹中

import urllib.request
from lxml import etree

def create_request(page):
    if(page == 1):
        url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/qinglvtupian_' + str(page) + '.html'

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

    request = urllib.request.Request(url=url, headers=headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content


def down_load(content):
    tree = etree.HTML(content)

    name_list = tree.xpath('//div[@class="container"]//img/@alt')

    data_list = tree.xpath('//div[@class="container"]//img/@data-original')

    for i in range(len(name_list)):
        name = name_list[i]
        src = data_list[i]
        url = 'https:' + src
        urllib.request.urlretrieve(url=url, filename='./loveImg/' + name + '.jpg')



if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))

    for page in range(start_page, end_page+1):

        # 请求对象的定制
        request =  create_request(page)
        # 获取网页的源码
        content = get_content(request)
        # 下载
        down_load(content)


四、Jsonpath

适用于解析json数据

打开淘票票官网:
我们做一个小案例进行演示
在这里插入图片描述

需要注意的是:jsonpath只能解析本地文件,不能解析服务器响应的文件,和xpath不一样

在开始之前要先下载jsonpath模块
在这里插入图片描述

在这里插入图片描述

import urllib.request

url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1669306447473_102&jsoncallback=jsonp103&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'

headers = {
    
    
   	# 填入请求标头
   	# 其中 # ':authority': 'dianying.taobao.com',
    # ':method': 'GET',
    # ':path': '/cityAction.json?activityId&_ksTS=1669306447473_102&jsoncallback=jsonp103&action=cityAction&n_s=new&event_submit_doGetAllRegion=true',
    # ':scheme': 'https',
    # 'accept-encoding': 'gzip, deflate, br',
    # 需要注释
 }

request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

content = content.split('(')[1].split(')')[0]

with open('解析_jsonpath解析淘票票.json', 'w', encoding='utf-8')as fp:
    fp.write(content)


import json
import jsonpath

obj = json.load(open('解析_jsonpath解析淘票票.json', 'r', encoding='utf-8'))

city_list = jsonpath.jsonpath(obj, '$..regionName')

print(city_list)

五、bs4的基本使用

BeautifulSoup简称bs4,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

先安装bs4模块
在这里插入图片描述
在这里插入图片描述

bs4爬取星巴克数据

打开星巴克官网,选择菜单
需求:爬取菜单中的数据:文字

找到菜单界面的接口
在这里插入图片描述在这里插入图片描述

这里使用xpath转bs4的方法

import urllib.request

url = 'https://www.starbucks.com.cn/menu/'

response = urllib.request.urlopen(url)

content = response.read().decode('utf-8')

from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'lxml')

name_list = soup.select('ul[class="grid padded-3 product"] strong')

for name in name_list:
    print(name.string)

运行结果部分截图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_64451048/article/details/128005218