如果用 for loop 的話就會像右邊那樣,必須等待 A 做完了才能接著做 B 還有其他後面的 task;但是如果能像左邊那樣,把程式平行化同時處理五個 task,豈不是更有效率。 還好 Python standrad library 裡面的 multiprocessing 可以做到,multiprocessing 裡面有個叫做 Pool 的東西,能夠實現上圖左邊的流程。程式碼如下
1 2 3 4 5 6 7
if __name__ == '__main__': with Pool(10) as p: post_meta = p.map(parse_get_each_row, links) all_post_meta = list() for each_page in post_meta: for each_post in each_page: all_post_meta.append(each_post)
注意:如果要用 Pool 的話一定要在 if __name__ == '__main__' 裡面
可以把 Pool 裡面的數字想像成上圖左邊的分支數量,數字大正常情況下當然比較快,但是還得考慮到網路狀況、硬體限制等。我在學校自己測試的時候 for loop 比 Pool 慢了快要 10 倍,然後 5 ~ 7 行可以請讀者自己研究看看為什麼要這樣寫。
先說到這吧~目前已經可以取得我們要的頁數的所有文章連結了,並透過函數加速讓爬蟲更有效率。下一篇應該是 PTT 爬蟲最後一篇,等 PTT 系列告一段落後就會繼續往 facebook、MOBILE01 爬蟲前進,到時候在談談我做了什麼。