有時候html
只是在人羣中多看了一眼python
就再也沒辦法忘掉那些容顏多線程
小帥b在普通的一天app
上着普通的網python爬蟲
不當心打開了一個不太普通的網站post
https://www.mzitu.com/學習
今後進入了不普通的一天網站
看着不普通的妹紙url
動起了不普通的心思spa
恩
這麼多妹紙
不爬取下來
惋惜了
那麼
接下來就是
首先咱們來分析一下
打開這個妹紙的網站首頁
能夠看到一共有 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
點個好看啊~~(破音)