SPIDER-DAY06--selenium
SPIDER-DAY06
1. selenium详解
"""
使用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/
分类:
爬虫
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探