SPIDER-DAY06--selenium

 

SPIDER-DAY06

1. selenium详解

1.1 代码演示

"""
使用selenium打开浏览器,进入百度的搜索页面
"""
# 导入selenium的webdriver接口
from selenium import webdriver

# 1.打开浏览器 - 创建浏览器对象
driver = webdriver.Chrome()
# 浏览器窗口最大化
driver.maximize_window()
# 2.在地址栏输入 百度的URL地址
driver.get(url='http://www.baidu.com/')
# 3.page_source属性:获取HTML结构源码
html = driver.page_source
# quit(): 关闭浏览器
driver.quit()
"""示例代码二:打开百度,搜索高圆圆,点击搜索,查看"""

from selenium import webdriver

# 1. 打开浏览器,输入百度URL地址
driver = webdriver.Chrome()
driver.get(url='http://www.baidu.com/')
# 2. 找到搜索框节点,并发送关键字:高圆圆
node = driver.find_element_by_xpath('//*[@id="kw"]')
node.send_keys('高圆圆')
# 3. 找到 百度一下 按钮,并点击确认
driver.find_element_by_xpath('//*[@id="su"]').click()

1.2 浏览器对象方法

【1】driver.get(url=url)   - 地址栏输入url地址并确认
【2】driver.quit()         - 关闭浏览器
【3】driver.close()        - 关闭当前页
【4】driver.page_source    - HTML结构源码
【5】driver.page_source.find('字符串')
   从html源码中搜索指定字符串,没有找到返回:-1,经常用于判断是否为最后一页
【6】driver.maximize_window() - 浏览器窗口最大化

1.3 定位节点

【1】单元素查找('结果为1个节点对象')
   1.1) 【最常用】driver.find_element_by_id('id属性值')
   1.2) 【最常用】driver.find_element_by_name('name属性值')
   1.3) 【最常用】driver.find_element_by_class_name('class属性值')
   1.4) 【最万能】driver.find_element_by_xpath('xpath表达式')
   1.5) 【匹配a节点时常用】driver.find_element_by_link_text('链接文本')
   1.6) 【匹配a节点时常用】driver.find_element_by_partical_link_text('部分链接文本')
   1.7) 【最没用】driver.find_element_by_tag_name('标记名称')
   1.8) 【较常用】driver.find_element_by_css_selector('css表达式')

【2】多元素查找('结果为[节点对象列表]')
   2.1) driver.find_elements_by_id('id属性值')
   2.2) driver.find_elements_by_name('name属性值')
   2.3) driver.find_elements_by_class_name('class属性值')
   2.4) driver.find_elements_by_xpath('xpath表达式')
   2.5) driver.find_elements_by_link_text('链接文本')
   2.6) driver.find_elements_by_partical_link_text('部分链接文本')
   2.7) driver.find_elements_by_tag_name('标记名称')
   2.8) driver.find_elements_by_css_selector('css表达式')

1.4 节点对象操作

【1】node.send_keys('')  - 向文本框发送内容
【2】node.click()      - 点击
【3】node.get_attribute('属性名')  -  获取节点的属性值
【4】node.text  -  获取当前节点及子节点和后代节点的文本内容

1.5 猫眼电影爬虫

"""
selenium抓取猫眼电影top100
"""
from selenium import webdriver

# 设置无头模式(无界面模式)
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get(url='https://maoyan.com/board/4')

def get_one_page():
   """获取1页电影数据的函数"""
   dd_list = driver.find_elements_by_xpath('//*[@id="app"]/div/div/div[1]/dl/dd')
   for dd in dd_list:
       item = {}
       # text属性:获取当前节点以及子节点和后代节点的文本内容
       info_list = dd.text.split('\n')
       item['rank'] = info_list[0].strip()
       item['title'] = info_list[1].strip()
       item['star'] = info_list[2].strip()
       item['time'] = info_list[3].strip()
       item['score'] = info_list[4].strip()
       print(item)

# 1. 获取10页的电影数据
# 如果可以的话,能否让程序自己判断是否为最后一页
while True:
   get_one_page()
   try:
       # find_element : 找不到节点会抛出异常NoSuchElementException
       driver.find_element_by_link_text('下一页').click()
   except Exception as e:
       driver.quit()
       break

2. selenium高级

2.1 设置无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

==2.2 鼠标操作==

"""
鼠标操作三步走:
1、创建鼠标事件类对象
2、指定鼠标行为
3、执行
"""
from selenium import webdriver
# 导入鼠标事件类
from selenium.webdriver import ActionChains

# 1.打开浏览器,输入百度URL地址
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url='http://www.baidu.com/')
# 2.把鼠标移动到 设置 节点
set_node = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
ActionChains(driver).move_to_element(set_node).perform()
# 3.找到 高级搜索 节点,并点击
driver.find_element_by_link_text('高级搜索').click()

