不小心打开了一个不太普通的网站
image从此进入了不普通的一天
看着不普通的妹纸
动起了不普通的心思
image恩
这么多妹纸
不爬取下来
可惜了
那么
接下来就是
image首先我们来分析一下
打开这个妹纸的网站首页
可以看到一共有 211 页
image其中
每一页有不同妹纸的主图
再点击进去就是每个妹纸的详情组图
每一个妹纸的组图中的图片数量不同
比如其中一个妹纸就有 46 张
够了
image image我们回到首页
看一下源代码
image可以发现
每一页的每一个妹纸都被放在 li 标签里面了
再来
当我们点击第 2 页的时候
可以发现 URL 变了
这个我们遇到很多次了
直接当做变量处理
所以第一个思路就是拿到每一个页面的所有妹纸的地址
在这里
我们可以使用 for 循环来获取每一页的内容
用bs4获取每一个地址然后放到 urls 里面去
def get_page_urls():
在这里 212 页太多了
来获取一页的数据
运行一下得到第一页每个妹纸的 URL
https://www.mzitu.com/171304
恩
下一步
拿到每一页的每个妹纸的地址之后
当然是要从每个地址进去
获取每个妹纸的所有组图
image遍历一下刚刚获取到的 list
for url in list_page_urls:
那么进入一个妹纸的详情页面的时候
Python学习交流群:556370268,有大牛答疑,有资源共享!有想学习python编程的,想提升自己能力的,欢迎加入讨论学习。
我们需要获取
组图的所有图片数量
image组图的名称(真特么sao)
image图片的地址
image知道了这些信息之后
我们就可以很简单获取了
def download(url):
在这里我们获取了 total 总页数
获取到了组图题目 title
根据总页数进行遍历
一个页面可以获取到组图中的一张图片
然后我们把这些图片都放到组图集合中
接着就可以开始下载了
我们可以根据这个组图的名字来创建文件夹
然后将下载的图片放进去
ok
ok
我们运行一下吧
image可以看到
每张图片都被我们爬下来了
名字太他妈引入犯罪
不得不打马赛克
反正你们阅片无数
心中自然无码
打开文件夹可以看到
每一个美女都根据组图生成文件夹
每个文件夹就是组图里面的图片
image我这马赛克打得是不是很棒?
image但其实
发现我们在爬的时候
有点慢了
我们来开启多线程试试
根据我们一开始获取到每个页面的多个妹纸的 URL 来使用线程池
def download_all_images(list_page_urls):
这次我们再爬取试试看
image可以看到这次就不是一组一组的爬了
而是多个线程同时爬取多个组图
OMG
我的文件夹
image不行了
我赶紧删掉
完整代码
# encoding = utf-8
import concurrent
import os
from concurrent.futures import ThreadPoolExecutor
import requests
from bs4 import BeautifulSoup
def header(referer):
headers = {
'Host': 'i.meizitu.net',
'Pragma': 'no-cache',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Referer': '{}'.format(referer),
}
return headers
def request_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except requests.RequestException:
return None
def get_page_urls():
for i in range(1,2):
baseurl = 'https://www.mzitu.com/page/{}'.format(i)
html = request_page(baseurl)
soup = BeautifulSoup(html, 'lxml')
list = soup.find(class_='postlist').find_all('li')
urls= []
for item in list:
url =item.find('span').find('a').get('href')
print(url)
urls.append(url)
return urls
def download_Pic(title, image_list):
# 新建文件夹
os.mkdir(title)
j = 1
# 下载图片
for item in image_list:
filename = '%s/%s.jpg' % (title,str(j))
print('downloading....%s : NO.%s' % (title,str(j)))
with open(filename, 'wb') as f:
img = requests.get(item,headers=header(item)).content
f.write(img)
j+=1
def download(url):
html = request_page(url)
soup = BeautifulSoup(html, 'lxml')
total = soup.find(class_='pagenavi').find_all('a')[-2].find('span').string
title = soup.find('h2').string
image_list = []
for i in range(int(total)):
html = request_page(url + '/%s' % (i + 1))
soup = BeautifulSoup(html, 'lxml')
img_url = soup.find('img').get('src')
image_list.append(img_url)
download_Pic(title, image_list)
def download_all_images(list_page_urls):
# 获取每一个详情妹纸
works = len(list_page_urls)
with concurrent.futures.ThreadPoolExecutor(works) as exector:
for url in list_page_urls:
print(url)
exector.submit(download,url)
if __name__ == '__main__':
# 获取每一页的链接和名称
list_page_urls = get_page_urls()
download_all_images(list_page_urls)
网友评论