爬虫实例(2):图片爬取

184 阅读2分钟

爬取图片

本次案例提供的网站的url是 pic.netbian.com/4kmeinv/ 上面有许多类型的图片可供爬取,我选择的是美女图,大家懂得都懂,下面直接进入正题。 在这里插入图片描述

导入相关包

import requests
import os
from lxml import etree

UA伪装

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

发送请求获得页面的响应数据

page_text = requests.get(url = url, headers = headers)

在本次案例中,由于编译器对页面源码预测的编码格式和源码本身的编码格式不一样导致中文乱码,所以我们要手动将他们设置成一样的编码格式,一般有以下三种方式,一种方法不行就再尝试其他两种方法

page_text.encoding = 'utf-8'
page_text.encoding = page_text.apparent_encoding
page_text = page_text.text
img_name = img_name.encode('iso-8859-1').decode('gbk')

创建etree对象并且防止不规范的HTML编码的网页

parse = etree.HTMLParser(encoding="utf-8")
tree = etree.HTML(page_text, parser = parse)

寻找照片在源码中的标签,分析源码可知图片位于源码的 li 标签中,因此通过xpath获取所有 li 标签 在这里插入图片描述

li_list = tree.xpath('//ul[@ class = "clearfix"]/li')

当然我们除了手动书写xpath表达式之外,也可以在源码中直接复制表达式 在这里插入图片描述

li_list = tree.xpath('// *[ @ id = "main"] / div[3] / ul / li[1]')

获得所有的 li 标签之后,我们就要得到每张图片的网址,也就是 li 标签的直系 a 标签的 href 属性值 在这里插入图片描述

img_src = "https://pic.netbian.com/" + li.xpath('./a/img/@src')[0]

最后便是发送 get 请求获取图片数据然后持久化存储,结果:在这里插入图片描述 全部代码:

#解析下载图片数据
import requests
import os
from lxml import etree

if __name__ == "__main__" :
    parse = etree.HTMLParser(encoding = "utf-8")
    headers = {
        'User-Agent' : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36"
    }
    url = "https://pic.netbian.com/4kmeinv/"
    page_text = requests.get(url = url, headers = headers)
    # 通用处理中文乱码的解决方案
    # img_name = img_name.encode('iso-8859-1').decode('gbk')
    page_text.encoding = page_text.apparent_encoding
    page_text = page_text.text
    tree = etree.HTML(page_text, parser = parse)

    li_list = tree.xpath('//ul[@ class = "clearfix"]/li')

    if not os.path.exists('picLibs') :
        os.mkdir('picLibs')

    for li in li_list :
        img_name = li.xpath('./a/img/@alt')[0] + '.jpg'
        img_src = "https://pic.netbian.com/" + li.xpath('./a/img/@src')[0]
        img_data = requests.get(url = img_src, headers = headers).content

        with open('picLibs/' + img_name, 'wb') as fp :
            fp.write(img_data)