爬虫之Selenium,Phantomjs,Chrome handless

news2024/9/25 19:15:55

爬虫之模拟浏览器

  • 前言
    • 1. Selenium
      • 1.1 Selenium介绍
      • 1.2 安装selenium
      • 1.3 Selenium访问京东
      • 1.4 Selenium元素定位
      • 1.5 seleniu访问元素信息
      • 1.6 selenium交互
    • 2. Phantomjs
      • 2.1 介绍Phantomjs
      • 2.1 使用Phantomjs
    • 3. Chrome handless
      • 3.1 Chrome handless的系统要求
      • 3.2 Chrome handless的作用
      • 3.1 Chrome handless的使用


前言

对于有些网站,如果你访问,它会检查你的浏览器内核,如果发现你是程序,它会禁止你访问,当然程序也是可以模拟浏览器的,具体方法如下所示:


1. Selenium

1.1 Selenium介绍

  1. Selenium是一个用于Web应用程序测试的工具。
  2. Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
  3. 支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动 真实浏览器完成测试
  4. selenium也是支持无界面浏览器操作的。

之所以使用selenium是因为,有些网页发现是程序在进行访问,有些数据不会返回,使用selenium就可以 模拟浏览器功能,自动执行网页中的js代码,实现动态加载 ,(有检查浏览器反爬,就使用selenium,否则使用urllib)

1.2 安装selenium

  1. 安装浏览器驱动

    操作谷歌浏览器驱动下载地址 http://chromedriver.storage.googleapis.com/index.html ,要下载和自己谷歌浏览器版本相同的浏览器驱动,具体的查看方法如下所示:

在这里插入图片描述

下载完后把下载的东西放到你的代码区域

在这里插入图片描述

然后在终端输入:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/,或者你直接安装selenium包

1.3 Selenium访问京东

import urllib.request

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

response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))

在这里插入图片描述

如上所示,直接访问京东html网页,只是打印了一部分的网页数据,下面使用
Selenium访问京东(模仿浏览器直接访问京东):

  1. 导入selenium

  2. 创建浏览器操作对象(path就是浏览器驱动路径)

  3. get(url)访问网站,page_source获取网页源码

    from selenium import webdriver
    
    url = 'https://www.jd.com'
    
    path = 'chromedriver.exe'
    browser = webdriver.Chrome(path)
    
    browser.get(url)
    print(browser.page_source)
    
    # CTRL + F:进行查找
    

1.4 Selenium元素定位

现在webdriver这个模块只有两个函数 find_elements和 find_element,要想使用如下6个函数,必须进行修改,具体修改方案如下:

webdriver模块修改

  1. find_elements_by_tag_name() :根据标签名字获取对象

  2. find_elements_by_name() :根据标签属性属性值获取element

  3. find_elements_by_id():根据id获取element

  4. find_elements_by_xpath() :根据xpath语法获取element

  5. find_elements_by_css_selector () :根据bs4的语法获取element

  6. find_elements_by_link_text() :根据链接文本获取数据

    如上获取的element都是列表,当如上elements变成element,就说明获取的是单个对象,如下以获取百度一下为案例:

在这里插入图片描述

	    from selenium.webdriver.chrome.service import Service
	    from selenium import webdriver
	    
	    path = Service('chromedriver.exe')
	    browser = webdriver.Chrome(service=path)
	    
	    url = 'https://www.baidu.com'
	    browser.get(url)
	    
	    
	    button = browser.find_elements('id', 'su')
	    print(button)
	    
	    button = browser.find_elements('xpath', '//input[@id="su"]')
	    print(button)

改版后的 find_elements和 find_element的第一个参数就是如上的6个方法除了find_elements_by_后的值,第二个参数就是如上6个方法的参数,注意tag_name要改为tag name

1.5 seleniu访问元素信息

  • tag_name:标签名称
  • text:标签包含的内容
  • get_attrbute(属性):属性值
