2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python爬虫之seleniun模块

时间:10-20来源:作者:点击数:74

seleniun模块

认识seleniun

  • - 便捷的获取网站中动态加载的数据
  • - 便捷实现模拟登录
  • - 基于浏览器自动化的一个模块。
seleniun函数(代码讲解)
exp1
  • from selenium import webdriver
  • from lxml import etree
  • # 导入对应的浏览器驱动(在网上下载对应浏览器版本,并选择相应的浏览器驱动函数,若为Microsoft Edge浏览器,在下载后要将驱动名称改为MicrosoftWebDriver.exe,否则不能使用)
  • bro = webdriver.Edge(executable_path="./MicrosoftWebDriver.exe")
  • #对网站发起请求(国家药品监局)
  • bro.get("http://scxk.nmpa.gov.cn:81/xk/")
  • #page_source函数能获取请求数据
  • page_text=bro.page_source
  • #解析数据
  • tree=etree.HTML(page_text)
  • name_loc_list=tree.xpath("//*[@id='gzlist']/li")
  • for name_loc in name_loc_list:
  • name=name_loc.xpath('.//dl/@title')[0]
  • print(name)
  • time.sleep(5)
  • #关闭浏览器
  • bro.quit()
  • """
  • 结果:
  • 婕珞芙(云南)化妆品有限责任公司
  • 扬州福悦熹日化有限公司
  • 扬州鸿轩实业有限公司
  • 金平金岭生物瑶药开发有限责任公司
  • 河源市杰格丰化妆品有限公司
  • 汕头市欧姿雅日化有限公司
  • 汕头市美意实业有限公司
  • 辽宁美爱富化妆品有限公司
  • 广州觅你化妆品有限公司
  • 蓝海药业(广州)有限公司
  • 广东芭薇生物科技股份有限公司
  • 广州德信药业科技有限公司
  • 广东香奈雪生物科技有限公司
  • 汕头市缘如遇科技有限公司
  • 婧贵生物科技(广州)有限公司
  • 前面我们已经说过:对于这个网站上的数据是动态加载出来的,不能直接通过requests模块函数进行对于企业名称数据的获取
  • 但是为什么selenium模块能直接获取数据呢?
  • Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,在打开过程中网页上的数据就已经加载出来过了
  • 所以我们直接对数据进行处理就能的出结果
  • """
exp2
  • from selenium import webdriver
  • bro = webdriver.Edge(executable_path="./MicrosoftWebDriver.exe")
  • #将浏览器最大化,以便后期定位
  • bro.maximize_window()
  • #进入该网址
  • bro.get("https://www.taobao.com/")
  • #find的函数定位(有很多像find_element_by_**的函数供我们使用,我们可以通过自己的需求进行使用,也包括xpath)
  • # 这句代表获取id为q的标签数据
  • re_id=bro.find_element_by_id('q')
  • # 因为这个标签对应的是搜索框,可以进行数据搜索,填入‘鞋’
  • re_id.send_keys("鞋")
  • time.sleep(3)
  • # 定位搜索按钮,以便我们点击进行搜索
  • # 返回一个列表,里面是selenium对象所以要有[0]
  • # 注意find_elements_by_xpath返回列表,find_element_by_xpath返回对象,有一个s的区别
  • cli=bro.find_elements_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
  • # 对于搜索按钮进行点击进入界面
  • cli[0].click()
  • #后退
  • bro.back()
  • time.sleep(3)
  • # 运行js代码的函数,这句后面表示下翻一页
  • bro.execute_script("window.scrollTo(0,document.body.scrollHeight)")
  • time.sleep(3)
  • #前进
  • bro.forward()
  • time.sleep(3)
  • #关闭
  • bro.quit()
exp3(iframe和动作链)

动作链实例网站

在这里插入图片描述
  • import time
  • from msedge.selenium_tools import Edge
  • from selenium.webdriver import ActionChains # 导入动作链库
  • bro = Edge(executable_path="./MicrosoftWebDriver.exe")
  • bro.get("https://www.cdsy.xyz/try/try.php?filename=jqueryui-api-droppable")
  • # 由于iframe是一个特殊的标签,在iframe里的标签(像id=‘draggable’的标签)不能直接被查找所以
  • # 我们要做一些预处理操作bro.switch_to.frame
  • # 传入iframe的id运行后就可以对里面的标签进行操作了,可以理解为更改了作用域
  • bro.switch_to.frame("iframeResult")
  • div = bro.find_element_by_id('draggable')
  • # 为了使某些标签移动,动作连贯化,对bro界面进行动作链的实例化
  • action = ActionChains(bro)
  • # id=‘draggable’的标签就是我们移动目标的标签,对他的返回值进行动作链相关的操作
  • # click_and_hold含义是点击且长按div对象,等待后续操作
  • action.click_and_hold(div)
  • for i in range(5):
  • # 对实例化好后包含div对象的action进行移动
  • # move_by_offset(x,y)x表示横轴方向移动的像素点大小,y为纵轴方向移动的像素点大小
  • # perform()表示立即操作
  • action.move_by_offset(10, 0).perform()
  • time.sleep(0.5)
  • # 释放动作链
  • action.release()
  • time.sleep(2)
  • # 关闭
  • bro.quit()
登录扣扣

定位点击登陆选项

在这里插入图片描述

点击账号密码登陆(iframe内)

在这里插入图片描述

定位账号密码框,填入账号密码,点击登陆按钮

在这里插入图片描述
  • from msedge.selenium_tools import Edge
  • #规避操作
  • service_arg=['--verbose']
  • bro=Edge(executable_path="./MicrosoftWebDriver.exe",service_args=service_arg)
  • # 扣扣网址
  • bro.get("https://im.qq.com/index")
  • # 定位点击登陆选项
  • str=bro.find_element_by_xpath('//*[@id="loginInfo"]/a')
  • str.click()
  • # 点击账号密码登陆(iframe内)
  • bro.switch_to.frame('frame-login')
  • str=bro.find_element_by_xpath('//*[@id="switcher_plogin"]')
  • str.click()
  • #定位账号框,填入账号
  • account=bro.find_elements_by_class_name('inputstyle')[0]
  • account.send_keys('账号')
  • #定位密码框,填入密码
  • secret=bro.find_element_by_id('p')
  • secret.send_keys('密码')
  • #点击登录按钮
  • str=bro.find_elements_by_class_name('btn')[0]
  • str.click()
关于破解滑动验证码

有些朋友最怕遇到滑动验证码,以至于爬数据登陆网站束手无策,我给大家分装了一个函数,下面教大家怎么用

关于函数原理戳这里,模板匹配那一小结

  • import cv2 # 导库
  • def distance(image_path,tem_path,x):
  • image = cv2.imread(image_path, 0)
  • tem = cv2.imread(tem_path, 0)
  • height, width = tem.shape[:2]
  • res = cv2.matchTemplate(image, tem, cv2.TM_CCOEFF_NORMED)
  • min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  • return max_loc[0] - x
  • """
  • distance(image_path # 整个验证码的路径 见图1
  • ,tem_path # 目标移动位置路径 见图2
  • ,x # 见图3
  • # 对没错,x 就是像素值,大概是几十左右
  • )
  • 返回值max_loc[0] - x
  • 含义是需要移动的像素点
  • 那么我们使用动作链进行操作:
  • action = ActionChains(bro)
  • action.click_and_hold(div) #div是滑动时的按键
  • action.move_by_offset(distance返回值, 0).perform()
  • 也就是说,首先要把image_path对应的图片(图1)通过请求下载下来
  • tem_path对应的图片(图2) 是我们提前截屏截好的
  • x大概12,可以在8到15之间试一下
  • 然后通过动作链进行操作即可
  • 注意:
  • 1. 不用担心缺口不一样会不会出错
  • 2. 对不同图片可以使用相同的tem_path
  • 3. tem_path对应的图片尽量精准,且要与运行时图片图片大小相同
  • 4. 后续我也会改进这个,让它自动实现测距
  • """

图1

在这里插入图片描述

图2

(没错就是截屏截下来的,你使用的时候也需要搞下来啊,没办法,孩子只有这个笨方法)

在这里插入图片描述

图3(那个白色的x就是我们要的像素值)

在这里插入图片描述
Microsoft Edge的无头浏览器界面

Microsoft Edge浏览器无头和规避使用官网

  • 由于from selenium import webdriver中并没有无头操作
  • 我们使用另一个库来操作:msedge-selenium_tools(可完全替代selenium.webdriver)
  • from msedge.selenium_tools import EdgeOptions
  • from msedge.selenium_tools import Edge
  • Edge来代替webdriver.Edge
  • EdgeOptions是无头参数包
  • 于是就有了:
  • from msedge.selenium_tools import EdgeOptions
  • from msedge.selenium_tools import Edge
  • #这三句为固定用法,其他和上述所有操作无差别
  • edge_options = EdgeOptions()
  • edge_options.use_chromium = True
  • edge_options.add_argument('headless')
  • edge_options.add_argument('--disable-gpu')
  • bro=Edge(executable_path="./MicrosoftWebDriver.exe",options=edge_options)
Microsoft Edge的规避操作

为了防止浏览器检测到我们是通过selenium形式登陆网页,我们进行如下操作

  • from msedge.selenium_tools import Edge
  • #固定写法
  • service_arg=['--verbose']
  • bro=Edge(executable_path="./MicrosoftWebDriver.exe",service_args=service_arg)
无头和规避的结合
  • from msedge.selenium_tools import EdgeOptions
  • from msedge.selenium_tools import Edge
  • #无头操作
  • edge_options = EdgeOptions()
  • edge_options.use_chromium = True
  • edge_options.add_argument('headless')
  • edge_options.add_argument("disable-gpu")
  • #规避操作
  • service_arg=['--verbose']
  • bro=Edge(executable_path="./MicrosoftWebDriver.exe"#驱动器path参数
  • ,options=edge_options#无头操作参数
  • ,service_args=service_arg#规避操作参数
  • )

【持续更新ing】

爱你呦
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门