python爬蟲16 | 你,快去試試用多進程的方式從新去爬取豆瓣上的電影

咱們在以前的文章談到了高效爬蟲html

 

在 python 中python

 

多線程下的 GIL 鎖會讓多線程顯得有點雞肋多線程

 

特別是在 CPU 密集型的代碼下app

 

多線程被 GIL 鎖搞得效率不高python爬蟲

 

特別是對於多核的 CPU 來講函數

 

若是想要充分利用 CPU 學習

 

仍是用多進程url

 

這樣咱們就能夠作到並行爬取spa

 

提升了爬取的效率線程

 

 

那麼,怎麼玩多進程呢

 

 

接下來就是

 

學習 python 的正確姿式

 

 

 

可使用 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 沒煩惱

 

 

 

      點個好看啊~~(破音)

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息