python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影
我们在之前的文章谈到了高效爬虫
在 python 中
多线程下的 GIL 锁会让多线程显得有点鸡肋
特别是在 CPU 密集型的代码下
多线程被 GIL 锁搞得效率不高
特别是对于多核的 CPU 来说
如果想要充分利用 CPU
还是用多进程吧
这样我们就可以做到并行爬取
提高了爬取的效率

那么,怎么玩多进程呢
恩
接下来就是

可以使用 multiprocessing 来实现多进程
使用起来也是很简单的
比如我们使用 Process 这个类来创建进程
from multiprocessing import Processdef f(name):print('hello', name)if __name__ == '__main__':p = Process(target=f, args=('xiaoshuaib',))p.start()p.join()
还可以使用进程池的方式
from multiprocessing import Pooldef f(x):return x*xif __name__ == '__main__':with Pool(5) as p:print(p.map(f, [1, 2, 3]))
还记得我们之前爬取过 250 部电影么
python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看
那会我们还不知道啥是多进程
你先去运行一下
记录一下运行时间

接着
我们对这个代码修改一下
让它具备多进程
def main(url):html = request_douban(url)soup = BeautifulSoup(html, 'lxml')save_content(soup)if __name__ == '__main__':start = time.time()urls = []pool = multiprocessing.Pool(multiprocessing.cpu_count())for i in range(0, 10):url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='urls.append(url)pool.map(main, urls)pool.close()pool.join()
简单解释一下代码
在这里
我们根据电脑 CPU 的内核数量
创建相应的进程池
pool = multiprocessing.Pool(multiprocessing.cpu_count())
我们的进程数不需要大于内核数
因为进程数创建得再多反而没什么好处
通过 map 方法去执行我们的主函数
将我们获得的 url 传过去
pool.map(main, urls)
然后我们调用了进程池的 close 方法
让它不再创建进程
pool.close()
我们调用了 join 方法
pool.join()
为的是让进程池的进程执行完毕再结束
ok
你再运行一下
再记录一下运行时间
对比一下
你会发现速度翻了好几番了
当然
这取决于你电脑的 CPU
你还可以去爬取数据量大一些的数据
这样对比会更加明显一些
快去试一下吧

往期文章
python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?
python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!
python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

扫一扫
学习 Python 没烦恼

点个好看啊~~(破音)

python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影的更多相关文章
- 简单的爬虫例子——爬取豆瓣Top250的电影的排名、名字、评分、评论数
爬取思路: url从网页上把代码搞下来bytes decode ---> utf-8 网页内容就是我的待匹配的字符串ret = re.findall(正则,待匹配的字符串), ret 是所有匹配 ...
- python爬取豆瓣top250的电影数据并存入excle
爬取网址: https://movie.douban.com/top250 一:爬取思路(新手可以看一下) : 1:定义两个函数,一个get_page函数爬取数据,一个save函数保存数据,mian中 ...
- python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看
马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...
- Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...
- Python爬取豆瓣音乐存储MongoDB数据库(Python爬虫实战1)
1. 爬虫设计的技术 1)数据获取,通过http获取网站的数据,如urllib,urllib2,requests等模块: 2)数据提取,将web站点所获取的数据进行处理,获取所需要的数据,常使用的技 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
- Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...
- 零基础爬虫----python爬取豆瓣电影top250的信息(转)
今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...
- Python爬虫入门:爬取豆瓣电影TOP250
一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...
随机推荐
- linux内核中的宏ffs(x)
linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/include/asm/bitops.h #define ffs(x) ({ unsigned long __ ...
- bzoj1805: [Ioi2007]Sail 船帆
可以发现旗杆的顺序是没有用的,对于每列,它的答案是它的最大值mx*(mx+1)/2 高度由小到大排序旗杆,问题可以转化为在前h行选k个最小的值 考虑激情splay乱搞(我只会splay......) ...
- luogu 3383【模板】线性筛素数
我太菜了 %韩神 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib&g ...
- yistack
- 同一个Tomcat下不同项目之间的session共享
最近发现项目运行过程中经常会抛出一个 NullPointerException的异常,经检查发现异常出现的地方是日志模板,一阵检查,正常无误 (把所有记录日志的地方都点了一遍,心里是崩溃的),万念俱灰 ...
- E20170624-ts
stateless adj. 无国家的,无国籍的; groupware 群件 cookie n. 饼干; 小甜点; 吸引人的年轻妇女; 甜面包; session n. 开会,会议; (法庭的) 开 ...
- 父页面调用子页面js的方法
iframe子页面调用父页面javascript函数的方法今天遇到一个iframe子页面调用父页面js函数的需求,解决起来很简单,但是在chrome浏览器遇到一点小问题.顺便写一下iframe的父页面 ...
- codevs3981动态最大子段和(线段树)
3981 动态最大子段和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 题目还是简单一点好... 有n个数,a ...
- redis取经之路
redis基本数据结构 Redis使用的是自己构建的简单动态字符串(SDS)[simple dynamic string,SDS]的抽象类型,并将SDS用做Rdis的默认字符串表示 redis> ...
- 对于Mobile模块化的概念认知(小白)
最近刚刚学习了Mobile的一些基础知识,把它整理一下方便自己的学习 那什么是Mobile呢? 自己的理解是将一个项目中共同的部分抽出来,这样就形成了Mobile模块. 为什么要使用Mobile呢? ...