嘘~ 正在从服务器偷取页面 . . .

冰冻三尺,非一日之寒。数据解析——xpath(3)


什么?我怎么又讲爬取图片?拜托,这可是 4k 图片,清晰度杠杠的。再说,爬取糗图算什么本事,做人要爬取的肯定是妹子图片,而且是 4k 的妹子图片,是不是很激动?放心,这次不晃你。

源码分析

首先让我们打开网页,好好欣赏一下美丽的妹子……哦不,我是说,好好的欣赏一下优美的网页源码。网址如下:https://pic.netbian.com/4kmeinv/

看,是不是优美的妹子?……额咳咳,我是说优美的源码。

很好,我们注意一下定位到的源码数据,也就是我圈的地方,这里有图片的网址和图片的标题。我们就把原标题作为我们下载后的标题。注意,这里的网址没有域名,是需要我们自己加的,也就是 “https://pic.netbian.com”。

欧克,是不是迫不及待了,让我们和小姐姐更进一步吧,咳咳,我是说,不说了,你懂的!

文字编译

import requests
from lxml import etree

if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定网址
    url = "https://pic.netbian.com/4kmeinv/"

    # 获取源码
    response = requests.get(url = url, headers = header).text

    # xpath 解析
    tree = etree.HTML(response)
    new_url_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@src')
    title_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@alt')
    
    # 测试
    print(new_url_ist)
    print()
    print(title_list)
    print(len(title_list) == len(new_url_list))

结果测试的时候发现不对了,我们的标题全都变成乱码了

再一看,哦,我们太激动忘记编译了,赶紧编译一下。

import requests
from lxml import etree

if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定网址
    url = "https://pic.netbian.com/4kmeinv/"

    # 获取源码
    response = requests.get(url = url, headers = header)
    response.encode = "utf-8"
    response = response.text

    # xpath 解析
    tree = etree.HTML(response)
    new_url_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@src')
    title_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@alt')
    
    # 测试
    print(new_url_list)
    print()
    print(title_list)
    print(len(title_list) == len(new_url_list))

这回总该可以了吧,再一看,怎么回事,还是乱码。

这是为什么?难道说所谓的 4k 美女图片只可远观不可亵玩吗?我不相信,赶紧去研究研究。正所谓,“X 是第一生产力”,我很快就研究出结果了,一般情况下,如果源码里有中文,我们可以有两种办法。一种是我们用的方法,另一种方法如下:

response = response.encode("iso-8859-1").decode("gbk")

我们再试一次

import requests
from lxml import etree

if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定网址
    url = "https://pic.netbian.com/4kmeinv/"

    # 获取源码
    response = requests.get(url = url, headers = header).text
    response = response.encode("iso-8859-1").decode("gbk")
 

    # xpath 解析
    tree = etree.HTML(response)
    new_url_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@src')
    title_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@alt')
    
    # 测试
    print(new_url_list)
    print()
    print(title_list)
    print(len(title_list) == len(new_url_list))

测试一下

欧克,是中文了,接着可以爬取4k妹子图片了。

爬取妹子图

import requests
from lxml import etree
import os

if __name__ == "__main__":
    # 创建文件夹
    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片"):
        os.mkdir("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片")

    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    for index in range(1, 4): # 翻三页
        # 指定网址
        if index == 1:
            url = "https://pic.netbian.com/4kmeinv/"
        else:
            url = "https://pic.netbian.com/4kmeinv/index_%s.html" % index

        # 获取源码
        response = requests.get(url = url, headers = header).text
        response = response.encode("iso-8859-1").decode("gbk")
 

        # xpath 解析
        tree = etree.HTML(response)
        new_url_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@src')
        title_list = tree.xpath('//div[@class="slist"]/ul/li/a/img/@alt')
    
        # 测试
        # print(new_url_list)
        # print()
        # print(title_list)
        # print(len(title_list) == len(new_url_list))

        num = len(title_list)
        for i in range(num):
            new_url = "https://pic.netbian.com" + new_url_list[i]
            title = title_list[i]
            photo = requests.get(url = new_url, headers = header).content
            # 保存
            with open("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片\\" + title + ".jpg", "wb") as fp:
                fp.write(photo)
                print(title, "下载完成!!!")
    print("over!!!")

完成后,我们激动地打开图片,滚烫的热血突然就冷下来了,不是说是4k高清图吗,怎么不仅是缩略图,而且画质还不行。


别着急,这可不是我骗你,是网址留了一手。

爬取真正的4k妹子图

现在我们知道了网址源码里的网址是缩略图,那么我们怎么办呢?很简单,我们点击一下会怎样?

然后我们来到了下载页面。

现在我们没有任何办法,那就试着看看现在的网页源码好了。

结果我们发现了两个图片的地址,点开,发现一个是缩略图,一个是4k妹子图。如图。


是不是又感觉热血沸腾了?嘿嘿

闲话少说,赶紧改进代码

import requests
from lxml import etree
import os

if __name__ == "__main__":
    # 创建文件夹
    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片(4k)"):
        os.mkdir("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片(4k)")

    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    for index in range(1, 4): # 翻三页
        # 指定网址
        if index == 1:
            url = "https://pic.netbian.com/4kmeinv/"
        else:
            url = "https://pic.netbian.com/4kmeinv/index_%s.html" % index

        # 获取源码
        response = requests.get(url = url, headers = header).text
        response = response.encode("iso-8859-1").decode("gbk")
 

        # xpath 解析
        tree = etree.HTML(response)
        # li 标签所在的列表,下载页面的网址在 li 标签内
        li_list = tree.xpath('//div[@class="slist"]/ul/li')

        for li in li_list:
            # 获取下载页面的网址
            new_url = "https://pic.netbian.com" + li.xpath('a/@href')[0]
            # 获取下载页面的网页源码
            new_response = requests.get(url = new_url, headers = header).text
            new_response = new_response.encode("iso-8859-1").decode("gbk") # 编译文字
            # xpath 解析
            new_tree = etree.HTML(new_response)
            # 下载的地址
            src = "https://pic.netbian.com" + new_tree.xpath('//*[@id="img"]/img/@src')[0]
            # 图片标题
            title = new_tree.xpath('//*[@id="img"]/img/@title')[0]
            # 获取图片
            photo = requests.get(url = src, headers = header).content
            # 保存
            with open("C:\\Users\\ASUS\\Desktop\\CSDN\\数据解析\\xpath\\爬取 4k 图片\\4k图片(4k)\\" + title + ".jpg", "wb") as fp:
                fp.write(photo)
            print(title, "下载成功!!!")
    print("over!!!")

运行结束了,赶紧打开照片看一看,很好,这次真的是4k妹子图片了。


文章作者: New Ass
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 New Ass !
  目录