from selenium.webdriver.chrome.webdriver import Service
from selenium import webdriver

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

path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
element = browser.find_element('id', 'su')
print(element.tag_name)
print(element.get_attribute('id'))
a = browser.find_element('link text', '新闻')
print(a.text)

1.6 selenium交互

selenium交互就是用代码实现人为操作,比如我想进行如下操作:

  1. 首先在百度输入框输入周杰伦,然后点击百度一下
  2. 然后向下滑动到底部
  3. 点击下一页
  4. 上一步,下一步,退出

使用的具体函数如下所示;

  • element.send_keys(value): 输入
  • element.click(): 点击
  • browser.execute_script(): 模拟JS滚动
  • browser.back():上一页
  • browser.forward():下一页
  • browser.quit():退出
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep


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

path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
sleep(2)
input = browser.find_element('id', 'kw')
input.send_keys('周杰伦')
sleep(2)
button = browser.find_element('id', 'su')
button.click()
sleep(2)

# 滑到底部
js_bottom = 'document.documentElement.scrollTop=100000'
browser.execute_script(js_bottom)
sleep(2)

next = browser.find_element('xpath', '//a[@class="n"]')
next.click()
sleep(2)

browser.back()
sleep(2)

browser.forward()
sleep(2)

browser.quit()

2. Phantomjs

之所以使用Phantomjs,是因为selenium进行css和gui渲染非常慢,所以才会使用Phantomjs,由于不进行css和gui渲染,Phantomjs运行效率要比真实的浏览器要快很多(selenium展示界面,Phantomjs不展示界面,但是运行结果一致),Phantomjs已经被淘汰了,已经不在使用了

2.1 介绍Phantomjs

  1. Phantomjs是一个 无界面的浏览器
  2. 支持页面元素查找,js的执行等
  3. 由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多

2.1 使用Phantomjs

使用Phantomjs的第一步还是下载Phantomjs的浏览器驱动,并放在你写代码的文件夹中

  1. 获取PhantomJS.exe文件路径path

  2. browser = webdriver.PhantomJS(path)

  3. browser.get(url)

    from selenium import webdriver
    
    path = 'phantomjs.exe'
    
    browser = webdriver.PhantomJS(path)
    
    
    url = 'https://www.baidu.com'
    browser.get(url)
    
    browser.save_screenshot('baidu.png')
    
    import time
    time.sleep(2)
    
    input = browser.find_element_by_id('kw')
    input.send_keys('昆凌')
    
    time.sleep(3)
    
    browser.save_screenshot('kunling.png')
    
    

3. Chrome handless

Chrome-headless 模式, Google 针对 Chrome 浏览器 59版 新增加的一种模式,可以让你不打开UI界面的情况下 使用 Chrome 浏览器,所以运行效果与 Chrome 保持完美一致。

3.1 Chrome handless的系统要求

1、Chrome 版本要求
    Unix/Linux 系统要求 chrome >= 59
    Windows 系统需要 chrome >= 60
2、Python 版本 >= 3.6
3、Selenium 版本 >= 3.4
4、ChromeDriver 版本 >= 2.31

3.2 Chrome handless的作用

from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep


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

# 如下两句代码就是创建浏览器对象
path = Service('chromedriver.exe')
browser = webdriver.Chrome(service=path)

browser.get(url)
sleep(2)

运行如上的代码,我们会发现有一个百度的界面展示出来,这样运行的界面需要加载css,js等,但是我们只要dom元素,不需要显示界面,这就是Chrome handless的作用,通俗来说Chrome handless就是改变path = Service('chromedriver.exe') browser = webdriver.Chrome(service=path)这两句代码,不让浏览器加载css,js等,提高访问速度

3.1 Chrome handless的使用

# 导入 selenium
from selenium import webdriver
# 如果需要指定路径,但是路径在新版本中被重构到 Service 函数中了
from selenium.webdriver.chrome.service import Service
# 配置对象
from selenium.webdriver.chrome.options import Options
# 导入 定时器
from time import sleep


