码迷,mamicode.com
首页 > 其他好文 > 详细

【教程】利用Selenium爬取数据

时间:2021-06-08 22:42:27      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:实例   单元   事件   标签页   comm   操作   刷新   api   uid   

Selenium简介

Selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。【爬虫效率比较低
安装方法如下:

pip install selenium

当然,使用Selenium需要浏览器的驱动程序才能驱动浏览器。安装驱动程序的方法也很简单,下载驱动程序并安装,然后配置环境变量即可。

使用Selenium爬虫

1.与浏览器建立连接

# 1.加载网页
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path=r‘"安装目录") # 注意:这里用到的是PhantomJS浏览器
driver.get("https://www.baidu.com") # 请求
driver.save_screenshot("baidu.png") # 截图
# 退出
driver.quit() 

2.定位元素

  • find_element_by_id:根据id来查找某个元素
submitTag = driver.find_element_by_id(‘su‘)
submitTag1 = driver.find_element(By.ID,‘su‘)
  • find_element_by_class_name:根据类名查找元素
submitTag = driver.find_element_by_class_name(‘su‘)
submitTag1 = driver.find_element(By.CLASS_NAME,‘su‘)
  • find_element_by_name:根据name属性的值来查找元素
submitTag = driver.find_element_by_name(‘email‘)
submitTag1 = driver.find_element(By.NAME,‘email‘)
  • find_element_by_tag_name:根据标签名来查找元素
submitTag = driver.find_element_by_tag_name(‘div‘)
submitTag1 = driver.find_element(By.TAG_NAME,‘div‘)
  • find_element_by_xpath:根据xpath语法来获取元素
