【python】——爬虫04 Selenium

  • Post author:
  • Post category:python


  • selenium自动化测试框架在爬虫的应用
  • selenium大幅降低爬虫的编写难度
  • 大幅降低速度



一、selenium概述



1. 运行操作

  • selenium是一个web自动化测试工具
  • 开发使用 有头浏览器,部署使用无界面浏览器
  • webdriver本质是一个web-server,对外提供API,封装了浏览器的各种功能
  • 代码调用webdriver操作浏览器

    在这里插入图片描述



2. 安装webdriver

查看浏览器版本,安装对应的驱动

在这里插入图片描述

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

然后将其中的.exe文件复制到浏览器的安装路径下。

浏览器安装路径:C:\Program Files (x86)\Microsoft\Edge\Application

利用python的脚本语言,指定浏览器的驱动。(一定要指定到驱动的名称,即复制进浏览器安装路径里的.exe文件的名称。如果只到application,python脚本运行会报错。)

在这里插入图片描述

import time
from selenium import webdriver

# 通过指定msedgdriver的路径来实例化driver对象,msedgedriver放在当前目录
# msedgedriver添加环境变量了,但是不知道为什么不指定路径就会报错
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')
# driver = webdriver.Edge()

# 控制浏览器访问url地址
driver.get("https://www.baidu.com/")


# 百度搜索框中搜索python
driver.find_element_by_id('kw').send_keys('python')

# 点击搜索python
driver.find_element_by_id('su').click()

time.sleep(6)
# 6s后退出浏览器
driver.quit



二、元素定位



1. driver对象的常用属性、方法


driver.page_source

当前标签浏览器选然后的源码


driver.current_url

