python爬蟲15 | 害羞,用多線程秒爬那些萬惡的妹紙們,紙巾呢?

有時候html

 

只是在人羣中多看了一眼python

 

就再也沒辦法忘掉那些容顏多線程

 

小帥b在普通的一天app

 

上着普通的網python爬蟲

 

不當心打開了一個不太普通的網站post

 

https://www.mzitu.com/學習

 

 

今後進入了不普通的一天網站

 

看着不普通的妹紙url

 

動起了不普通的心思spa

 

 

 

這麼多妹紙

 

不爬取下來

 

惋惜了

 

那麼

 

接下來就是

 

學習 python 的正確姿式

 

 

首先咱們來分析一下

 

打開這個妹紙的網站首頁

 

能夠看到一共有 211 頁

 

 

其中

 

每一頁有不一樣妹紙的主圖

 

再點擊進去就是每一個妹紙的詳情組圖

 

每個妹紙的組圖中的圖片數量不一樣

 

好比其中一個妹紙就有 46 張

 

夠了

 

 

 

咱們回到首頁

 

看一下源代碼

 

能夠發現

 

每一頁的每個妹紙都被放在 li 標籤裏面了

 

再來

 

當咱們點擊第 2 頁的時候

 

能夠發現 URL 變了

 

https://www.mzitu.com/page/2/

 

這個咱們遇到不少次了

 

直接當作變量處理

 

因此第一個思路就是拿到每個頁面的全部妹紙的地址

 

在這裏

 

咱們可使用 for 循環來獲取每一頁的內容

 

bs4 獲取每個地址而後放到 urls 裏面去

 

def get_page_urls():
    for i in range(1,212): baseurl = 'https://www.mzitu.com/page/{}'.format(i) html = request_page(baseurl) soup = BeautifulSoup(html, 'lxml') list = soup.find(class_='postlist').find_all('li') urls= [] for item in list: url =item.find('span').find('a').get('href') urls.append(url) return urls

 

在這裏 212 頁太多了

 

小帥b來獲取一頁的數據

 

運行一下獲得第一頁每一個妹紙的 URL 

 

https://www.mzitu.com/171304https://www.mzitu.com/175090https://www.mzitu.com/171608https://www.mzitu.com/171795https://www.mzitu.com/171041https://www.mzitu.com/175154https://www.mzitu.com/170736https://www.mzitu.com/174947https://www.mzitu.com/174762https://www.mzitu.com/170806https://www.mzitu.com/174433https://www.mzitu.com/174860https://www.mzitu.com/173541https://www.mzitu.com/173063https://www.mzitu.com/173109https://www.mzitu.com/173760https://www.mzitu.com/170563https://www.mzitu.com/170263https://www.mzitu.com/166044https://www.mzitu.com/173721https://www.mzitu.com/168454https://www.mzitu.com/171747https://www.mzitu.com/173845https://www.mzitu.com/173635

 

 

下一步

 

拿到每一頁的每一個妹紙的地址以後

 

固然是要從每一個地址進去

 

獲取每一個妹紙的全部組圖

 

 

遍歷一下剛剛獲取到的 list

 

 for url in list_page_urls: download(url)

 

那麼進入一個妹紙的詳情頁面的時候

 

咱們須要獲取

 

組圖的全部圖片數量

 

組圖的名稱(真特麼sao)

 

圖片的地址

 

 

知道了這些信息以後

 

咱們就能夠很簡單獲取了

 

def download(url): html = request_page(url) soup = BeautifulSoup(html, 'lxml') total = soup.find(class_='pagenavi').find_all('a')[-2].find('span').string title = soup.find('h2').string image_list = [] for i in range(int(total)): html = request_page(url + '/%s' % (i + 1)) soup = BeautifulSoup(html, 'lxml') img_url = soup.find('img').get('src') image_list.append(img_url) download_Pic(title, image_list)

 

在這裏咱們獲取了 total 總頁數

 

獲取到了組圖題目 title

 

根據總頁數進行遍歷

 

一個頁面能夠獲取到組圖中的一張圖片

 

而後咱們把這些圖片都放到組圖集合中

 

接着就能夠開始下載了

 

咱們能夠根據這個組圖的名字來建立文件夾

 

而後將下載的圖片放進去

 


def download_Pic(title, image_list): # 新建文件夾 os.mkdir(title) j = 1 # 下載圖片 for item in image_list: filename = '%s/%s.jpg' % (title,str(j)) print('downloading....%s : NO.%s' % (title,str(j))) with open(filename, 'wb') as f: img = requests.get(item,headers=header(item)).content f.write(img) j+=1

 

 

ok

 

咱們運行一下吧

 

 

能夠看到

 

每張圖片都被咱們爬下來了

 

名字太他媽引入犯罪

 

 

小帥b不得不打馬賽克

 

反正大家閱片無數

 

心中天然無碼

 

打開文件夾能夠看到

 

每個美女都根據組圖生成文件夾

 

每一個文件夾就是組圖裏面的圖片

 

 

我這馬賽克打得是否是很棒?

 

 

但其實

 

發現咱們在爬的時候

 

有點慢了

 

還記不記得上次摸魚提到的多線程?

 

python爬蟲14 | 就這麼說吧,若是你不懂多線程和線程池,那就去河邊摸魚!

 

 

咱們來開啓多線程試試

 

根據咱們一開始獲取到每一個頁面的多個妹紙的 URL 來使用線程池

 

def download_all_images(list_page_urls): # 獲取每個詳情妹紙 works = len(list_page_urls) with concurrent.futures.ThreadPoolExecutor(works) as exector:        for url in list_page_urls: exector.submit(download,url)

 

此次咱們再爬取試試看

 

 

能夠看到此次就不是一組一組的爬了

 

而是多個線程同時爬取多個組圖

 

OMG

 

個人文件夾

 

 

 

 

 

不行了

 

我趕忙刪掉

 

完整代碼

 

公衆號發送「mm」獲取吧

 

警告

本文僅做爲學習例子

你別亂來啊

 

我們下回見

 

peace

 

 

 

      點個好看啊~~(破音)

相關文章
相關標籤/搜索