submitTag = driver.find_element_by_xpath(‘//div‘)
submitTag1 = driver.find_element(By.XPATH,‘//div‘)

要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素

3.操作浏览器

from selenium import webdriver
# 实例化浏览器
c = webdriver.Chrome()
# 发送请求
c.get(‘https://www.baidu.com‘)
  • 1.获取本页面URL
c.current_url
  • 2.获取日志
c.log_types  #获取当前日志类型
c.get_log(‘browser‘)#浏览器操作日志
c.get_log(‘driver‘) #设备日志
c.get_log(‘client‘) #客户端日志
c.get_log(‘server‘) #服务端日志
  • 3.窗口操作
c.maximize_window()#最大化
c.fullscreen_window() #全屏
c.minimize_window() #最小化
c.get_window_position() #获取窗口的坐标
c.get_window_rect()#获取窗口的大小和坐标
c.get_window_size()#获取窗口的大小
c.set_window_position(100,200)#设置窗口的坐标
c.set_window_rect(100,200,32,50)    #设置窗口的大小和坐标
c.set_window_size(400,600)#设置窗口的大小
c.current_window_handle   #返回当前窗口的句柄
c.window_handles         #返回当前会话中的所有窗口的句柄
  • 4.设置延时
c.set_script_timeout(5) #设置脚本延时五秒后执行
c.set_page_load_timeout(5)#设置页面读取时间延时五秒
  • 5.关闭
c.close() #关闭当前标签页
c.quit() #关闭浏览器并关闭驱动
  • 6.打印网页源代码
c.page_source
  • 7.屏幕截图操作
c.save_screenshot(‘1.png‘)#截图,只支持PNG格式
c.get_screenshot_as_png() #获取当前窗口的截图作为二进制数据
c.get_screenshot_as_base64() #获取当前窗口的截图作为base64编码的字符串
  • 8.前进后退刷新
c.forward() #前进
c.back()  #后退
c.refresh()#刷新
  • 9.Cookies操作
c.get_cookie(‘BAIDUID‘) #获取指定键的Cookies
c.get_cookies()         #获取所有的Cookies
for y in c.get_cookies():
   x=y
   if x.get(‘expiry‘):
       x.pop(‘expiry‘)     
   c.add_cookie(x) #添加Cookies  
c.delete_cookie(‘BAIDUID‘) #删除指定键的Cookies内容
c.delete_all_cookies() #删除所有cookies

4.操作表单元素

  • 1.使用clear方法可以清除输入框中的内容
inputTag.clear()
  • 2.操作checkbox
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  • 3.操作按钮
inputTag = driver.find_element_by_id(‘su‘)
inputTag.click()
  • 4.选择select
    select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。

  • 5.切换iframe
    iFrame,相当于页面的子页面,它的结构和外部网页的结构完全一致。Selenium打开页面后,默认是在父级 Frame 里面操作,而此时如果页面中还有子 Frame,Selenium是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame 方法来切换Frame。
    接下来通过豆瓣模拟登录来切换iframe,示例如下:

from selenium import webdriver
import time


url = ‘https:www.douban.com‘
driver = webdriver.Chrome()

driver.get(self.url)

time.sleep(3)
# 定位iframe标签
login_iframe = self.driver.find_element_by_xpath(‘//*[@id="anony-reg-new"]/div/div[1]/iframe‘)
# 切换iframe标签
driver.switch_to.frame(login_iframe)

5.行为链

有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件

actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,‘python‘)
actions.move_to_element(submitTag)
actions.context_click()
actions.click(submitTag)
actions.perform()
# 其他,参考http://selenium-python.readthedocs.io/api.html
click_and_hold(element):点击但不松开鼠标。
context_click(element):右键点击。
double_click(element):双击。

模拟豆瓣登录

from selenium import webdriver
import time

class Douban():

    def __init__(self):
        self.url = ‘https:www.douban.com‘
        self.driver = webdriver.Chrome()

    def login(self):
        self.driver.get(self.url)
        time.sleep(3)
        # 定位iframe标签
        login_iframe = self.driver.find_element_by_xpath(‘//*[@id="anony-reg-new"]/div/div[1]/iframe‘)
        # 切换iframe标签
        self.driver.switch_to.frame(login_iframe)
        # 第一张截图(登录前)
        self.driver.save_screenshot(‘db1.png‘)
        # 定位密码输入框
        self.driver.find_element_by_class_name(‘account-tab-account‘).click()
        # 输入手机号
        self.driver.find_element_by_id(‘username‘).send_keys(‘156xxxxxx26‘)
        # 输入密码
        self.driver.find_element_by_id(‘password‘).send_keys(‘.......‘)
        # 点击登录按钮
        self.driver.find_element_by_class_name(‘btn-account‘).click()
        time.sleep(3)
        # 第二张截图(登陆后)
        self.driver.save_screenshot(‘db2.png‘)

    def out(self):
        ‘‘‘调用内建的稀构方法,在程序退出的时候自动调用
        类似的还可以在文件打开的时候调用close,数据库链接的断开
        ‘‘‘
        self.driver.quit()

if __name__ == ‘__main__‘:
    db = Douban() # 实例化
    db.login() # 之后调用登陆方法

6.Selenium页面等待

  • Cookie操作
# 获取所有的cookie
cookies = driver.get_cookies()
# 根据cookie的name获取cookie
value = driver.get_cookie(key)
# 删除某个cookie
driver.delete_cookie(‘key‘)
  • 页面等待
    现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
# 隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间
driver.implicitly_wait(10)
# 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用# selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
 )
finally:
    driver.quit()

7.打开多窗口和切换页面

# 打开一个新的页面
driver.execute_script("window.open(‘url‘)")
print(driver.current_url)
# 切换到这个新的页面中
driver.switch_to_window(self.driver.window_handles[1])

8.案例

学习文章来源:https://mp.weixin.qq.com/s/qzXHzcT5urGeFEKwga7dhA

【教程】利用Selenium爬取数据

标签:实例   单元   事件   标签页   comm   操作   刷新   api   uid   

原文地址:https://www.cnblogs.com/blog-for-me/p/14861093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!