介绍Selenium
它是一个自动化的测试工具,模拟人在操作网页,而且确实是启动了浏览器内核在工作,就像人在点击网页和想网页发送内容一样,非常真实。
Selenium提供了很多语言的接口,因为我对Python比较熟悉,而且Python使用起来也很方便,所以就选择这个组合,这里是Selenium的Python接口的介绍。官网里面有个例子,很简洁,却概括了selenium主要的功能。
官网主要内容
1.如何启动一个浏览器内核,这里面可以选择Firefox或者Chrome。因为我使用Firefox时候设置了不要每次下载都询问,但还是每次下载都询问,这样就没能批量下载图片了。因为selenium只能操作浏览器,不能进行操作系统级别的操作,来点击下载按钮。
2.如何打开一个网页。
3.如何定位网页上面的元素,这里涉及到一些网页设计的知识,有需要的,大概看看就行。
4.定位到元素以后,如何与网页进行交互,如向搜索栏填入内容,点击下载按钮等等。
5.当打开多个标签页,如何确定自己当前正在操作哪个标签页,以及如何进行标签页之间的切换。
安装过程
1.首先是安装python3.X
2.安装python3-pip
sudo apt-get install python3-pip
3.使用pip安装selenium
sudo pip3 install selenium
4.安装Chrome
解压 unzip chromedriver_linux64.zip
转移 sudo mv chromedriver /usr/local/
现在就可以愉快的使用Selenium批量下载图片了。
贴一段抓取百度麦当劳图片的代码
#!/usr/bin/env python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import *
from random import *
url = "http://image.baidu.com/"
content = u"麦当劳"
driver = webdriver.Chrome(executable_path="/usr/local/chromedriver")
sleep(3)#等待浏览器启动
driver.get(url)
elem = driver.find_element_by_id('kw') #定位输入栏
elem.send_keys(content) #输入要搜索的内容
elem = driver.find_element_by_class_name("s_btn") #定位搜索按钮
elem.click() #点击搜索按钮,跳转到搜索结果页面
sleep(5)#等待页面加载
xpath = '//*[@id="imgid"]/div[1]/ul/li[5]' #定位一个非推广页面
elem = driver.find_element_by_xpath(xpath)
elem.click()
driver.save_screenshot("1.png")
#跳转到显示单张图片的页面
for i in driver.window_handles:
if i != driver.current_window_handle:
driver.switch_to_window(i)
break;
while(1):
try:
xpath = '//*[@id="toolbar"]/span[7]' #定位下载按钮
elem = driver.find_element_by_xpath(xpath)
elem.click() #点击下载按钮
sleep(randint(2,5))
elem = driver.find_element_by_class_name("img-next") #定位下一张按钮
elem.click()#点击下一张按钮
sleep(randint(2,5))
except Exception as e:
sleep(randint(2,5))
xpath = '//*[@id="picList1"]/li[5]' #定位一个非推广页面
elem = driver.find_element_by_xpath(xpath)
elem.click()
driver.close()
一些经验教训
1.在这个过程中最主要的问题就是定位元素,能够定位到元素就好办了。如果对网页设计不太熟悉,可以直接点到相应的元素,使用(Chrome)浏览器的检查功能,然后Copy->Copy XPath就可以定位元素了。
2.在定位元素的时候,最容易出现的错误就是当前操作的页面是A,你却在定位页面B上面的元素,换句话说,就是不知道当前正在操作哪个网页。可以通过save_screen_shot(filename)函数来对当前正在操作的网页截图,判断正在操作的到底是哪个网页。