# 浏览器封装,
def share_browser():
    path = 'chromedriver'  # 浏览器驱动路径(可以是下载的驱动,也可以直接使用电脑上 Chrome 浏览器的驱动,找到路径就行)
    options = Options()  # 配置对象
    # options.add_experimental_option('detach', True) # 不自动关闭浏览器
    # 如下两句是模式设置
    options.add_argument('--headless')  # 设置无窗口模式
    options.add_argument('--disable-gpu')  # 禁用gpu加速

    # 创建浏览器
    service = Service(path)
    browser = webdriver.Chrome(service=service, options=options)
    return browser


# 创建浏览器,就这个函数和selenium创建的浏览器不同,其余的
browser = share_browser()

# 打开指定网址
browser.get('https://www.baidu.com')

# 拍摄图片
browser.save_screenshot('baidu.png')  

# 睡眠
sleep(2)

# 退出
browser.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 E18-D80NK红外检测

本文代码使用 HAL 库。 文章目录前言一、E18-D80NK 红外传感器:1. E18-D80NK 的介绍2. 电器特性二、红外检测小实验代码讲解三、实验现象总结前言 这篇文章介绍 如何使用 STM32 控制 E18-D80NK 进行红外检测。 一、E18-D80NK 红外传感器: 1. E18-D80N…

Qt学习笔记-Qt程序中的调试日志

Qt学习笔记-Qt程序中的调试日志环境说明Qt程序中调试日志使用案例对于一门好的编程语言或者开发框架来说,便捷的调试日志功能是必不可少的。QT作为一个跨平台的开发工具,内置了便捷的调试日志功能,本文就对其做一个简介。环境说明 操作系统&…

测试好工具fiddler,手机抓包,查看手机app请求了哪些接口

领导让我接收一个项目,但是这个项目是安卓的,安卓我一窍不通,我们只做过web页面的。身为一个大数据程序员,要接手同事的项目,给我了代码,但是我完全不知道,这个代码对应,安卓机里面的…

Serverless 时代开启,云计算进入业务创新主战场

作者:于洪涛 “我们希望让用户做得更少而收获更多,通过 Serverless 化,让企业使用云服务像用电一样简单。” Serverless 化正在成为全新的软件研发范式,阿里云将坚定推进核心产品全面 Serverless 化,帮助客户更好的实现…

Jetpack Compose 深入探索系列五:State Snapshot System

Jetpack Compose 有一种特殊的方式来表示状态和传播状态变化,从而驱动最终的响应式体验:状态快照系统(State snapshot system)。这种响应式模型使我们的代码更加强大和简洁,因为它允许组件根据它们的输入自动重组&…

Zookeeper3.5.7版本——Zookeeper的概述、工作机制、特点、数据结构及应用场景

目录一、Zookeeper的概述二、Zookeeper的工作机制三、Zookeeper的特点四、Zookeeper的数据结构五、Zookeeper的应用场景5.1、统一命名服务5.2、统一配置管理5.3、统一集群管理5.4、服务器动态上下线5.5、软负载均衡一、Zookeeper的概述 Zookeeper 是一个开源的分布式的&#x…

飞桨全量支持业内AI科学计算工具——DeepXDE!

AI技术在跨学科融合创新方面扮演着日益重要的角色,特别是在Al for Science领域,AI技术的发展为跨学科、跨领域的融合创新带来了巨大的机会。AI已成为一个关键的研究工具,改变了基础科学的研究范式。依托AI技术开发的科学计算工具,…

【教学类-07-06】20230302《破译电话号码-图形篇(图形固定列不重复)》(两款输入版)

效果展示1、适合中班默写学号——有姓名 有班级,无学号,适合中班幼儿2、适合大班幼儿默写名字——有学号,有班级,无姓名,适合初学者描字(小班、中班、大班)——名字、学号、班级都有&#xff08…

Java面试总结(三)

