在堆糖网官网首页上搜索关键字:小姐姐
我们往下翻,发现它的图片内容是通过瀑布流来动态加载的。
静态网页中会有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
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)
data_dict = json.loads(resp.text)
img_pathList = jsonpath.jsonpath(data_dict,'$..path')
num = start+1
for path in img_pathList:
img_type = os.path.splitext(path)[-1]
if(img_type.find('gif_jpeg')!=-1):
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
onePage = 144
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
看到这里了,点个赞再走呗😊