【python练习】xpath抓取壁纸网站中的图片具体步骤

 抓取素材

4K壁纸_4K手机壁纸_4K高清壁纸大全_电脑壁纸_4K,5K,6K,7K,8K壁纸图片素材_彼岸图网

思路:

1、运用requests模块获取整个页面代码

2、用xpath的功能解析数据,获取到我们需要的数据

3、获取子页面的代码后用xpath功能解析数据,获取所需要的图片

4、进行图片下载存储


第一步:导包
import requests
from lxml import etree
import os
第二步:指定url
url = "https://pic.netbian.com/4krenwu/"
第三步:进行UA伪装(此处代码没打全,要全部复制的)
headers = {
    'User-Agent': 'Mozilla/5.0'
}
第四步:请求发送
page_text = requests.get(url=url,headers=header)
#手动设定响应数据的编码格式
page_text.encoding = 'gbk'
response = page_text.text

注意:这里手动设定响应数据的编码格式是因为原网页的编码格式不是utf-8,如果不进行编码格式转换,获取到的代码中若出现中文则会出现乱码情况。

第五步:数据解析,获取src属性值和alt属性值
tree = etree.HTML(response)
li_list = tree.xpath('//div[@class="slist"]/ul/li')

我们所需图片的src在<div class="slist">这个大盒子中,故xpath的路劲为:/html/body/div[2]/div/div[3],其中div[3]代表<div class="slist">,故而再精确定位到ul中的li就可以到达各个图片的位置。

第六步:for循环找到div中所有a的href
for li in li_list:
    img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
第七步:请求子页面
child_response = requests.get(img_a)  # 请求到子页面
child_response.encoding = "gbk"
child_responses = child_response.text
tree = etree.HTML(child_responses)
child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
第八步:for循环获得子页面图片的src属性值和alt属性值
for a in child_div:
    img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0]
    img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
第九步:存储
#创建文件夹
if not os.path.exists('./4k大图'):
    os.mkdir('./4k大图')
# 替换文件名中的非法字符
img_name = img_name.replace('*', '_')  # 将 * 替换为 _
#持久化储存
img_data = requests.get(url=img_src,headers=header)
img_path = "4k大图/" + img_name
with open(img_path, mode='wb') as fp:
    fp.write(img_data.content)
    print(img_name,'下载成功!!')
完整代码
import requests
from lxml import etree
import os

if __name__ == '__main__':
    url = "https://pic.netbian.com/4krenwu/"
    header = {
            'User-Agent' : 'Mozilla/5.0'#没复制完
        }
    page_text = requests.get(url=url, headers=header)
    #手动设定响应数据的编码格式
    page_text.encoding = 'gbk'
    response = page_text.text
    #数据解析:src属性值 alt属性值
    tree = etree.HTML(response)
    li_list = tree.xpath('//div[@class="slist"]/ul/li')

    #创建文件夹
    if not os.path.exists('./4k大图'):
        os.mkdir('./4k大图')

    for li in li_list:
        img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
        #请求子页面
        child_response = requests.get(img_a)
        child_response.encoding = "gbk"
        child_responses = child_response.text
        tree = etree.HTML(child_responses)
        child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
        for a in child_div:
            img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0]
            img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
            # print(img_alt,img_src)
            # 替换文件名中的非法字符
            img_name = img_alt.replace('*', '_')  # 将 * 替换为 _
            # 持久化储存
            img_data = requests.get(url=img_src, headers=header)
            img_path = "4k大图/" + img_name
            with open(img_path, mode='wb') as fp:
                fp.write(img_data.content)
                print(img_name, '下载成功!!')
翻页提取数据
for page in range(2,4):
    url = (f"https://pic.netbian.com/4krenwu/index_{page}.html")
    print(f'第{page}页获取成功')

下面的代码只提取第2页~第3页的内容,添加后的完整代码:

import requests
from lxml import etree
import os

if __name__ == '__main__':
    url = "https://pic.netbian.com/4krenwu/"
    header = {
            'User-Agent' : 'Mozilla/5.0 ' #没复制完整
        }
    for page in range(2,4):
        url = (f"https://pic.netbian.com/4krenwu/index_{page}.html")
        print(f'第{page}页获取成功')
        page_text = requests.get(url=url, headers=header)
        #手动设定响应数据的编码格式
        page_text.encoding = 'gbk'
        response = page_text.text
        #数据解析:src属性值 alt属性值
        tree = etree.HTML(response)
        li_list = tree.xpath('//div[@class="slist"]/ul/li')

        #创建文件夹
        if not os.path.exists('./4k大图'):
            os.mkdir('./4k大图')

        for li in li_list:
            img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
            #请求子页面
            child_response = requests.get(img_a)  # 请求到子页面
            child_response.encoding = "gbk"
            child_responses = child_response.text
            tree = etree.HTML(child_responses)
            child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
            for a in child_div:
                img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0]
                img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
                # print(img_alt,img_src)
                # 替换文件名中的非法字符
                img_name = img_alt.replace('*', '_')  # 将 * 替换为 _
                # 持久化储存
                img_data = requests.get(url=img_src, headers=header)
                img_path = "4k大图/" + img_name
                with open(img_path, mode='wb') as fp:
                    fp.write(img_data.content)
                    print(img_name, '下载成功!!')
总结

1、在存储的时候,我发现我会出现OSError: [Errno 22] Invalid argument: 'piclibs\\肖战3840*2560 4k壁纸.jpg'的错误,后来发现问题出在文件名中的特殊字符上,因为在文件系统中,* 是一个通配符,可能不被允许作为文件名的一部分,所以我把文件名中的非法字符进行替换:

img_name = img_name.replace('*', '_') 

2、关于翻页提取数据,目前的我只能从第二页开始提取,因为该网页的代码第1页居然不是index_1.html,所以我按照规律先抓取第一页再从第二页开始循环如果有更好的方法,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值