python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?
有时候
只是在人群中多看了一眼
就再也没办法忘掉那些容颜
小帅b在普通的一天
上着普通的网
不小心打开了一个不太普通的网站
https://www.mzitu.com/
从此进入了不普通的一天
看着不普通的妹纸
动起了不普通的心思
恩
这么多妹纸
不爬取下来
可惜了
那么
接下来就是
首先我们来分析一下
打开这个妹纸的网站首页
可以看到一共有 211 页
其中
每一页有不同妹纸的主图
再点击进去就是每个妹纸的详情组图
每一个妹纸的组图中的图片数量不同
比如其中一个妹纸就有 46 张
够了
我们回到首页
看一下源代码
可以发现
每一页的每一个妹纸都被放在 li 标签里面了
再来
当我们点击第 2 页的时候
可以发现 URL 变了
https://www.mzitu.com/page/2/
这个我们遇到很多次了
直接当做变量处理
所以第一个思路就是拿到每一个页面的所有妹纸的地址
在这里
我们可以使用 for 循环来获取每一页的内容
用 bs4获取每一个地址然后放到 urls 里面去
def get_page_urls():
for i in range(1,212):
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')
urls.append(url)
return urls
在这里 212 页太多了
小帅b来获取一页的数据
运行一下得到第一页每个妹纸的 URL
https://www.mzitu.com/171304
https://www.mzitu.com/175090
https://www.mzitu.com/171608
https://www.mzitu.com/171795
https://www.mzitu.com/171041
https://www.mzitu.com/175154
https://www.mzitu.com/170736
https://www.mzitu.com/174947
https://www.mzitu.com/174762
https://www.mzitu.com/170806
https://www.mzitu.com/174433
https://www.mzitu.com/174860
https://www.mzitu.com/173541
https://www.mzitu.com/173063
https://www.mzitu.com/173109
https://www.mzitu.com/173760
https://www.mzitu.com/170563
https://www.mzitu.com/170263
https://www.mzitu.com/166044
https://www.mzitu.com/173721
https://www.mzitu.com/168454
https://www.mzitu.com/171747
https://www.mzitu.com/173845
https://www.mzitu.com/173635
恩
下一步
拿到每一页的每个妹纸的地址之后
当然是要从每个地址进去
获取每个妹纸的所有组图
遍历一下刚刚获取到的 list
for url in list_page_urls:
download(url)
那么进入一个妹纸的详情页面的时候
我们需要获取
组图的所有图片数量
组图的名称(真特么sao)
图片的地址
知道了这些信息之后
我们就可以很简单获取了
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)
在这里我们获取了 total 总页数
获取到了组图题目 title
根据总页数进行遍历
一个页面可以获取到组图中的一张图片
然后我们把这些图片都放到组图集合中
接着就可以开始下载了
我们可以根据这个组图的名字来创建文件夹
然后将下载的图片放进去
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
ok
我们运行一下吧
可以看到
每张图片都被我们爬下来了
名字太他妈引入犯罪
小帅b不得不打马赛克
反正你们阅片无数
心中自然无码
打开文件夹可以看到
每一个美女都根据组图生成文件夹
每个文件夹就是组图里面的图片
我这马赛克打得是不是很棒?
但其实
发现我们在爬的时候
有点慢了
还记不记得上次摸鱼提到的多线程?
python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!
恩
我们来开启多线程试试
根据我们一开始获取到每个页面的多个妹纸的 URL 来使用线程池
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:
exector.submit(download,url)
这次我们再爬取试试看
可以看到这次就不是一组一组的爬了
而是多个线程同时爬取多个组图
OMG
我的文件夹
不行了
我赶紧删掉
完整代码
公众号发送「mm」获取吧
警告
本文仅作为学习例子
你别乱来啊
咱们下回见
peace
点个好看啊~~(破音)
python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?的更多相关文章
- Python爬虫进阶五之多线程的用法
前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...
- Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)
Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...
- [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息
[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫 版权声明: ...
- Python爬虫实战(2):爬取京东商品列表
1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...
- Python爬虫个人记录(三)爬取妹子图
这此教程可能会比较简洁,具体细节可参考我的第一篇教程: Python爬虫个人记录(一)豆瓣250 Python爬虫个人记录(二)fishc爬虫 一.目的分析 获取煎蛋妹子图并下载 http://jan ...
- Python爬虫教程-12-爬虫使用cookie爬取登录后的页面(人人网)(上)
Python爬虫教程-12-爬虫使用cookie(上) 爬虫关于cookie和session,由于http协议无记忆性,比如说登录淘宝网站的浏览记录,下次打开是不能直接记忆下来的,后来就有了cooki ...
- Python爬虫入门教程: 27270图片爬取
今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的 ...
- Python爬虫实战(1):爬取Drupal论坛帖子列表
1,引言 在<Python即时网络爬虫项目: 内容提取器的定义>一文我们定义了一个通用的python网络爬虫类,期望通过这个项目节省程序员一半以上的时间.本文将用一个实例讲解怎样使用这个爬 ...
- Python爬虫小白入门(六)爬取披头士乐队历年专辑封面-网易云音乐
一.前言 前文说过我的设计师小伙伴的设计需求,他想做一个披头士乐队历年专辑的瀑布图. 通过搜索,发现网易云音乐上有比较全的历年专辑信息加配图,图片质量还可以,虽然有大有小. 我的例子怎么都是爬取图片? ...
随机推荐
- mac 下安装caffe(一)
1.brew install --build-from-source -vd boost boost-python 这一步出错:libtool: unrecognized option `-stati ...
- Java 并发编程(二)对象的公布逸出和线程封闭
对象的公布与逸出 "公布(Publish)"一个对象是指使对象可以在当前作用域之外的代码中使用.可以通过 公有静态变量.非私有方法.构造方法内隐含引用 三种方式. 假设对象构造完毕 ...
- Selenium-一个用于Web应用程序测试的工具
Selenium.pptx
- android studio中xml文件代码提示问题
在系统控件中输入“a”能提示出android:id等所有属性.而在第三方库的控件中输入“a”只会提示“appNs”,但如果手动写app:id="@+id/aaa"系统也是可以识别的 ...
- 第一周 Leetcode 57. Insert Interval (HARD)
Insert interval 题意简述:给定若干个数轴上的闭区间,保证互不重合且有序,要求插入一个新的区间,并返回新的区间集合,保证有序且互不重合. 只想到了一个线性的解法,所有区间端点,只要被其 ...
- C#窗体间传值的简便方法/工具
一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...
- JS连续滚动幻灯片:原理与实现
什么是连续滚动幻灯片?打开一些网站的首页,你会发现有一块这样的区域:一张图片,隔一段时间滑动切换下一张:同时,图片两端各有一个小按钮,供你手动点选下一张:底部有一排小圆圈,供你选定特定的某帧图片.这就 ...
- VUE修改每个页面title
//index.js routes: [ { name:'home', path: '/home/:openname', component: Home, meta: { title: '首页' } ...
- ACM_三角形蛇形矩阵
三角形蛇形矩阵 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小铠觉得各类题型是要温故而知新的,所以他叫小发出一道类似做过的题. ...
- Offer收割_5
训练 投入 欲望. ---贾森博尔特 第一题:二分枚举答案,check时候模拟一下即可. 时间复杂度: O(n*logn). 第二题: 描述 小Hi在虚拟世界中有一只小宠物小P.小P有K种属性,每种 ...