优美图库 www.umei.cc
BV1Ag41137re
1/获取资源
查看网站资源结构
最大页码
内外层图集均有若干page。
通过尾页按钮确定pageNum:
2/发送请求
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding # 识别编码, 防止中文乱码
data = response.text
3/数据解析
selector.xpath('//div[@class="item masonry_brick"]/div/div/a/@href')
因为这里取第一个得到的信息不多(第一个在前面),所以取最后一个
img.xpath('//div[@class="pages"]/ul/li[last()]/a/@href').extract()
正则提取链接中的两个参数
[‘/meinvtupian/meinvxiezhen/311996_81.htm’]
re.compile(r'\d+').search(img_last[0]).group() # 311996
re.search(r'\d+', img_last[0].split('/')[-1]).group() # 81
4/保存数据
saved_folder = 'mzt\\'
if not os.path.exists(saved_folder):
os.mkdir(saved_folder)
with open(saved_folder + img_name, 'wb') as f:
print('正在保存:', img_name )
f.write(img_data)
🥝 建文件夹
os.mkdir
saved_folder = 'mzt1\\'
if not os.path.exists(saved_folder):
os.mkdir(saved_folder)
使用 os.makedirs 来创建文件夹,以便能够创建多级文件夹。
exist_ok参数设置为True时,可以自动判断当文件夹已经存在就不创建
saved_folder = 'mzt1\\'
os.makedirs(saved_folder, exist_ok=true)
🥝 添加延时
导入time模块,使用 time.sleep 添加请求间隔。
当请求数据过快过多时,可能会返回空的响应,添加延时可以很好地解决这一问题。
5/ 代码实现
优美图库导航栏下有一个home和8个list_item(nav-li-item),8个list_item下又分别设置若干子列表。将这些子列表看作外层图集outter,将外层图集中的一张图片打开后又得到子页面,这一层图中又有1~若干张图片,将这层图看作内层图片们inner,在outter外层图集列表得到的是缩略图,而在内层得到的是分辨率更高的图像。比如:
https://umei.ojbkcdn.com/file/bizhi/20220930/0dd0mr2fhzf.jpg # 外层获取的 缩略图
https://umei.ojbkcdn.com/file/bizhi/20220930/xls1xfyzme2.jpg # 内层获取的 高清图
🥝 缩略图
外层的多页的
import os
import re
import time
import requests
import parsel
BASE_URL = 'https://www.umei.cc/bizhitupian/diannaobizhi/index_{}.htm'
def get_page_num(url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
response = requests.get(url, headers=headers)
response.encoding = response.apparent_encoding
selector = parsel.Selector(response.text)
last_page_href = selector.css('div #pageNum a::attr(href)').getall()[-1]
return int(re.search(r'\d+', last_page_href.split('_')[-1]).group())
def download_image(href, name, folder='diannaobizhi'):
if not os.path.exists(folder):
os.makedirs(folder)
file_extension = os.path.splitext(href)[1] or '.jpg'
file_name = os.path.join(folder, f"{name}{file_extension}")
image_data = requests.get(href).content
with open(file_name, 'wb') as f:
f.write(image_data)
print(f'正在保存:{name}')
def main():
url = BASE_URL.format(2)
page_num = get_page_num(url)
for page in range(1, page_num + 1):
print(f'--------- 正在爬取第{page}页的内容 ----------')
url = BASE_URL.format(page) if page > 1 else url
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'}
response = requests.get(url, headers=headers)
response.encoding = response.apparent_encoding
selector = parsel.Selector(response.text)
for li in selector.css('.item_t a'):
href = li.css('img::attr(data-original)').get()
name = li.css('img::attr(alt)').get()
if name and href:
download_image(href, name)
time.sleep(5) # 添加延迟
if __name__ == "__main__":
main()
🥝 高清图
外层的单页里面的图集
import os
import re
import requests
import parsel
# 优美图库 www.umei.cc
# 1. 获取资源
url = 'https://www.umei.cc/meinvtupian/meinvxiezhen/'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36',}
# 2. 发送请求
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding # 识别编码, 防止中文乱码
data = response.text
#print(data)
# 3. 数据解析
# 3.1 转换数据类型
selector = parsel.Selector(data)
# 3.2 数据提取
href_list = selector.xpath('//div[@class="item masonry_brick"]/div/div/a/@href').extract()
#print(href_list)
for href in href_list:
href='https://www.umei.cc' + href
href_data = requests.get(href,headers=headers).text
img = parsel.Selector(href_data)
img_last = img.xpath('//div[@class="pages"]/ul/li[last()]/a/@href').extract()
#print(img_last)
#img_last_url = 'https://www.umei.cc' + img_last[0]
num = re.search(r'\d+', img_last[0]).group()
page_num = re.search(r'\d+', img_last[0].split('_')[-1]).group()
#img_src=[url+f'{num}.htm']
#img_data = [requests.get(img_src, headers=headers).content] # 获取数据
for page in range(1, int(page_num)+1):
if page == 1:
url1 = url+f'{num}.htm' # 请求地址
else:
url1 = url+f'{num}_{page}.htm' # 请求地址
#img_last_data = requests.get(img_last_url, headers=headers).content
data1 = requests.get(url1, headers=headers)
data1.encoding = data1.apparent_encoding
selector = parsel.Selector(data1.text)
img_url = selector.css('.big-pic img::attr(src)').get()
img_data= requests.get(img_url, headers=headers).content
img_name = selector.css('.big-pic img::attr(alt)').get()+ img_url.split('/')[-1]
# 4. 保存数据
saved_folder = 'mzt\\'
if not os.path.exists(saved_folder):
os.mkdir(saved_folder)
with open(saved_folder + img_name, 'wb') as f:
print('正在保存:', img_name )
f.write(img_data)