类加载的流程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。 如果想要详细了解类加载的过程,可以参考我…

【同步工具类:CyclicBarrier】

同步工具类:CyclicBarrier介绍源码分析CyclicBarrier 基于ReetrantLock Condition实现。构造函数await() 函数业务场景方案一:代码实现测试截图方案二代码实现测试打印总结介绍 官方介绍: 一种同步辅助工具,允许一组线程都等待对方到达共同的障碍点。CyclicBarrie…

完全彻底卸载Oracle

一、停止使用Oracle的服务停用oracle服务,进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止。二、打开Universal Installer工具运行卸载Oracle数据库程序(1)、一般情况运行Oracle自带的卸载…

代谢组学:Microbiome又一篇!绘制重症先天性心脏病新生儿肠道微生态全景图谱

文章标题:Mapping the early life gut microbiome in neonates with critical congenital heart disease: multiomics insights and implications for host metabolic and immunological health 发表期刊:Microbiome 影响因子:16.837…

热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

酒事有鲤(济南)品牌管理有限公司是一家致力于将世界顶级精酿啤酒技术和理念与“ 在地”文化有机融合,做世界认 可的多元化好啤酒,通过精致 舒适的家门口酒馆,让啤酒的 世界观更为完整。 中国生物发酵产业协会联合齐鲁…

Gitlab普通用户转管理员

GitLab是常用的分部式代码库版本开源软件,默认系统中只有一个管理员。在工作中,如果有多个项目,则需要多个管理员分别管理各个的代码仓库,需要把多个普通用户配置成管理员,在Gitlab页面上,不能直接通过操作…

【编程基础之Python】7、Python基本数据类型

【编程基础之Python】7、Python基本数据类型Python基本数据类型整数(int)基本的四则运算位运算比较运算运算优先级浮点数(float)布尔值(bool)字符串(str)Python数据类型变换隐式类型…

tensorflow2.4--2.回归问题分析

文章目录前言流程案例操作前言 流程 回归问题预测连续值,在某个区间内变动. 常见的线性回归问题模型是yaxb,然而现实世界由于大量的数据偏差以及复杂度,同时还有大量的噪声,往往达不到如此的精确解,实际解决问题时需要考虑噪声的存在 对于噪声,往往我们已经假设了它符合高斯…

springboot内嵌Tomcat 安全漏洞修复

漏洞扫描提示的是tomcat-embed-core[CVE-2020-1938]&#xff0c;解决方式是升级tomcat的版本。 该漏洞影响的版本&#xff1a; Apache Tomcat 9.x < 9.0.31 Apache Tomcat 8.x < 8.5.51 Apache Tomcat 7.x < 7.0.100 Apache Tomcat 6.x 其余的安全漏洞也可以通过…

hometown-h5-template 一个开箱即用的前端H5解决方案 【无标题】

前言 大家好&#xff0c;我是 HoMeTown&#xff0c;最近不很忙&#xff0c;整理一套架子出来&#xff0c;有兴趣朋友可以看看&#xff0c;我自己已经投入生产使用了&#xff0c;大家看个人情况&#xff0c;选择性使用 GitHub仓库。 ✨ hometown-h5-template &#x1f4a5; 轻…

JavaSE21-集合1-set

文章目录一、集合概念二、set集合1、set集合的特点2、HashSet2.1 特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 foreach遍历2.4.2 使用迭代器遍历2.4.3 转换为数组遍历一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说&#xff0c;集合的长度可变会…

速度计算-课后程序(JAVA基础案例教程-黑马程序员编著-第十二章-课后作业)

【案例12-2】&#xff1a;速度计算 【案例介绍】 1.案例描述 本案例要求使用反射技术编写一个速度计算程序&#xff0c;计算某种交通工具的行驶速度。现有两种工具&#xff1a;Bike和 Plane&#xff0c;其中Bike的速度运算公式为&#xff1a;A*B/C&#xff0c;Plane的速度运…