用python寫個校內(nèi)網(wǎng)照片下載器?

人人網(wǎng)照片下載器
chromedriver版本對應表
chromedriver下載

前段時間,朋友圈里不知道為什么忽然刮起了一股曬18歲照片的風,不能免俗的我,自然也翻箱倒柜到處找起來以前的照片,由于我存有照片的移動硬盤已經(jīng)損壞,于是就想起了當年非常火的一個社交類網(wǎng)站--人人網(wǎng)(校內(nèi)網(wǎng))。

說來也巧,那天我登陸人人網(wǎng)找照片時,網(wǎng)站也是奇慢無比,打開一張照片要花差不多兩分鐘,在好不容易找到一張滿意的照片并發(fā)完朋友圈裝逼后,不由得忽然擔心起來如果某天網(wǎng)站不在了,豈不是我所有的照片就沒了,于是就打算用爬蟲把照片全存到電腦上。

分析了下人人網(wǎng)的網(wǎng)站,在輸入用戶名和密碼后,利用requests庫的get方法,手動添加cookies和header后,就可以很容易的獲取所有照片的url。相冊信息就在Request URL源代碼里的Album List里。

人人網(wǎng)cookies

其實如果就滿足于保存照片的話,到這里已經(jīng)沒啥好寫了,具體的抓取方法都差不多,不論是利用scrapy框架還是簡單的用requests庫,都可以參照以前的代碼來寫。但是,我又想把這個下載照片的代碼分享給好友使用,可總不能讓好友先看完《Python教程-廖雪峰》之后再來用吧,這可相當?shù)牟挥押谩?strong>如何盡量用簡單的語言教會用戶使用我寫的爬蟲代碼,就是我面臨的主要問題了。

最簡單的方法就是將代碼打包成一個exe文件,這樣就只需要簡單的雙擊就可以執(zhí)行了;但是關于網(wǎng)站登陸,目前還不太會處理,以往爬去需要登陸的網(wǎng)站都是先在網(wǎng)站上登陸后,再手動復制cookies到代碼中來實現(xiàn)的,這如果讓另一個沒有基礎的人來弄的話,可能就要麻煩很多了。

百度了一番之后,所幸在一篇知乎專欄里發(fā)現(xiàn)了一種比較偷懶的解決登陸的方法《Python模擬登陸萬能法-微博|知乎》,簡單來說就是通過python的selenium庫來操作瀏覽器模擬手動登陸網(wǎng)站的全過程,然后通過get_cookies()方法獲取登陸后的cookies,然后再將cookies傳遞給requests庫,從而實現(xiàn)后續(xù)的爬取。

selenium示意圖

selenium簡介

  • selenium是一個Web應用的自動化測試工具,它可以模擬真實用戶對瀏覽器的操作,支持多種語言,包括C、JAVA、Perl、Ruby、PHP以及Python等。
  • selenium支持驅(qū)動多種瀏覽器,包括ie、chrome、火狐、safari、opera等。
  • Python中selenium通過find_element()的方法,對瀏覽器頁面中的元素進行定位,其定位可以借助xpath、id、name、class、css selector等等方式實現(xiàn),然后可以對定位的元素進行文本抓取以及模擬鼠標或鍵盤操作。selenium還可以通過其它方式,例如wait來保證對元素的操作可以正確進行。

Python目前可以通過pyinstaller庫來實現(xiàn)代碼打包成exe的功能,pyinstaller庫使用起來比較簡單,具體方法如下,除此以外我也未再多做研究。

1.在cmd命令行中輸入pip install pyinstaller來安裝pyinstaller庫。
2.在python目錄的Scripts文件夾中找到安裝好的pyinstaller,用鼠標將其拖入cmd中,然后輸入-F,再將python代碼文件用鼠標拖到后面,Enter確認即可。
3.若想更改圖標,在第二步中再額外輸入-i,并將圖標文件.ico拖到后面。

  • cmd命令行的輸入格式為:
    xxx\xxx\xxx\pyinstaller -F xxx\xxx\代碼文件.py -i xxx\xxx\xxx\圖標.ico

下面具體開始碼代碼。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

#selenium操作瀏覽器需要下載相應的驅(qū)動。
#我用的是chrome瀏覽器,因此需要下載相應版本的chromedriver.exe。
chromepath = r"C:\chromedriver.exe"

