Python之Selenium自动化爬虫
文章目录
- Python之Selenium自动化爬虫
- 0.介绍
- 1.安装
- 2.下载浏览器驱动
- 3.实例
- 4.开启无头模式
- 5.保存页面截图
- 6.模拟输入和点击
- a.根据文本值查找节点
- b.获取当前节点的文本
- c.打印当前网页的一些信息
- d.关闭浏览器
- e.模拟鼠标滚动
- 7.ChromeOptions
- 8.验证滑块移动
- 9.打开多窗口和页面切换
- 10.Cookie操作
- 11.模拟登录
- 12.使用代理
- 14.更换UA
- 15.鼠标悬停
- 16.优缺点
Python之Selenium自动化爬虫
0.介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
1.安装
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2.下载浏览器驱动
这里用的谷歌浏览器
http://npm.taobao.org/mirrors/chromedriver/
查看自己的浏览器版本下载对应的驱动。
把解压后的驱动放在自己的python.exe 目录下。
3.实例
我之前写过3个实例
https://harris.blog.csdn.net/article/details/116406200
4.开启无头模式
是否开启无头模式(即是否需要界面)
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Optionsoption = Options() # 实例化option对象
option.add_argument("--headless") # 给option对象添加无头参数
option.headless = True #这种方式也可以
if __name__ == '__main__':web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.web.get("https://baidu.com")print(web.title)
5.保存页面截图
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Optionsoption = Options() # 实例化option对象
option.add_argument("--headless") # 给option对象添加无头参数if __name__ == '__main__':web = Chrome()web.maximize_window() # 浏览器窗口最大化web.get("https://baidu.com")print(web.title)web.save_screenshot('baidu.png') # 保存当前网页的截图 保存到当前文件夹下web.close() # 关闭当前网页
6.模拟输入和点击
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Optionsoption = Options() # 实例化option对象
option.add_argument("--headless") # 给option对象添加无头参数if __name__ == '__main__':web = Chrome()web.maximize_window() # 浏览器窗口最大化web.get("https://baidu.com")el = web.find_element_by_id('kw')el.send_keys('Harris-H')btn = web.find_element_by_id('su')btn.click()# web.close() # 关闭当前网页
貌似现在百度可以识别出selenium,还需要图片验证。
a.根据文本值查找节点
# 找到文本值为百度一下的节点
driver.find_element_by_link_text("百度一下")
# 根据链接包含的文本获取元素列表,模糊匹配
driver.find_elements_by_partial_link_text("度一下")
b.获取当前节点的文本
ele.text # 获取当前节点的文本
ele.get_attribute("data-click") # 获取到属性对应的value
c.打印当前网页的一些信息
print(driver.page_source) # 打印网页的源码
print(driver.get_cookies()) # 打印出网页的cookie
print(driver.current_url) # 打印出当前网页的url
d.关闭浏览器
driver.close() # 关闭当前网页
driver.quit() # 直接关闭浏览器
e.模拟鼠标滚动
from selenium.webdriver import Chrome
import timeif __name__ == '__main__':driver = Chrome()driver.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")# 1.滚动到网页底部js = "document.documentElement.scrollTop=1000"# 执行jsdriver.execute_script(js)time.sleep(2)# 滚动到顶部js = "document.documentElement.scrollTop=0"driver.execute_script(js) # 执行jstime.sleep(2)driver.close()
7.ChromeOptions
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理
options.add_argument("--headless") # 无头模式
options.add_argument("--lang=en-US") # 网页显示英语
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)driver.get("http://httpbin.org/ip")
8.验证滑块移动
"""
目标:滑动验证码
1.定位按钮
2.按住滑块
3.滑动按钮
"""
import time
from selenium import webdriverif __name__ == '__main__':chrome_obj = webdriver.Chrome()chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')# 1.定位滑动按钮click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')# 2.按住# 创建一个动作链对象,参数就是浏览器对象action_obj = webdriver.ActionChains(chrome_obj)# 点击并且按住,参数就是定位的按钮action_obj.click_and_hold(click_obj)# 得到它的宽高size_ = click_obj.sizewidth_ = 298 - size_['width'] # 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右)print(width_)# 3.定位滑动坐标action_obj.move_by_offset(298-width_, 0).perform()# 4.松开滑动action_obj.release()time.sleep(6)chrome_obj.quit()
9.打开多窗口和页面切换
有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到
from selenium import webdriverif __name__ == '__main__':driver = webdriver.Chrome()driver.get("https://www.baidu.com/")driver.implicitly_wait(2)driver.execute_script("window.open('https://www.douban.com/')")driver.switch_to.window(driver.window_handles[1])print(driver.page_source)
第二个实例
if __name__ == '__main__':from selenium import webdriverimport timedriver = webdriver.Chrome()start_url = 'https://www.baidu.com'start_url_1 = 'https://www.csdn.net'driver.get(start_url)time.sleep(5)"""通过执行js代码,打开浏览器窗口,访问地址"""js = 'window.open("{}")'.format(start_url_1)driver.execute_script(js)time.sleep(5)"""获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的"""win = driver.window_handles# 执行切换driver.switch_to.window(win[0])time.sleep(2)driver.switch_to.window(win[1])time.sleep(2)driver.switch_to.window(win[0])time.sleep(2)driver.switch_to.window(win[1])# 浏览器窗口的关闭driver.close()# 退出浏览器driver.quit()
有时候网页会内嵌另一个html。一般称为iframe
from selenium import webdriver
driver = webdriver.Chrome()
start_url = 'https://mail.163.com/'
driver.get(start_url)
"""定位不成功,在有的情况是因为有页面的嵌套导致的
在一个html源码中有多个html页面,示例:一个html嵌套一个html
以上:又称之为iframe的嵌套
"""
# 定位嵌套位置iframe
el_iframe = driver.find_elements_by_tag_name('iframe')
# 执行iframe的切换
driver.switch_to.frame(el_iframe[0])
# 标签定位
driver.find_element_by_name('email').send_keys('邮箱账号')
driver.find_element_by_name('password').send_keys('你的邮箱密码')
driver.find_element_by_id('dologin').click()
10.Cookie操作
# 1.获取所有的cookie:
for cookie in driver.get_cookies():print(cookie)
# 2.根据cookie的key获取value:
value = driver.get_cookie(key)
# 3.删除所有的cookie:
driver.delete_all_cookies()
# 4.删除某个cookie:
driver.delete_cookie(key)
# 添加cookie:
driver.add_cookie({"name":"password","value":"111111"})
11.模拟登录
这里模拟登录我们学校教务处。
from selenium.webdriver import Chromeif __name__ == '__main__':web = Chrome()web.get('http://bkjx.wust.edu.cn/')username = web.find_element_by_id('userAccount')username.send_keys('xxxxxxx') # 这里填自己的学号password = web.find_element_by_id('userPassword')password.send_keys('xxxxxxx') # 这里填自己的密码btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')btn.click()# do something
因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。
12.使用代理
from selenium import webdriver
import timeoptions = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://ip地址') # 代理IP:端口号
# ${chromedriver_path}: chromedriver驱动存放路径
driver = webdriver.Chrome(options=options)
driver.get("https://dev.kdlapi.com/testproxy")# 获取页面内容
print(driver.page_source)# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
driver.close()
14.更换UA
from selenium import webdriver
import timeagent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=' + agent)
# ${chromedriver_path}: chromedriver驱动存放路径
driver = webdriver.Chrome(options=options)
driver.get("https://www.baidu.com")# 获取页面内容
print(driver.page_source)# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
15.鼠标悬停
if __name__ == '__main__':from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()import timestart_url = 'https://lceda.cn/'driver.get(start_url)# 定位到需要悬停的标签move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')# //*[@id="headerNav"]/li[1]/a/span# 悬停之后需要点击的标签a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')# //*[@id="headerNav"]/li[1]/div/a[2]# /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]# 悬停点击执行# 创建事件对象actions = ActionChains(driver)time.sleep(1)# 记录操作actions.move_to_element(move)time.sleep(1.5)# 悬停的点击actions.click(a)time.sleep(1)# 开始执行事件actions.perform()
16.优缺点
selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。
Python之Selenium自动化爬虫相关推荐
- 【selenium爬虫】用selenium自动化爬虫爬取海贼王动漫图片
以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/art ...
- python语言+selenium自动化,编写脚本调用Chrome、Firefox浏览器打开百度网站
python语言+selenium自动化,编写脚本调用Chrome.Firefox浏览器打开百度网站 目标:初始化一个webdriver实例对象driver,通过webdriver.Chrome()和 ...
- Python项目实例——selenium自动化项目升级版——定时操作
低端版:Python的selenium自动化项目实例 升级版加入指定时间段操作功能,例如程序在在上午8:30 到 11:30 下午14:00 到 17:00 晚上19:00 到 晚上 22:00运行 ...
- 用python的selenium写爬虫通过绝对坐标点击元素
用python的selenium写爬虫通过绝对坐标点击,坐标的获取方法 注: 适用于谷歌浏览器浏览器: 其中css选择器为目标区域的css表达式: 网页F12打开源代码,在console窗口输入 # ...
- python脚本——selenium自动化执行一些网页上的操作
文章目录 一.说明 二.代码 三.用法总结 一.说明 通过python的selenium模块,自动化执行一些网页上的重复的无聊的工作. 二.代码 #! /usr/bin/python3.6 from ...
- Python之Selenium的爬虫用法
Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手).也就是说 Sel ...
- 【Python】selenium自动化打卡
目录 一.主要功能的实现 二.功能实现所使用的模块 三. 具体实现内容 1.登录并跳转到上报页面 2.打开开发者工具并设置edge浏览器传感器 3.刷新后点击上报 4.通过SMTP向邮箱发送执行情况 ...
- 关于python UI Selenium自动化的一个浏览器driver重复调用问题
最开始也是和大多数一样先写个方法去定义一个驱动每次都要传入一个driver对象 class PageObject(object): def __init__(self, driver): ...
- selenium 自动化爬虫 5分钟爬取新浪李敖大师1751条微博.
selenium 是一个浏览器自动化测试框架.可以模拟用户的所有操作. 很久以前就想把李敖大师的所有微博爬取下来.一直没空,前天看见群里有人推荐selenium和phantomjs 就学了seleni ...
最新文章
- R数据可视化 火山图
- python的列表的remove()方法、判断if xxx in xx条件比较耗时问题
- 位运算符实现加法和乘法
- 怎么证明会python_如何在python中验证SSL证书?
- 拆解 Linux 网络包发送过程
- 飞机游戏项目完整代码(详解JAVA300集)
- ssl1341-Asteroids【最大匹配,最小点覆盖,图论】
- python标准库 对socket二次封装_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服...
- android studio生成jks,Android Studio生成keystore签名文件步骤讲解
- 只有搞Java开发的才知道!javaspring菜鸟教程
- UltraEdit注册机 及使用方法详解
- 深度学习入门学习路线及好课推荐
- 常量与十六进制数0x7f或0x3f做(与)运算含义
- photoshop 抠图
- Ubuntu 20.04 多GPU,涡轮GPU 风扇转速手动调节
- tensorflow实现非线性拟合
- 建立大数据分析能力需四大要素
- Notepad++安装--16进制插件HexEditor
- (附源码)PHP华立学院门户网站 毕业设计 290011
- 系统试运行报告是谁写的_煤矿安全监控系统升级改造验收方案