如何爬取知乎漂亮妹紙照片第二彈

2020-01-11     機器學習與數據分析

前言

在之前的一篇文章中,我們第一次嘗試了用Python爬蟲爬取知乎上面漂亮妹子的照片。但是,由於我們採用的是selenium來爬蟲,爬取的數量極其有限。所以,這次換requests來爬蟲,終於將爬取量從一百以內突破到一千多張。

為什麼有第二彈

在第一彈中我們用了selenium來爬蟲,爬取量非常少。我們改用requests來爬蟲,成功爬取一千多張圖片。就讓我們簡單比較一下二者的區別:

selenium是什麼?

selenium自動化瀏覽器。就是這樣!你如何運用這種力量完全取決於你自己。它主要用於自動化web應用程式以進行測試,但當然不限於此。無聊的基於web的管理任務也可以(也應該)自動化。

一些大型瀏覽器廠商已經(或正在)採取措施使Selenium成為其瀏覽器的本地部分,這些廠商支持Selenium。它也是無數其他瀏覽器自動化工具、api和框架的核心技術。

可以說selenium的本職工作並不是用來爬蟲的,而是用於自動化Web應用程式的測試目的。所以用selenium來爬知乎上面的圖其實是一種比較劍走偏鋒的做法,這也解釋為了為什麼爬取量不是很樂觀。

什麼是Requests

來看看 Requests的文檔:Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。警告:非專業使用其他 HTTP 庫會導致危險的副作用,包括:安全缺陷症、冗餘代碼症、重新發明輪子症、啃文檔症、抑鬱、頭疼、甚至死亡。

從這個幽默的介紹中,不難看出來Requests作者對於Requests非常有自信,我們用Requests爬知乎圖片也剛好驗證了這一點。

爬起來!

我們按照慣例簡要說明一下爬蟲步驟:

01.找到相關的問題,獲取問題id

如上圖所示,我們需要的id就在紅色框線裡面。

02.用requests解析網頁


get_url = 'https://www.zhihu.com/api/v4/questions/'+id+'/answers?include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics&limit=5&offset='+str(offset)+'&sort_by=default'        header = {            'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0",            'Host': "www.zhihu.com",        }        r = requests.get(get_url, verify=False, headers=header)                content = r.content.decode("utf-8")                txt = json.loads(content)

我們把網頁信息解析到了txt中。

03.匹配獲得圖片地址

核心代碼:

imgUrls = re.findall(r'data-original="([^"]+)"', str(txt))imgUrls=list(set(imgUrls))for imgUrl in imgUrls:try:                splitPath = imgUrl.split('.')                fTail = splitPath.pop()                print(fTail)                if len(fTail) > 3 :                    fTail = 'jpg'                fileName = path +"/" + str(number) + "."+fTail                                img_data = urllib.request.urlopen(imgUrl).read()

在獲取txt後,我們需要用正則表達式匹配圖片的地址,然後根據這個地址下載圖片到本地。

好了,原理就講到這裡,需要完整代碼的同學請在網絡搜索我這篇文章。

福利時間

我們選取一些爬到的漂亮妹子照片:


文章來源: https://twgreatdaily.com/7KqMlW8BxtCz63RLeMPG.html