制作缘由:
简单点说就是图书馆老师有一个项目,需要给一个公司讲什么东西,需要检索系统,但是数据来源却要自己从网上爬,因为账号很贵,不值当的再另购置一个账号,找到了一位学长来做,学长忙着考研(●'◡'●)所以就顺下来了,哈哈!开始我以为很简单的爬取点东西罢了,然后正真着手做的时候呵呵了~原因下篇博客中有讲 => 在此奉上链接~无奈之下想到了用Python自动化爬虫-->就是相当于挂一样,自己帮你操控浏览器来抓取数据~效率可想而知爬取较多的话,会有点慢(后话~~哭了┭┮﹏┭┮~)
所需Python的知识:
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,但已经不再支持 PhantomJS了,一般使用chrome和firefox无界面浏览器。Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。具体了解请点这!!!
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
安装:
pip install selenium
安装驱动程序
下面介绍几种主流浏览器的驱动程序下载地址:
我用的时windows系统,chrome浏览器,所以下载了chromedriver_win32,解压出来会有一个.exe可执行程序,将它的路径添加到系统的环境变量就OK了(其实也不需要,下边会说)
选择页面元素:
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
在命令中使用elements可以选取多个元素。
# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配 推荐使用
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
简单使用:
from selenium import webdriver
from lxml import etree
from selenium.common.exceptions import TimeoutException
# 设置chromedriver的路径
driver_path = r"你的chromedriver.exe位置"
# 启用chromedriver(声明浏览器对象)
driver = webdriver.Chrome(executable_path=driver_path)
#简单的先进入百度首页
driver.get('https://www.baidu.com/')
#设置打开浏览器的宽高
driver.set_window_size(1500, 1000)
# 页面缓冲时间(隐式等待)怕网不好的时候加载慢,导致后续抓取网页代码不全-->属于笨方法,不智能
driver.implicitly_wait(3)
# 页面缓冲时间(显示等待-->智能),先try以下,不行就等等再try
try:
element = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, 'kwssss'))
)
print(element)
except TimeoutException as ex:
print(ex)
#抓取网页源码
html = etree.HTML(driver.page_source)
# 百度测试 抓取输入框,send_keys是在input里输入内容然后等待三秒钟再清空
# inputTag = driver.find_element_by_id('kw')
# inputTag = driver.find_element_by_name('wd')
# inputTag = driver.find_element_by_class_name('s_ipt')
inputTag = driver.find_element(By.ID, 'kw')
inputTag.send_keys('python')
time.sleep(3)
inputTag.clear()
#也可以不清空,抓取搜索按钮,点击搜索实践
# submitBtn = driver.find_element(By.ID, 'su')
# submitBtn =driver.find_element_by_xpath("//*[@id='su']")
# submitBtn.click()
鼠标动作链:
# selenium行为链测试
inputTag = driver.find_element_by_id('kw') #根据ID抓取元素
submitBtn = driver.find_element(By.ID, 'su')
actions = ActionChains(driver) #调用行为连
actions.move_to_element(inputTag) #将鼠标移动过去
actions.send_keys_to_element(inputTag, 'Python') #向里面填数据
actions.move_to_element(submitBtn) #鼠标移动到搜索按钮上
actions.click(submitBtn) #点击
actions.perform() #行为链启动,否则上边不执行
获取文本值:
#根据Xpath语法
html.xpath("Xpath路径/text()")
注意事项:
1、如果只是想要解析网页中的数据,那么推荐将网页源代码扔给lxml来解析,因为lxml底层使用的是C语言,所以解析效率会更高。
2、如果是想要对元素进行一些操作,比如给一个文本 框输入值,或者是点击某个按钮,那么必须使用selenium给我们提供的查找元素的方法。
常见的表单元素:input type = 'text/password/email/number'button、input[type = 'submit']chexbox:input = 'chexbox'select;下拉列表'''
未完待续......
还不快抢沙发