Py学习  »  Python

python爬取“堆糖网”小姐姐 图片

婉儿高空坠物 • 3 年前 • 126 次点击  

在堆糖网官网首页上搜索关键字:小姐姐
在这里插入图片描述
我们往下翻,发现它的图片内容是通过瀑布流来动态加载的。

静态网页中会有24张图片,查看源代码,也仅仅发现只有24张图片。

初步分析,其他图片应该是通过数据包的形式去动态请求的。

打开开发者工具,选择 Network->XHR

鼠标滚轮往下滑,捕获到一个数据包:
在这里插入图片描述
果不其然,它里面包含了我们需要的数据:
在这里插入图片描述
该数据包的请求地址,太长了:
在这里插入图片描述
我们仅仅需要的是图片,所以有很多参数我们不需要。

所以,我们删减去一部分,只剩下kw和start即可,kw是我们搜索的关键字,start是数据包中所包含数据的起始序号(它是24的倍数)

第一个数据包,是刚开始就加载的,它的start应该是0,第二个数据包的start是24,所以每个数据包包含了24张图片。

我们滑到最下方,点击第二页,再进行数据包的抓取:
在这里插入图片描述
可以看到,它的start是168

可想而知,不管页数怎么变化,我只要更改start参数的值,岂不是可以获取到该关键字(小姐姐)下搜索的全部图片。

那么,每一页究竟有多少个数据包,对应多少张图片呢?(如果我们有分页爬取的需求,就得知道这个)

很简单,回到第一页,再次打开开发者选项,鼠标滚轮滑到该页末尾,发现共获取到5个数据包:
在这里插入图片描述
我们大胆猜测一页共有6个数据包(其中一个是相当于静态加载的)。

那么一页就有6*24 共144张图片。

再看最后一个数据包的start ,它等于120
在这里插入图片描述
120+24 = 144 刚好印证了我们的猜想。


输入爬取几页,就爬取几页,按需爬取。

代码:

import os
import requests
import json
import jsonpath
from urllib.parse import quote
from urllib.request import urlretrieve

# 所请求的url :https://www.duitang.com/napi/blog/list/by_search/?kw=%E5%B0%8F%E5%A7%90%E5%A7%90&start=24
headers = {'User-Agent': 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}
keyword = '小姐姐' #可自行指定
kw = quote(keyword)
page_num = input('您一共要爬取几页图片?(每页144张图片):')
page_num = int(page_num)

def get_img_data(kw,start):
    savePath = './图片/{}/'.format(keyword)
    if not os.path.exists(savePath):
        os.mkdir(savePath)
    url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}'.format(kw,start)
    resp = requests.get(url,headers=headers)
    # 将json数据转化为字典格式
    data_dict = json.loads(resp.text)
    # 从字典中快速得到我们想要的信息($代表根结点下  ..代表任意层次)
    img_pathList = jsonpath.jsonpath(data_dict,'$..path')
    # 通过for循环进行下载
    num = start+1
    for path in img_pathList:
        # 有的图片的jpeg,有的图片是jpg
        img_type = os.path.splitext(path)[-1]#.jpeg   .jpg
        # 有的图片是gif,但是识别到的却是 gif_jpeg,这种图片下载下载就不是动图了,而是10kb左右的低品质图
        if(img_type.find('gif_jpeg')!=-1):
            # 经过细心观察,发现它貌似所有的gif图片的真实路径后面都是thumb.400_0.gif为结尾
            path = path.replace('gif_jpeg','thumb.400_0.gif')
            img_type = '.gif'
        try:
            saveLocation = f'{savePath}{keyword}{num}{img_type}'
            urlretrieve(path,saveLocation)
            print('{}{}{} 下载成功...'.format(keyword,num,img_type) )
            num+=1
        except Exception as


    
 e:
            print(e)

def page_download(pageNum):
    offset = 24 #一个数据包24张图片
    onePage = 144 #每页有6个数据包
    for i in range(0,onePage*page_num,offset):
        get_img_data(kw,i)

page_download(page_num)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

在这里插入图片描述
看到这里了,点个赞再走呗😊

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70887
 
126 次点击