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

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

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

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

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

人人網(wǎng)cookies

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

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

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

selenium示意圖

selenium簡介

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

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

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

  • cmd命令行的輸入格式為:
    xxx\xxx\xxx\pyinstaller -F xxx\xxx\代碼文件.py -i xxx\xxx\xxx\圖標(biāo).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操作瀏覽器需要下載相應(yīng)的驅(qū)動。
#我用的是chrome瀏覽器,因此需要下載相應(yīng)版本的chromedriver.exe。
chromepath = r"C:\chromedriver.exe"

#現(xiàn)在人人網(wǎng)的首頁有太多的圖片了,為了加快載入速度添加一個瀏覽器設(shè)置,設(shè)置為不加載圖片。
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()
#點擊確認(rèn)并登陸
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獲取完畢,準(zhǔn)備開始抓取相片...')

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

  • 這里也可以簡單的通過time.sleep()來設(shè)置一個等待時間,等待頁面加載完畢后來獲取cookies,但是這樣代碼就不夠健壯,可能受到網(wǎng)絡(luò)帶寬因素的影響。
  • 另外也可以通過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)絡(luò)原因下載失敗的照片,會提示下載失敗并將url記錄在文件夾的txt文檔內(nèi)。

屏幕截圖(4).png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容