Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?

Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


前言

人生苦短,Python當歌!學習,其實是一個堅持、分享、交流、提高的過程。我有一整套python零基礎+上百個python項目案例視頻資料+就業指導分享,需要的話關注+轉發、然後私信我“01”即可免費獲取

資料展示:


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?

python爬蟲


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


用python爬蟲是一件非常使人愉快的事情,圖片、數據、小視頻一切皆可爬取,可是我們會經常發現下載圖片的時候會非常慢,難以忍受。

我們都知道一個人做事必然沒有十個人做事快,那一個進程速度慢,用十個進程就好了呀。所以今天要跟大家分享一個多進程爬蟲的製作。(GIL的存在導致Python的多線程點有坑)


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


大家應該知道在多進程中,進程之間是不能相互通信的,這就有一個問題出現了!多個進程怎麼知道哪些需要爬取、哪些已經被爬取了?

這就涉及到

隊列了,如果需要更為穩定健壯的隊列,應該使用Celery這一類的專用消息傳遞工具,不過為了簡便,這次我們使用MongoDB。

構建思路

好了!先來理一下思路:每個進程需要知道哪些URL爬取過了、哪些URL需要爬取!我們來給每個URL設置兩種狀態:

outstanding:等待爬取的URL

complete:爬取完成的URL

那麼失敗的URL的怎麼辦呢?我們在增加一種狀態:

processing:正在進行的URL

嗯!當一個所有初始的URL狀態都為outstanding;當開始爬取的時候狀態改為:processing;爬取完成狀態改為:complete;失敗的URL重置狀態為:outstanding。為了能夠處理URL進程被終止的情況、我們設置一個計時參數,當超過這個值時;我們則將狀態重置為outstanding。

接下來看代碼部分

首先我們需要一個模塊:datetime(這個模塊比內置time模塊要好使一點)

下面是隊列的代碼:


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


代碼1


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


代碼2


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


代碼3

好了,隊列我們做好了,下面是獲取所有頁面的代碼。


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


下面就是多進程+多線程的下載代碼了:


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


好啦!一個多進程多線的爬蟲就完成了。(其實可以設置一下MongoDB,然後調整一下連接配置,在多臺機器上跑哦!!嗯,就是超級簡化版的分佈式爬蟲了,雖然很是簡陋。

大家可以參考上面代碼,單獨處理圖片地址試試(就是多個進程直接下載圖片)應該八分鐘能下載100套圖~


Python程序員爬出百套美女寫真集,同樣是爬蟲,他為何如此突出?


當然還有一種加速的方法叫做“異步”!因為爬蟲大部分時間都是在等待response中!‘異步’則能讓程序在等待response的時間去做的其他事情,當然也會複雜許多。


分享到:


相關文章: