我们要对Web进行模拟自动化测试的时候,可以使用Selenium或者是Puppeteer工具。其中Puppeteer通过控制无头Chrome来完成浏览器的工作。这两个工具之间的区别在于:Selenium更加关注程序的执行流程本身,比如找到指定的元素,设置相应的值,然后点击操作。而Puppeteer是浏览器的视角,比如光标移动到某个元素上,键盘输入某个内容等。
使用selenium库模拟浏览器,这里我使用的是Chrome浏览器,需要事先安装好selenium模块,然后下载ChromeDriver,它的作用是启动Chrome浏览器来进行模拟,ChromeDriver的下载地址是:
https://sites.google.com/a/chromium.org/chromedriver/downloads
根据自己的浏览器版本下载对应的版本的驱动,不对的驱动的话会启动不了Chrome,将下载好的驱动放到指定的文件夹里面,后面会用到。
通过selenium启动Chrome的代码为:
# 配置selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(request_url)
注: 环境Ubuntu18.04LTS
实例 :抓取豆瓣的刘亦菲的海报图片的爬虫程序,调用之前定义好的下载图片的函数,完整代码如下(不需要登录的情况下就可抓取):
# coding:utf-8
# 下载刘亦菲的电影封面海报
import requests
import json
from lxml import etree
# 配置selenium
from selenium import webdriver
# options = webdriver.ChromeOptions()
# options.add_argument("--incognito") # 隐身模式打开
# driver_path = "/home/toohoo/Desktop/chromedriver_linux64/chromedriver" # chromedriver的路径
driver = webdriver.Chrome("/home/toohoo/Desktop/chromedriver_linux64/chromedriver")
query = "刘亦菲"
'''下载图片'''
def download(src,id):
# 将图片写到当前目录,原来的图片的格式是webp的,需要转换一下格式
dir = './' + str(id) + '.jpg'
try:
pic = requests.get(src, timeout=10)
fp = open(dir,'wb')
fp.write(pic.content)
fp.close()
except requests.exceptions.ConnectionError:
print('图片无法下载!')
'''for 循环 请求全部的url'''
request_url = 'https://www.douban.com/search?cat=1002&q=' + query
driver.get(request_url)
# 注意是这样写的!
html = etree.HTML(driver.page_source)
srcs = html.xpath("//div/a[@class='nbg']/img/@src ")
titles = html.xpath("//div[@class='title']/h3/a/text()")
for src,title in zip(srcs, titles):
# 调用的时候记得转换编码!!
download(src, title.encode("utf-8"))
这里说一下遇到的问题:
./chromedriver
直接就可以运行了,在win下也是可以运行的.exe文件。然后在另一个窗口接着运行python wzxPostSpider.py
就行。utf-8
的形式:for src,title in zip(srcs, titles):
# 调用的时候记得转换编码!!
download(src, title.encode("utf-8"))
我们可以使用Selenium工具自动化模拟浏览器,重点是实现对元素的定位。可以使用Selenium WebDriver来岁页面HTML进行获取和解析,然后通过HTML中的XPath进行提取,读取响应的内容。
那么如何使用Webdriver自带的元素定位功能,模拟浏览器的行为呢。首先需要知道其的基本的定位和操作知识:
如果想要定位一个元素,可以通过id,name,class,tag 链接上的全部文本,连接上的部分文本、XPath或者CSS进行定位,在Selenium的WebDriver中为我们提供的一些方法如下(8种):
1、通过id定位:可以使用find_element_by_id()函数。比如想要定位id=loginName的元素,就可以使用browser.find_element_by_id(“loginName”).
2、通过name定位:可以使用find_element_by_name()函数,比如我们想要对name=key_word的元素进行定位,就可以使用browser.find_elemrnt_by_name(“key_word”)。
3、通过class定位:可以使用find_element_by_class_name()函数。
4、通过tag定位:使用find_element_by_tag_name()函。
5、通过link上的完整文本定位:使用find_element_by_link_text()函数。
6、通过link上的部分文本定位:使用find_element_by_partial_link_text()函数。有时候超链接的文本很长,就可以通过查找部分的文本内容进行定位。
7、通过XPath进行定位:使用find_element_by_xpath()函数。使用XPath定位的通用性比较好,因为id,name,class为多个的时候,或者元素没有这些属性值的时候,Xpath就可以帮助我们完成任务。
8、通过CSS定位:使用find_element_by_css_selector()函数。CSS定位也是常用的定位方法,相比于XPath来说简洁。
在获取到某个元素之后,就可以对这个元素记性操作了。对元素的操作如下:
1、清空输入框的内容:使用clear()函数;
2、在输入框中输入内容:使用send_keys(content)函数传入要输入的文本;
3、点击按钮:使用click()函数,如果元素是个按钮或者链接的时候,可以点击操作;
4、提交表单:使用submit()函数,元素对象为一个表单的时候,可以提交表单;
模拟登录豆瓣写影评,未完~