==2.3 切换页面==

  • 适用网站+应对方案

    【1】适用网站类型
       页面中点开链接出现新的窗口,但是浏览器对象driver还是之前页面的对象,需要切换到不同的窗口进行操作
       
    【2】应对方案 - driver.switch_to.window()
       
       # 获取当前所有句柄(窗口)- [handle1,handle2]
       all_handles = driver.window_handles
       # 切换browser到新的窗口,获取新窗口的对象
       driver.switch_to.window(all_handles[1])
  • 民政部网站案例-selenium

    """
    适用selenium+Chrome抓取民政部行政区划代码
    http://www.mca.gov.cn/article/sj/xzqh/2020/
    """
    import sys

    from selenium import webdriver
    import time
    import redis
    from hashlib import md5

    class MzbSpider:
       def __init__(self):
           # 设置无界面
           self.options = webdriver.ChromeOptions()
           self.options.add_argument('--headless')
           self.driver = webdriver.Chrome(options=self.options)

           self.driver.get(url='http://www.mca.gov.cn/article/sj/xzqh/2020/')
           self.r = redis.Redis(host='localhost',port=6379,db=0)

       def md5_href(self, href):
           """md5加密的功能函数"""
           m = md5()
           m.update(href.encode())

           return m.hexdigest()

       def parse_html(self):
           """解析提取数据"""
           new_month_a = self.driver.find_element_by_xpath('//*[@id="list_content"]/div[2]/div/ul/table/tbody/tr[1]/td[2]/a')
           # 生成指纹
           href = new_month_a.get_attribute('href')
           finger = self.md5_href(href)
           if self.r.sadd('mzb:spiders', finger) == 1:
               new_month_a.click()
               time.sleep(3)
               # 切换句柄
               li = self.driver.window_handles
               self.driver.switch_to.window(li[1])
               # 开始提取数据(单独写了个函数提取数据而已)
               self.get_data()
           else:
               sys.exit('更新完成')

       def get_data(self):
           """提取具体数据"""
           tr_list = self.driver.find_elements_by_xpath('//tr[@height="19"]')
           for tr in tr_list:
               item = {}
               li = tr.text.split()
               item['code'] = li[0]
               item['name'] = li[1]
               print(item)
           # 关闭浏览器
           self.driver.quit()

    if __name__ == '__main__':
       spider = MzbSpider()
       spider.parse_html()

==2.4 切换frame==

  • 特点+方法

    【1】特点
       网页中嵌套了网页,先切换到iframe,然后再执行其他操作

    【2】处理步骤
       2.1) 切换到要处理的Frame
       2.2) 在Frame中定位页面元素并进行操作
       2.3) 返回当前处理的Frame的上一级页面或主页面

    【3】常用方法
       3.1) 切换到frame  -  driver.switch_to.frame(frame节点对象)
       3.2) 返回上一级   -  driver.switch_to.parent_frame()
       3.3) 返回主页面   -  driver.switch_to.default_content()
       
    【4】使用说明
       4.1) 方法一: 默认支持id和name属性值
           switch_to.frame(id属性值|name属性值)
       4.2) 方法二:
           a> 先找到frame节点 : frame_node = driver.find_element_by_xpath('xxxx')
           b> 在切换到frame   : driver.switch_to.frame(frame_node)
  • 示例1 - 登录豆瓣网

    """
    登录豆瓣网
    """
    from selenium import webdriver
    import time

    # 打开豆瓣官网
    driver = webdriver.Chrome()
    driver.get('https://www.douban.com/')

    # 切换到iframe子页面
    login_frame = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
    driver.switch_to.frame(login_frame)

    # 密码登录 + 用户名 + 密码 + 登录豆瓣
    driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    driver.find_element_by_xpath('//*[@id="username"]').send_keys('自己的用户名')
    driver.find_element_by_xpath('//*[@id="password"]').send_keys('自己的密码')
    driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
    time.sleep(3)

    # 点击我的豆瓣
    driver.find_element_by_xpath('//*[@id="db-nav-sns"]/div/div/div[3]/ul/li[2]/a').click()

2.5 selenium总结

  • selenium+phantomjs|chrome|firefox小总结

    【1】设置无界面模式
       options = webdriver.ChromeOptions()
       options.add_argument('--headless')
       driver = webdriver.Chrome(excutable_path='/home/tarena/chromedriver',options=options)
       
    【2】browser执行JS脚本
       driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
       
    【3】鼠标操作
       from selenium.webdriver import ActionChains
       ActionChains(driver).move_to_element('node').perform()
       
    【4】切换句柄 - switch_to.frame(handle)
       all_handles = driver.window_handles
       driver.switch_to.window(all_handles[1])
       
    【5】iframe子页面
       driver.switch_to.frame(frame_node)
  • lxml中的xpath 和 selenium中的xpath的区别

    【1】lxml中的xpath用法 - 推荐自己手写
       eobj = etree.HTML(html)
       div_list = eobj.xpath('//div[@class="abc"]/div')
       item = {}
       for div in div_list:
           item['name'] = div.xpath('.//a/@href')[0]
           item['likes'] = div.xpath('.//a/text()')[0]
           
    【2】selenium中的xpath用法 - 推荐copy - copy xpath
       # 此生铭记:selenium中的xpath表达式,千万不能加 /text() 和 /@属性名
       # 想获取文本:.text属性
       # 想获取属性值:.get_attribute('属性名')
       div_list = browser.find_elements_by_xpath('//div[@class="abc"]/div')
       item = {}
       for div in div_list:
           item['name'] = div.find_element_by_xpath('.//a').get_attribute('href')
           item['likes'] = div.find_element_by_xpath('.//a').text

4. 今日作业

【1】使用selenium+浏览器 获取有道翻译结果
提示:1.text属性
        2.注意time.sleep()
【2】使用selenium+浏览器 登录网易163邮箱 : https://mail.163.com/
posted @   我不知道取什么名字好  阅读(294)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示