python爬虫:爬取图片素材案例

注:本文仅作参考所有操作均为示范,如有侵权请联系删除


前言

本文演示案例网站见代码

示例版块为“4k美女”,选此版块原因只因编者个人爱好,无不良导向。


一、查看robots.txt协议

在使用爬虫之前,务必首先查看目标网站的robots.txt,规范使用爬虫工具。

该网站爬虫协议如图

更多有关robots.txt协议可查看该博主文章:(6条消息) 查看网站的爬虫协议,简单介绍爬虫协议robots.txt,避免爬虫爬的好,牢饭吃得早(保姆级图文)_爬虫协议怎么看_发现你走远了的博客-CSDN博客 

二、具体实现

1.引入库

代码如下:

import requests
from lxml import etree
import os

2.分析页面

首先观察页面,可以发现当前页面图片有限,若想查看更多图片则需执行翻页操作。通过实际操作不难发现,不同页面的url

 其区别无非是_后的数字不同,其数字对应相应页面,而首页无_下划线,故选择从第二页往后爬起(这里我偷懒了我承认)。

清楚这一点后即可正式开始对图片src进行分析。

 老规矩,右键——检查,可发现所有图片位于class为slist的div/ul/li中,那么以此为xpath即可获得当前页面图片所在li的一个列表

tree = etree.HTML(page_text)
image_list = tree.xpath('//div[@class="slist"]/ul/li')

再往下分析,展开li/a/img,可发现img两个属性"src"与"alt",对src进行抓取即可获得图片地址,对alt进行抓取即可获得图片的名称。

for li in image_list:
    image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
    image_name = li.xpath('./a/img/@alt')[0] + '.jpg'

理论存在,实践开始! 

3.代码实现

首先手动进行请求头的伪装:

if __name__ == "__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57'
    }

还记得要对不同页面发送请求吗?在这里我们通过一个for循环来实现:

for i in range(2, 66):
    url = f'https://pic.netbian.com/4kmeinv/index_{i}.html'
    response = requests.get(headers=headers, url=url)
    response.encoding = 'gbk' # 手动规定编码格式
    page_text = response.text
    tree = etree.HTML(page_text)
    image_list = tree.xpath('//div[@class="slist"]/ul/li')

拿到当前页面的li列表后,就可以对它进行遍历分别拿到每张图片的信息,但是先别急 ,在此之前我们需要先确保图片存储到哪个文件夹中,在这里通过os实现:

if not os.path.exists('./4k美女(测试爬虫用!!!)'):
    os.mkdir('./4k美女(测试爬虫用!!!)')

(我承认我心虚了,在文件夹名中标明测试爬虫用,被别人看到就不好了)

接下来就可以遍历列表,拿到img的两个属性src,alt去补全图片地址与名称

for li in image_list:
    image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
    image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
    image_data = requests.get(url=image_src, headers=headers).content
    image_path = '4k美女(测试爬虫用!!!)/' + image_name

最后通过拿到的信息将图片以指定名称存入文件夹,并在成功存储后打印一条通过信息来获取进度。

with open(image_path, 'wb') as f:
    f.write(image_data)
    print(f"{image_name}下载成功")

4.总代码

总代码如下:

import requests
from lxml import etree
import os

if __name__ == "__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57'
    }
    for i in range(2, 66):
        url = f'https://pic.netbian.com/4kmeinv/index_{i}.html'
        response = requests.get(headers=headers, url=url)
        response.encoding = 'gbk' # 手动规定编码格式
        page_text = response.text
        tree = etree.HTML(page_text)
        image_list = tree.xpath('//div[@class="slist"]/ul/li')

        if not os.path.exists('./4k美女(测试爬虫用!!!)'):
            os.mkdir('./4k美女(测试爬虫用!!!)')
        for li in image_list:
            image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
            image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
            image_data = requests.get(url=image_src, headers=headers).content
            image_path = '4k美女(测试爬虫用!!!)/' + image_name
            with open(image_path, 'wb') as f:
                f.write(image_data)
                print(f"{image_name}下载成功")

 5.实现效果

(背景有点花哨不好意思) 


总结

进行爬虫活动前一定先确保查看robots.txt协议,并确保爬取的行为正当性,以免可刑。

更多关于爬虫内容请点击编者头像,就会发现其实就写了这一个

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值