爬虫笔记<关于鼠标点击和内容输入>
2019-01-07 16:31 陈子宁 阅读(1080) 评论(0) 编辑 收藏 举报1. 采用google浏览器(试验时有头浏览器方便检测,代码完成后改为无头浏览)
注意: 需要提前安装google的chrome.exe到python默认执行目录。否则python.exe不知道从哪里调用chrome,会报错。
from selenium import webdriver ## 1. 默认有头浏览器 driver = webdriver.Chrome() driver.get("http://sns.sseinfo.com") # 2. 配置无头浏览器 chrome_options = webdriver.chrome.options.Options(); chrome_options.add_argument('--headless') driver = webdriver.Chrome(chrome_options=chrome_options) driver.get("http://sns.sseinfo.com")
2. 模拟鼠标点击
webserver 提供了鼠标操作的封装类ActiionChains(包括单击、双击、右击、悬停、拖动等)。
ActionChains类提供的鼠标操作方法:
- perform( ):执行ActionChains中存储的所有行为。(ActionChians类实例化为对象后,通过perform( )依次执行操作)
- click( ):单击
- context_click( ) : 右击
- double_click( ) : 双击
- drag_and_drop( source, target ) : 拖动 (从一个位置到另一个位置,可用于某种拖动型的验证码)
- move_to_element ( ) : 鼠标悬停。(有些网页需要鼠标在特定位置悬停,才会显示待选项,进而点击进入下一个页面。比如https://www.baidu.com/,右上角的设置按钮,鼠标悬停才能出现备选项)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains # 引入ActionChains类
# ----------------------- driver=webdriver.Chrome()## 启动Chrome浏览器驱动 driver.get('https://www.baidu.com'); content_to_process=driver.find_element_by_link_text('新闻'); try: ActionChains(driver).click(content_to_process).perform( ) print 'success to click' except Exception as e: print 'fail'
其中的核心语句(寻找内容并点击)
ActionChains(driver).click(content_to_process).perform( )
可以分解为以下几个步骤:
driver=webdriver.Chrome( );
driver.get('http://www.baidu.com') action=ActionChains(driver)#步骤1:调用ActionChains()类,并将网页作为参数传入,实例化为具体的待操作对象 content_to_process=driver.find_element_by_link_text('新闻')#步骤2: 在网页中,定位“新闻”的坐标;可输出action,查看坐标内容和格式 action.click(content_to_process)#步骤3:传入元素的定位坐标,模拟鼠标点击 action.perform()#步骤4:执行ActionChains()中储存的所有操作,即执行之前的一系列操作;如果没有perform(),则只弹出百度网页(执行到driver.get('www.baidu.com'),而后续核心的点击操作不会执行。)
为什么要设置perform( )语句?方便执行??有点像pyplot的show ( )。 中间环节全部处理完,最后统一显示/执行。
==》ActionChains的perform( ) 执行原理:当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的事件会依次执行。
==》注意:webdriver本身也带有click( )功能;如果只是单击,可以直接这样操作
driver=webdriver.Chrome( ); driver.get('http://www.baidu.com') driver.find_element_by_link_text('新闻').click() while 1: continue ##保留页面显示
参考:1. https://www.cnblogs.com/jasontang369/p/9212381.html(这篇博客示例有错误,错误很容易辨别。可作为参考)
2. https://www.jb51.net/article/92682.htm
3. 定位坐标(无论鼠标单击、双击、悬停、拖动,还是在搜索框输入文字,都需要对操作的对象定位)
定位的实质是匹配(比如查找‘新闻’按钮的位置,此处无须使用正则表达式)。定位方式主要包括根据网页上的文字定位、根据网页源代码的标签定位。
参考:1. https://www.cnblogs.com/kitty-zhou/p/5438273.html
2. https://www.cnblogs.com/yoyoketang/p/6551274.html (好文章,自己尝试下)
3.https://www.cnblogs.com/yoyoketang/p/6557421.html
4.http://www.cnblogs.com/yufeihlf/p/5717291.html (重要,可以详细了解定位方法)
5.https://blog.csdn.net/a6864657/article/details/80616418(学一下xpath定位)
4. 搜索框输入关键字并检索(1. 定位;2. 输入;3. 确认搜索(enter))
先看示例:
from selenium import webdriver driver=webdriver.Chrome() # 启动浏览器 driver.get('https://www.baidu.com');# 获取百度页面 driver.find_element_by_id('kw').clear() ## 输入框清空(在百度首页,按F12,源码中id=‘kw’唯一对应搜索框) driver.find_element_by_id('kw').send_keys('selenium')# 输入搜索内容,此处我们搜索‘selenium’ driver.find_element_by_id('su').click()#百度首页的源码中, id=‘su’唯一对应‘百度一下’搜索按钮。
搜索框输入文字,主要是在定位后(找到输入框),利用send_keys()输入。send_keys(string)除了输入字符,还可以模拟键盘上的特定按键,实现一些特殊功能。键盘按钮通过Key()类封装到Keys:
- send_keys(Keys.BACK_SPACE): 删除键(backspace)
- send_keys(Keys.SPACE) : 空格键(SPACE)
- send_keys( Keys.TAB) :制表位
-send_keys(Keys.ENTER): 回车键(Enter)
- send_keys(Keys.CONTROL,'a'): 全选(Ctrl+A);
- send_keys(Keys.CONTROL,'c'): 复制(Ctrl+C);
-send_keys(Keys.CONTROL,'v'): 粘贴(Ctrl+V);(ctrol+x 剪切同理)
- send_keys(Keys.F1) 键盘F1
- send_keys(Keys.UP) : 方向键(上下左右,分别为UP、DOWN、LEFT,RIGHT,均为大写)
参考:https://www.cnblogs.com/c1116p1212/p/9482265.html
from selenium import webdriver from selenium.webdriver.common.keys import Keys ## 引入Keys 模块 # --------------------- driver=webdriver.Chrome(); driver.get('http://www.baidu.com') # 输入框输入内容 driver.find_element_by_id('kw').send_keys('seleniumm')## 词尾多输入了一个‘m’ driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)# 重新定位,删除多余的‘m’。 driver.find_element_by_id('kw').send_keys(Keys.SPACE)# 输入空格 driver.find_element_by_id('kw').send_keys(u'教程') driver.find_element_by_id('su').send_keys(Keys.ENTER)## 点击确定,此处也可以用click()替代send_keys(Keys.ENTER); # driver.quit()
5. 定位完成后,从网页提取所需信息(此时浏览器网页已经跳转到我们所期望的页面,有效信息都已经展示出来)
提取所需信息,可以通过两种途径。如下举例,a标签下的文本内容为你好,标签内属性有href,class,name,id。
<a href=xxx class=xxx name=xxx id=xxx > 你好 </a>
第一种方法:直接从源码中提取,
- finde_element().text : 获取标签的文本值(<a>和</a>构成一组标签,一开一闭。.text 获取标签之间的文本)
- find_element().get_attribute(): 获取属性值(即href,class,name,id的值)
第二种方法:采用BeatifulSoup等专门用来解析源码的安装包
- driver.page_source: 获取当前网页的所有源码
-soup=BeautifulSoup(driver.page_source,features='lxml') : 转化成BS对象,专门用来分析标签(需要学习BeautifulSoup教程)