#現(xiàn)在人人網(wǎng)的首頁有太多的圖片了,為了加快載入速度添加一個瀏覽器設置,設置為不加載圖片。
chrome_opt = webdriver.ChromeOptions()
prefs={"profile.managed_default_content_settings.images":2}
chrome_opt.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(chromepath,chrome_options=chrome_opt)
wait = WebDriverWait(browser,3)

#打開人人網(wǎng)主頁
browser.get('http://www.renren.com/')
#定位到用戶名輸入框,通過send_keys的方式,輸入用戶名
login = wait.until(
    EC.presence_of_element_located((By.XPATH,"http://input[@name='email']"))
)
login.send_keys(login_account)
#定位到密碼輸入框,通過send_keys的方式,輸入密碼
pwd = wait.until(
    EC.presence_of_element_located((By.XPATH,"http://input[@id='password']"))
)
pwd.send_keys(password)
#勾選保存密碼按鈕
browser.find_element_by_xpath("http://form[@id='loginForm']/dl[@class='savepassword clearfix']/dt/label[@class='labelCheckbox']/input[@id='autoLogin']").click()
#點擊確認并登陸
browser.find_element_by_xpath("http://form[@id='loginForm']/dl[@class='bottom']/input[@id='login']").click()
#不可缺少!
cookie_dic = {}
while 'ln_uact' not in cookie_dic.keys():
    cookies = browser.get_cookies()
    print('登陸Cookies獲取中...')
    # 將selenium獲取的cookies格式轉(zhuǎn)換為requests所識別的格式
    for i in cookies:
        cookie_dic[i['name']] = i['value']
print('登陸Cookies獲取完畢,準備開始抓取相片...')

登陸人人網(wǎng)并獲取cookies的代碼就已經(jīng)完成了,各個部分的功能已在代碼里注釋了,其中值得說明的一點是最后關于cookies的部分。我用了while循環(huán)來判斷cookies是否正確獲取,之所以這么做是因為從點擊登陸按鈕到頁面完全加載是需要一定的時間,若在頁面未完全加載的情況下獲取cookies,會發(fā)現(xiàn)cookies中少了一些參數(shù),其中就包括了lu_act,此時獲取的cookies則不能用于登陸。

  • 這里也可以簡單的通過time.sleep()來設置一個等待時間,等待頁面加載完畢后來獲取cookies,但是這樣代碼就不夠健壯,可能受到網(wǎng)絡帶寬因素的影響。
  • 另外也可以通過selenium自帶的顯示等待WebDriverWait來實現(xiàn),通過監(jiān)視頁面上某個元素的狀態(tài)來判斷頁面是否完全加載。我沒有采取這種方法是因為嘗試著用了幾個元素作為判斷依據(jù)都失敗了。。

剩下的代碼則是簡單的用requests庫進行爬取,方法還是對網(wǎng)頁元素以及url進行分析,各個部分在爬蟲源代碼中都已經(jīng)有了詳細注釋,就不再展開細說。需要說明的是,獲取相片信息和下載相片要用到兩個headers,因為二者的host信息不同。

#兩個headers,第一個headers帶有host值,用于獲取相片信息。
#第二個headers不能帶有前面的host值,用于下載相片。
headers = {'Host':'photo.renren.com',
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
headers1 = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}

在完成所有的爬蟲代碼后,打開cmd運行pyinstaller將代碼打包為exe,大功告成。

最后來張運行的效果圖。

以相冊名稱建立文件夾,分別儲存相冊里的照片,因為網(wǎng)絡原因下載失敗的照片,會提示下載失敗并將url記錄在文件夾的txt文檔內(nèi)。

屏幕截圖(4).png

最后是源碼Python爬蟲代碼--人人網(wǎng)照片下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內(nèi)容

  • 基于 SELENIUM 的自動化測試架構(gòu) 非常感謝各位查閱本篇文章,筆者在此感謝各位。 目前市面上有分門別類的自動...
    厲鉚兄閱讀 6,091評論 6 43
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,526評論 6 427
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,668評論 25 708
  • 洞見SELENIUM自動化測試 寫在最前面:目前自動化測試并不屬于新鮮的事物,或者說自動化測試的各種方法論已經(jīng)層出...
    厲鉚兄閱讀 6,750評論 3 47
  • 一場演出,滿堂歡樂。 辭舊迎新,春光燦爛。 由甘肅省民政廳主辦,蘭州市民政局承辦,蘭州廣播電視臺綜藝體育頻道、西部...
    宗林的李閱讀 663評論 0 0