selenium-程序指挥浏览器

简介

一个强大的python库,可以用它控制浏览器,做出打开、输入、点击等动作。
selenium中文网
中文参考文档
优点:
1、遇到复杂验证码,如12306网站时,selenium可以让人工介入
2、爬取加密复杂的动态网页时,可以等所有动态网页加载完毕,将其当作一个静态网页进行爬取
缺点:
需要时间和资源

安装方法

pip install selenium # Windows电脑安装selenium

pip3 install selenium # Mac电脑安装selenium

selenium的脚本可以控制所有常见浏览器的操作,在使用之前,需要安装浏览器的驱动。推荐的是Chrome浏览器。
下载链接:http://npm.taobao.org/mirrors/chromedriver/

chromewebdriver需要chrome以及python的执行文件在同一目录下,如果这两步完成后还是不能使用webdriver,那么需要将它添加到环境变量中。

使用

调用selenium

# 本地Chrome浏览器设置方法
# 把Chrome浏览器设置为引擎,然后赋值给变量driver
from selenium import webdriver #从selenium库中调用webdriver模块

driver = webdriver.Chrome() # 设置引擎为Chrome,从本地打开一个Chrome浏览器
driver.get(url) # 打开指定url的网页
driver.close() # 关闭浏览器

解析提取数据

1、selenium自身解析提取数据

selenium所解析提取的,是Elements中的所有数据,BeautifulSoup所解析的则只是Network中第0个请求的响应。
用selenium把网页打开,所有信息就都加载到了Elements那里,之后就可以把动态网页用静态网页的方法爬取了。
以下为获取第一个符合要求的数据的方法。
如果要获取所有符合要求的数据,将element替换为elements即可。

#find_element_by_tag_name:通过元素的名称选择
# 如<h1>你好,X战警</h1>
# 可以使用find_element_by_tag_name('h1')

#find_element_by_class_name:通过元素的class属性选择
# 如<h1 class="title">你好,X战警</h1>
# 可以使用find_element_by_class_name('title')

#find_element_by_id:通过元素的id选择
# 如<h1 id="title">你好,X战警</h1>
# 可以使用find_element_by_id('title')

#find_element_by_name:通过元素的name属性选择
# 如<h1 name="hello">你好,X战警</h1>
# 可以使用find_element_by_name('hello')

#以下两个方法可以提取出超链接
#find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好,X战警</a>
# 可以使用find_element_by_link_text('你好,X战警')

#find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="https://xiaoke.kaikeba.com/example/X-Man/">你好,X战警</a>
# 可以使用find_element_by_partial_link_text('你好')

# find_element_by_css_selector: 通过css选择器定位

# find_element_by_xpath: 通过xpath表达式定位

获取的对象是WebElement类对象,与Tag对象类似,可以通过属性与方法提取元素与属性的值

data = driver.find_element_by_id('xxx') # 按照id查找
print(data.text) # 通过.text属性打印元素内容
print(data.get_attribute('class')) # 通过.get_attribute()方法获取属性值

2、selenium获取网页,BeautifulSoup解析提取数据

selenium可以获取到渲染完整的网页源代码

HTML = driver.page_source # 字符串类型的网页源代码
soup = BeautifulSoup(HTML,'HTML.parser')

模拟鼠标与键盘

提交数据:
利用selenium打开浏览器后,通过解析提取数据的方法找到需要提交数据的位置,利用.send_keys()方法提交数据
点击按钮:
利用selenium打开浏览器后,通过解析提取数据的方法找到按钮的位置,利用.click()方法点击
清除元素:
若在空格中已经输入了文字,但想改成其他的,就需要先用.clear()清除掉原来的文字,再填写新的文字。
注意:在获取到网页之后,解析与提取之前,加上time.sleep(2),因为网页的加载需要零点几秒的时间,保险起见,我们等待2秒。

# 模拟鼠标事件
# .click() 模拟鼠标单击
# .context_click() 模拟鼠标
# .double_click() 模拟鼠标双击
# .drag_and_drop() 模拟鼠标拖动

# 模拟键盘操作
# .send_keys() 提交数据
# .send_keys(Keys.CONTROL,'V') 两个参数,代表组合键,此处代表复制
# .send_keys(Keys.SPACE) 空格
# .send_keys(Keys.TAB) 制表位
# .send_keys(Keys.ENTER) 回车
# .send_keys(Keys.BACK_SPACE) 删除

案例

from selenium import webdriver #从selenium库中调用webdriver模块
import time
from lxml import etree

driver = webdriver.Chrome() # 设置引擎为Chrome,从本地打开一个Chrome浏览器
driver.get('https://y.qq.com/n/yqq/song/001qvvgF38HVc4.html') # 访问页面
time.sleep(1)

while True:
    try:
        clickformore = driver.find_element_by_link_text('更多精彩评论')
        time.sleep(0.5)
        # clickformore.click() 运行后无法点击
        driver.execute_script("arguments[0].click();", clickformore)
    except:
        print("不能再点击加载更多啦")
        break

page_tree=etree.HTML(driver.page_source)
comments = page_tree.xpath('//*[@id="comment_box"]/div[4]/ul[@class="comment__list"]/li')
print(len(comments))

for i in range(0,len(comments)): # 循环
    comment = comments[i].xpath('./div[1]/p[@class="comment__text "]/span/text()')[0]
    print ('评论'+str(i)+':'+comment + '\n-------------------------------------------------') # 打印评论
driver.close() # 关闭浏览器

一开始定位到“更多精彩评论”元素后,直接用.click()方法,程序运行报错,错误信息为ElementClickInterceptedException:element click intercepted.
百度说可能被其他元素遮挡,导致无法点击,两种解决方法:
方法一:

element = driver.find_element_by_id("xxx") # 定位到元素
driver.execute_script("arguments[0].click();", element)

方法二:

element = driver.find_element_by_id("xxx") # 定位到元素
webdriver.ActionChains(driver).move_to_element(element ).click(element ).perform()

此处采用方法一,问题得以解决。

静默模式

浏览器只是在后台运行,并不在电脑中打开它的可视界面

from selenium import  webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类
chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值