响应的源码(不是请求的源码


driver.close()

关闭标签


driver.quit()

关闭浏览器


driver.forward()

页面前进


driver.back()

页面后退


driver.screenshot(img_name)

页面截图

import time
from selenium import webdriver

driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')

url = 'http://www.baidu.com'
driver.get(url)
print(driver.page_source)
driver.save_screenshot('baidu.png')

在这里插入图片描述



2. 定位方法

#通过xpath进行元素定位
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('python3')
# 通过css选择器 元素定位:复制selector   #kw
driver.find_element_by_css_selector('#kw').send_keys('德赫')
# 通过name属性值进行元素定位
driver.find_element_by_name('wd').send_keys('Draco')
# 通过class属性进行元素定位
driver.find_element_by_class_name('s_ipt').send_keys('')

# 通过链接文本
driver.find_element_by_link_text('hao123').click  # 报错,停在百度
driver.find_element_by_partial_link_text('hao123').click() # 跳到123

# 通过tag定位
# 目标元素是当前html中唯一标签,或众多定位标签中第一个的时候
print(driver.find_element_by_tag_name('title'))

  • find_elements

    返回列表,匹配不到返回空列表

  • find_element

    返回第一个匹配到的对象。匹配不到抛出异常



三、selenium其他用法



1. 句柄

工具、智能指针

# 获取当前所有标签页的句柄 构成的列表
current_windows = driver.window_handles

# 根据句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])



58同城跳转到租房页

from selenium import webdriver
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')

url = 'https://cd.58.com/'
driver.get(url)

# 验证当前url、句柄
print(driver.current_url)
print(driver.window_handles)
#                https://cd.58.com/
#               ['CDwindow-4560EDDD575AF11C521237B39D55F43B']

# 定位 点击租房按钮

el = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()

print(driver.current_url)
print(driver.window_handles)
#
#               https://cd.58.com/
#               ['CDwindow-1C5285AC304F92464CCEF628E0E0ADCA', 'CDwindow-A2AB402B3B27B0BE9BCD11BC75D1883E']


# 两次验证发现url一样,句柄多了一个,但是url并未跳转,操作权还在首页



# 移动句柄
driver.switch_to.window(driver.window_handles[-1])
el_list = driver.find_element_by_xpath('/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(el_list)



2. frame

切换框架

driver.switch_to.frame()


from selenium import webdriver
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')

url = 'https://qzone.qq.com/'

driver.get(url)


# 切换框架
driver.switch_to.frame('login_frame')

# 直接点击头像登录
driver.find_element_by_id('img_out_qq号').click()
# 若未切换框架,则定位不到框架内的,报错



3. selenium对cookie的处理

get.cookies()  # 拿到所有cookies

获取cookies,转成字典


from selenium import webdriver
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')

url = 'https://www.baidu.com/'


driver.get(url)
print(driver.get_cookies())
# 返回的是一个列表,每个元素是一个字典

cookies = {data['name']:data['value'] for data in driver.get_cookies()}
print(cookies)

在这里插入图片描述

# 删除一条cookie
driver.delete_cookie("domain")

# 删除所有cookie
driver.delete_all_cookies()  
# xs python大小写知意



4. selenium控制浏览器执行js代码

滚轮下滑才会触发



from selenium import webdriver
driver = webdriver.Edge('C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver')

url = 'https://cd.lianjia.com/'
driver.get(url)


# 要点击的button在下面,没有拖动滚轮触发
# js实现拖动

js = 'scrollTo(0,500)'  # 一般宽屏,只移3纵轴
driver.execute_script(js)

el_button = driver.find_element_by_xpath('/html/body/div[2]/div/div[1]/div[2]/div[1]/a[2]')
el_button.click()



5. 页面等待

  • 强制等待

    time.sleep()
  • 隐式等待

    driver.implicity_wait(10)
  • 显示等待
  • 手动分析



6. selenium开启无界面模式



from msedge.selenium_tools import Edge, EdgeOptions

url = 'http://www.baidu.com'

# 创建配置对象
opt = EdgeOptions()

# 添加配置参数
opt.add_argument('--headless')
opt.add_argument('--diaable-gpu')

# 创建浏览器对象
# 添加配置对象
# 
driver = Edge(options=opt)
driver.get(url)
driver.save_screenshot('baidujietu.png')

emmmm不知道哪里问题,还是会跳出来浏览器,仿佛参数没用



7. 用selenium爬取斗鱼直播相关信息


from selenium import webdriver
from msedge.selenium_tools import Edge
import time


class Douyu(object):

    def __init__(self):
        self.url = 'https://www.douyu.com/directory/all'
        self.driver = webdriver.Edge()


    def parse(self):
        room_list = self.driver.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li/div')

        # print(room_list)


        data_list = []
        for room in room_list:
            temp = {}
            self.driver.execute_script('scrollTo(0,1000000)')
            time.sleep(10)
            temp['title'] = room.find_element_by_xpath('./a[1]/div[2]/div[1]/h3').text
            temp['type'] = room.find_element_by_xpath('./a[1]/div[2]/div[1]/span').text
            temp['owner'] = room.find_element_by_xpath('./a[1]/div[2]/div[2]/h2').text
            temp['hot'] = room.find_element_by_xpath('./a[1]/div[2]/div[2]/span').text
            data_list.append(temp)


        return data_list

    def sava_data(self, data_list):
        for data in data_list:
            print(data)

    def run(self):
        # url
        # driver
        # get

        self.driver.get(self.url)
        while True:
            # parse
            data_list = self.parse()
            # save
            self.save_data(data_list)
            # next
            # 分析下一页和尾页情况
            # 下一页:dy-Pagination-item-custom
            # 在尾页的下一页:dy-Pagination-disabled dy-Pagination-next

            # //*[@class="dy-Pagination-item-custom"]

           # try:
            el_next = self.driver.find_element_by_xpath('//*[contains(text(),"下一页")]')
            print(el_next)
            el_next.click()





if __name__ == '__main__':

    douyu = Douyu()
    douyu.run()



版权声明:本文为grb819原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。