咱们在以前的文章谈到了高效爬虫html
在 python 中python
多线程下的 GIL 锁会让多线程显得有点鸡肋多线程
特别是在 CPU 密集型的代码下app
多线程被 GIL 锁搞得效率不高python爬虫
特别是对于多核的 CPU 来讲函数
若是想要充分利用 CPU 学习
仍是用多进程吧url
这样咱们就能够作到并行爬取spa
提升了爬取的效率线程
那么,怎么玩多进程呢
恩
接下来就是
可使用 multiprocessing 来实现多进程
使用起来也是很简单的
好比咱们使用 Process 这个类来建立进程
from multiprocessing import Process
def f(name): print('hello', name)
if __name__ == '__main__': p = Process(target=f, args=('xiaoshuaib',)) p.start() p.join()
还可使用进程池的方式
from multiprocessing import Pool
def f(x): return x*x
if __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 没烦恼
点个好看啊~~(破音)