Python爬虫——XPath的使用

338 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

使用实例一:获取需要的文字

1、导入需要使用的模块

import urllib.request
from lxml import etree

2、发送请求访问网站,得到服务器响应的页面源码

# 请求地址
url = 'https://baidu.com'
# 用户代理
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.2242 SLBChan/10'
}
# 定制请求头
request = urllib.request.Request(url=url,headers=headers)
# 发送请求访问服务器,返回响应对象
response = urllib.request.urlopen(request)
# 解码响应对象,得到页面源码
content = response.read().decode('utf-8')

3、解析服务器响应的文件并返回解析对象

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

4、调用xpath路径,提取数据,xpath的返回数据是列表类型

可以用xpath插件来动态的获取xpath路径:(可以将鼠标悬停在需要提取的文本数据上,然后按 shift 键就xpath插件的右边就会自动出现定位该文本的Xpath 表达式,然后再根据需求对表达式修改。)

在这里插入图片描述

待提取数据的xpath路径:

list = parse_html.xpath('//input[@id="su"]/@value')

最后总体代码实现:

import urllib.request
from lxml import etree

# 请求地址
url = 'https://baidu.com'
# 用户代理
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.2242 SLBChan/10'
}
# 定制请求头
request = urllib.request.Request(url=url,headers=headers)
# 发送请求访问服务器,返回响应对象
response = urllib.request.urlopen(request)
# 解码响应对象,得到页面源码
content = response.read().decode('utf-8')

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

# 编写xpath路径,获取想要的数据,xpath的返回值是列表类型
list = parse_html.xpath('//input[@id="su"]/@value')
# 获得列表的第一个数据
list1 = parse_html.xpath('//input[@id="su"]/@value')[0]
print(list)
print(list1)

执行结果:

['百度一下']
百度一下

使用实例二:从网站上提取图片

先发送请求访问网站,得到网站响应文件,然后解析网站响应文件,从网站响应文件中使用xpath表达式定位到需要的图片地址,然后用 urllib.request.urlretrieve()方法得到图片。

代码实例:

import urllib.request
from lxml import etree

# 定制请求对象
def creat_request(page):
    if(page == 1):
        url = 'https://sc.chinaz.com/tupian/fengjingtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/fengjingtupian_'+str(page)+'.html'

    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.2242 SLBChan/10'
    }
    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_image(content):
    # 解析服务器响应的文件
    parse_html = etree.HTML(content)
    # 图片地址
    src_list = parse_html.xpath('//div[@id="container"]//a/img/@src')
    # 图片名
    name_list = parse_html.xpath('//div[@id="container"]//a/img/@alt')
    for i in range(len(name_list)):
        name = name_list[i]
        src = src_list[i]
        url = 'https:'+src
        # 下载图片到文件夹,路径为当前项目下的fengjingimage文件夹
        urllib.request.urlretrieve(url=url, filename='./fengjingimage/'+name+'.jpg')

if __name__ == '__main__':
    start_page = int(input("请输入起始页:"))
    end_page = int(input("请输入结束页:"))
    for page in range(start_page,end_page+1):
        request = creat_request(page)
        content = get_content(request)
        down_image(content)

执行结果:

请输入起始页:1
请输入结束页:2

Process finished with exit code 0

图片提取成功:

在这里插入图片描述