title: stocksnap 一個(gè)不錯(cuò)的圖片網(wǎng)站的圖片抓取--selenium 右鍵保存和直接寫(xiě)入2個(gè)模式【python】
date: 2016-09-18 10:59:28
tags:
參考:原文1#
參考:原文2#
1、原文1采用了scrapy方法氛濒,本文改編用selenium方法,并參考原文2首次采用模擬右鍵來(lái)保存圖片浦译。
2上炎、網(wǎng)站分析:
首先發(fā)現(xiàn)鼠標(biāo)拖動(dòng)到圖片底部區(qū)域拴竹,主頁(yè)又不斷加載新的圖片扫俺,可判斷是異步的路鹰。另單獨(dú)查看2個(gè)圖的xpath惨篱,發(fā)現(xiàn)總體格式一致盏筐,編號(hào)部分有差異:
/html/body/div[4]/div[3]/div[2]/div/div[1]/a/img
/html/body/div[4]/div[3]/div[2]/div/div[11]/a/img
這樣我們就得到了在firefox下統(tǒng)一的xpath為,注意是刪除div[i]部分砸讳,留下2個(gè)斜杠:
/html/body/div[4]/div[3]/div[2]/div//a/img
此時(shí)琢融,可能覺(jué)得為啥要?jiǎng)h除,而不是用正則式.*代替簿寂?測(cè)試那樣的結(jié)果是Nan漾抬,也就是說(shuō)xpath的格式和re格式不能混搭。
而每個(gè)jpg地址在src屬性中常遂,所以如果想查閱批量的圖片地址纳令,則:
/html/body/div[4]/div[3]/div[2]/div//a/img/@src
3、既然這么爽的得到了圖片地址克胳,剩下就是批量下載保存了:
這一次平绩,先測(cè)試了用firefox模擬人工右鍵保存的方法,代碼如下漠另,保存那塊還沒(méi)整明白捏雌,也就是自動(dòng)到出現(xiàn)圖片保存的界面,根本原因是selenium無(wú)法操作操作系統(tǒng)級(jí)的對(duì)話框:
索性快速人工點(diǎn)保存,30個(gè)圖的保存位置都是重復(fù)的笆搓,依次得到30個(gè)圖:
4性湿、隨機(jī)打開(kāi)一個(gè)圖,如下满败,可見(jiàn)測(cè)試ok:
5肤频、代碼:
# -*- coding: utf-8 -*-
# python 3.5.2
# Author:vansnowpea
# stocksnap 一個(gè)不錯(cuò)的圖片網(wǎng)站的圖片,右鍵保存抓取
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
print('Please wait...Firefox loading...')
print('---------------------------------')
url = "https://stocksnap.io/"
# 用瀏覽器實(shí)現(xiàn)訪問(wèn)
driver = webdriver.Firefox()
driver.maximize_window()
driver.get(url)
# 得到總的jpgs的路徑集合
xpath = "/html/body/div[4]/div[3]/div[2]/div//a/img"
# set profile
fp = webdriver.FirefoxProfile()
fp.set_preference('browser.download.folderList', 2)
fp.set_preference('browser.download.manager.showWhenStarting', False)
fp.set_preference('browser.download.dir', './yourfolder/')
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', 'image/jpeg')
# 保存圖片,人工批量點(diǎn)保存算墨,selenium無(wú)法操作操作系統(tǒng)級(jí)的對(duì)話框
for element in driver.find_elements_by_xpath(xpath):
img_url = element.get_attribute('src')
img_desc = element.get_attribute('data-desc')
action = ActionChains(driver).move_to_element(element)
action.context_click(element)
action.send_keys(Keys.ARROW_DOWN)
action.send_keys('v')
action.perform()
print('Well done! all pictures downloaded.')
print('---------------------------------')
# driver.close()
6着裹、如果圖片數(shù)量少,人工保存下也無(wú)妨米同,但數(shù)量大肯定不行骇扇,所以還是用常規(guī)的自動(dòng)寫(xiě)入數(shù)據(jù)保存的方式。另外此網(wǎng)站是通過(guò)ajax異步加載面粮,當(dāng)鼠標(biāo)放到首頁(yè)30個(gè)圖的下方少孝,也就是瀏覽器底部區(qū)域,他又會(huì)自動(dòng)加載新的圖片出來(lái)熬苍。而通過(guò)新的第一層代碼的模擬鼠標(biāo)下移稍走,可以得到更多的圖片袁翁。千萬(wàn)要注意的是,在python 3中婿脸,對(duì)數(shù)dict的關(guān)鍵詞查找是in粱胜,比如:if n in previous:而在python 2 中是has_key,比如:if previous.has_key(n):對(duì)應(yīng)代碼為:
# python 3.5.2
from selenium import webdriver
import time
import urllib
# 爬取頁(yè)面地址
url = "https://stocksnap.io/"
# 目標(biāo)元素的xpath
xpath = "/html/body/div[4]/div[3]/div[2]/div//a/img"
# 啟動(dòng)Firefox瀏覽器
driver = webdriver.Firefox()
# 最大化窗口,因?yàn)槊恳淮闻廊≈荒芸吹揭暣皟?nèi)的圖片
driver.maximize_window()
# 記錄下載過(guò)的圖片地址狐树,避免重復(fù)下載
img_url_dic = {}
# 瀏覽器打開(kāi)爬取頁(yè)面
driver.get(url)
# 模擬滾動(dòng)窗口以瀏覽下載更多圖片
pos = 0
m = 0 # 圖片編號(hào)
for i in range(10):
pos += i*500 # 每次下滾500
js = "document.documentElement.scrollTop=%d" % pos
driver.execute_script(js)
time.sleep(1)
for element in driver.find_elements_by_xpath(xpath):
img_url = element.get_attribute('src')
# 保存圖片到指定路徑
if img_url != None and not img_url in img_url_dic:
img_url_dic[img_url] = ''
m += 1
ext = img_url.split('.')[-1]
filename = str(m) + '.' + ext
#保存圖片數(shù)據(jù)
data = urllib.request.urlopen(img_url).read()
f = open('./van/' + filename, 'wb')
f.write(data)
f.close()
driver.close()
7焙压、結(jié)果展示:相對(duì)第一個(gè)方法,獲取了更多的圖片: