我们一直非常希望可以抓取百度图片上的图片, 自打我们接触了 python的urllib 库之后, 我们就非常想爬些图片下来, 尤其是从百度图片上面, 在很久之前, 百度图片上的图片是不加密的, 分析他的静态网页源码可以直接提取得到图片的源地址信息 放在 obj_url 中, 当时, 我们还利用这点, 爬取过一些图片下来, 可以参考 http://blog.csdn.net/lerdor/article/details/12047447
然而, 好景不长, 百度把 这个信息给加密了, 于是这个爬取方法自然就失效了。。。。。
staleElementReferenceException
这个问题, 其实我们没有解决, 直觉上这个和延时有关, 于是, 我们在代码中加了两段延时 sleep(20), 和 thread._sleep(1), 同时将可能出现异常的代码用 try 包裹起来, 避免程序直接崩溃
图片下载重复问题
上面提到了, 可以使用类似 hash 表的思想进行处理
mkdir 不能创建多级目录, 可以使用 makedirs : http://www.2cto.com/kf/201207/144150.html
# -*- coding:utf8 -*-
import scrapy
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import threading
import time
import os
class BaiduSpider():
'''
爬取百度图片中的图片
'''
def __init__(self, search_keys):
self.search_keys = search_keys
self.url = 'http://image.baidu.com'
self.page_total = 6
# self.url = "http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=saber"
# set profile
fp = webdriver.FirefoxProfile()
fp.set_preference('browser.download.folderList', 2)
fp.set_preference('browser.download.manager.showWhenStarting', False)
downDir = 'C:\\Users\\ThinkPad User\\Desktop\\BaiduImage\\' + self.search_keys
fp.set_preference('browser.download.dir', downDir)
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', 'image/jpeg')
# fp.set_preference('browser.helperApps.neverAsk.saveToDisk', ['image/jpeg', 'image/png', 'image/gif'])
self.fp = fp
if not os.path.exists(downDir):
os.makedirs(downDir)
def Search(self):
# 打开浏览器 , 并在百度图片搜索中输入关键字
driver = webdriver.Firefox(firefox_profile=self.fp)
driver.maximize_window()
driver.get(self.url)
# print driver.title
inputElement = driver.find_element_by_name('word')
inputElement.send_keys(self.search_keys)
inputElement.submit()
time.sleep(20)
return driver
def download(self):
driver = self.Search()
#获取 n pagedown 个页面的内容
# for i in range(5):
# action = ActionChains(self.driver).send_keys(Keys.PAGE_DOWN)
# action.perform()
page_total = self.page_total
page_i = 0
total_elements = 0
remained_pics = [] # 标记已经处理过的图片元素
while page_i < page_total:
elements_all = driver.find_elements_by_xpath('//ul/li/div/a/img') # 一定是单引号
elements = elements_all
# print elements
i = 0
while i < (len(elements)):
print i
try:
element = elements[i]
# 去除重复图片
if element in remained_pics:
i += 1
continue
print "pic element : ", element
# 激活 hover
action = ActionChains(driver).move_to_element(element)
action.perform()
# 查找 a.down
hover = driver.find_element_by_class_name("down")
print "hover element: ", hover
action = ActionChains(driver).move_to_element(hover)
action.click() # 点击下载
action.perform()
i = i + 1
except:
threading._sleep(1)
page_i += 1
remained_pics.extend(elements)
action = ActionChains(driver).send_keys(Keys.DOWN)
action.perform()
if __name__ == "__main__":
# spider = BaiduSpider("saber")
spider = BaiduSpider("yurisa")
spider.download()