代码改变世界

爬虫笔记<关于鼠标点击和内容输入>

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教程)