咱們在以前的文章談到了高效爬蟲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 沒煩惱
點個好看啊~~(破音)