Day:006(1) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium介绍与安装

        Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

        Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

        Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

PyPI网站下载 Selenium库https://pypi.org/simple/selenium/,也可以用 第三方管理器

Selenium 官方参考文档:https://selenium-python.readthedocs.io/index.html 

安装

pip install selenium

安装Firefox geckodriver 

安装firefox最新版本,添加Firefox可执行程序到系统环境变量。记得关闭firefox的自动更新

firefox下载地下:https://github.com/mozilla/geckodriver/releases

将下载的geckodriver.exe 放到path路径下 D:\Python\python_version\

安装ChromeDriver

http://chromedriver.storage.googleapis.com/index.html

注意
版本号要对应

下载下来的文件解压到 python_version\Scripts 

测试代码

# 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver =webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()

selenium 控制浏览器

最大化窗口

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。

browser = webdriver.Chrome()

url= 'http://www.baidu.com'
browser.get(url)

borwser.maximize_window()
 设置宽与高

最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。

browser = webdriver.Chrome()

url= 'http://www.baidu.com'
browser.get(url)

borwser.set_window_size(500,600)
 浏览器前进、后退

浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于做web自动化测试的同学来说应该算是一个比较难模拟的问题
其实很简单,下面看看python的实现方式

browser = webdriver.Chrome()#访问百度首页
first_url= 'http://www.baidu.com
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url='http://news.baidu.com
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "backto %s "%(first_url)
browser.back()
time.sleep(1)#前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()

selenium元素定位

对象的定位应该是自动化的核心,要想操作一个对象,首先应该识别这个对象。

一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、6门牌找到这个人。

对象定位

webdriver提供了对象定位方法

  • find_element(type,value)
  • find_elements(type,value)
利用 By 类来确定哪种选择方式 
from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value='su')

By 类的一些属性如下 :

  • ID = "id"
  • NAME = "name"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"
操作元素 

前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。

鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。

一般来说,webdriver中比较常用的操作对象的方法有下面几个:

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象的内容,如果可以的话
from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import By

def test_element():
    # 创建驱动对象
    s =
Service(executable_path='./chromedriver.exe'
)
    # 创建一个浏览器
    driver = webdriver.Chrome(service=s)
    # 打个百度
    driver.get('https://cn.bing.com/')
    sleep(2)
    # 获取 搜索框,并输出“百战”
  
driver.find_element(By.ID,'sb_form_q').send
_keys('百战')
    sleep(1)
    # 获取 搜索按钮,并点击
  
driver.find_element(By.ID,'search_icon').cl
ick()
if __name__ =='__main__':
    test_element()

selenium定位下拉菜单

包含下拉菜单页面

<html>
    <head>
        <meta http-equiv="content-type"
content="text/html;charset=utf-8" />
        <title>Level Locate</title>    
  <script type="text/javascript"
src="https://cdn.jsdelivr.net/npm/jquery@1.1
2.4/dist/jquery.min.js"></script>
        <link
href="https://cdn.jsdelivr.net/npm/@bootcss/
v3.bootcss.com@1.0.9/dist/css/bootstrap.min.
css" rel="stylesheet" />        
    </head>
    <body>
        <h3>Level locate</h3>
        <div class="span3 col-md-3">        
            <div class="well">
                <div class="dropdown">
                    <a class="dropdowntoggle" data-toggle="dropdown"href="#">Link1</a>
                    <ul class="dropdownmenu" role="menu" aria-labelledby="dLabel"
id="dropdown1" >
                        <li><a tabindex="-1"
href="http://www.bjsxt.com">Action</a></li>
                        <li><a tabindex="-1"
href="#">Another action</a></li>
                        <li><a tabindex="-1"
href="#">Something else here</a></li>
                        <li class="divider">
</li>
                        <li><a tabindex="-1"
href="#">Separated link</a></li>
                    </ul>
                </div>                
            </div> 
 </div>
        <div class="span3 col-md-3">        
            <div class="well">
                <div class="dropdown">
                    <a class="dropdowntoggle" data-toggle="dropdown"
href="#">Link2</a>
                    <ul class="dropdownmenu" role="menu" aria-labelledby="dLabel" >
                        <li><a tabindex="-1"
href="#">Action</a></li>
                        <li><a tabindex="-1"
href="#">Another action</a></li>
                        <li><a tabindex="-1"
href="#">Something else here</a></li>
                        <li class="divider">
</li>
                        <li><a tabindex="-1"
href="#">Separated link</a></li>
                    </ul>
                </div>                
            </div>            
        </div>
    </body>
    <scriptsrc="https://cdn.jsdelivr.net/npm/@bootcss/v3.bootcss.com@1.0.9/dist/js/bootstrap.min.js">
</script>
</html>
from selenium import webdriver
11from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleep

def test_down_menu():
    # 创建一个驱动
    s = Service(executable_path='./chromedriver.exe')
    # 创建浏览器
    driver = webdriver.Chrome(service=s)
    # 设置方位的文件地址
    file_path ='file:///'+os.path.abspath('./html/test01.html')
    # 访问页面
    driver.get(file_path)
    # 定位父级元素
  
driver.find_element(By.LINK_TEXT,'Link1').click()
    # 找到要移动的位置
    menu =
driver.find_element(By.LINK_TEXT,'Action')
    # 做一个移动光标的动作
    # 定义一个动作在driver移动到     menu的位置     执行动作
  #webdriver.ActionChains(driver).move_to_element(menu).perform()
    # sleep(2)
    # 定位子级元素
    menu.click()
    # 睡眠2秒
    sleep(2)
    # 关闭浏览器
    driver.quit()
if __name__ == '__main__':
    test_down_menu()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Office LTSC 2021企业办公新标杆,稳定高效助力业务发展

Microsoft Office LTSC 2021包含Word、Excel、PowerPoint等常用组件&#xff0c;支持实时共享和智能转换功能&#xff0c;允许多个用户同时编辑文档&#xff0c;提高了团队协作效率。还加强了安全性和隐私保护&#xff0c;通过加密协议和安全验证等方法&#xff0c;有效防止了恶…

MySQL一些特殊功能的索引(6/16)

特殊功能性索引 B-Tree索引&#xff1a; InnoDB的默认索引类型&#xff0c;适用于多种查询操作。 可以用于等值查询、范围查询和索引列的组合查询。 创建B-Tree索引的示例&#xff1a; CREATE INDEX index_name ON table_name (column1, column2);全文索引&#xff08;FULLTEX…

如何将PHP的Webman框架打包成二进制文件运行

看了看webman的官方文档&#xff0c;发现居然还能打包为二进制&#xff0c;这样太厉害了吧&#xff01; 先执行这个 composer require webman/console ^1.2.24 安装这个console的包&#xff0c;然后 执行 php webman build:bin 8.1 结果谁想到它报错提示&#xff1a; 好…

Microsoft Maia

这把写一个更冷门的,受限于鄙人工作的原因,我可能得当一回谜语人,在不违规的情况下,尽量给大家解密Maia的一些特性(这种我写起来,就很难受...) 是的就是这个芯片,Asic The Maia 100 is the first in a series of Maia accelerators for AI, the company said. With 105…

【鹅厂摸鱼日记(二)】(生活篇)初到深圳的人情冷暖

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多知识   &#x1f51d;&#x1f51d; 摸鱼日记 1. 前言2. 鹅厂的人文关怀…

缓存策略以及如何选择正确的策略

正确地使用缓存可以减少系统响应的时间&#xff0c;降低数据库负载&#xff0c;反之可能带来相反的效果。因此&#xff0c;就必须了解有哪些缓存策略&#xff0c;以及如何根据实际使用场景选择合适的缓存策略。 缓存策略取决于数据和数据访问模式&#xff0c;即&#xff0c;数…

ubuntu配置网关-虚拟服务器修改配置文件修改IP

ubuntu配置网关-修改ip - jason47 - 博客园 (cnblogs.com) 修改netplan的文件 sudo vim /etc/netplan/01-network-manager-all.ymal 20.04版本 1. 查询当前使用的网卡 使用的是ens160 2. 修改配置&#xff0c;进入/etc/netplan 找到ens160的配置是在99-netcfg-vmware.yaml文…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点…

使用Pandas解决问题:对比两列数据取最大值的五种方法

目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结&#xff1a; 在数据处理和分析中&#xff0c;经常需要比较两个或多个列的值&#xff0c;并取其中的最大值。Pandas库作为Python…

Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制

Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting Pixel-GS&#xff1a;用于3D高斯溅射的具有像素感知梯度的密度控制 Zheng Zhang  Wenbo Hu†  Yixing Lao   老宜兴市郑张文博胡 † Tong He  Hengshuang Zhao† 赵同和恒双 †1122113311 …

车机手机互联不同屏幕尺寸大小解决方案成果展示

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;上一篇文章分享了一个云手机车机互联实现的简单demo&#xff0c;文章链接如下&#xff1a; https://mp.weixin.qq.com/s/lihQHSd-zBIPeVa0WiP1pg 这个主要实现是同一个屏幕大小尺寸的投屏情况&#xff0c;即和车…

Three.js在3D可视化领域大展拳脚,不接受反驳。

three.js在3D可视化领域中起到了重要的作用。它是一个基于JavaScript的轻量级、跨平台的3D图形库&#xff0c;提供了丰富的功能和工具&#xff0c;用于创建和展示各种3D场景、动画和效果。 以下是three.js在3D可视化领域的主要作用&#xff1a; 创建交互式的3D场景&#xff1a…

项目从 Mysql切换 PostgreSQL 改造及踩坑记录

0、前言 原项目框架 SpringBoot MybatisPlus Mysql 1、切换流程 1.1、项目引入postgresql驱动包 由于我们要连接新的数据库&#xff0c;理所当然的要引入该数据库的驱动包&#xff0c;这与mysql驱动包类似 <dependency><groupId>org.postgresql</groupId…

Ubuntu Desktop:创建桌面启动图标

Ubuntu Desktop&#xff1a;创建桌面启动图标 在Ubuntu Desktop上创建桌面启动图标是一个相对简单的过程&#xff0c;可以帮助用户快速访问他们最常用的应用程序。本文旨在指导你完成创建一个桌面启动图标的步骤&#xff0c;从而使你能够轻松启动你的应用程序。 为什么创建桌…

String类(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

Java-接口—知识(基础)

承接上一节&#xff0c;我们讨论了抽象类和抽象方法。 那我们尝试在抽象的道路上走的更远一点&#xff0c;先来总结一下抽象&#xff1b; 抽象类&#xff1a;类中的属性规范了子类必须有什么样的特征&#xff0c;有什么状态。类中的方法规范了子类必须有什么行为&#xff0c;…

【Linux】进程间通信——匿名管道|命名管道

目录 什么是进程间通信 管道 匿名管道 什么是进程间通信 进程间通信&#xff0c;顾名思义就是两个进程互相通信。 可是进程是独立的&#xff0c;该如何通信呢&#xff1f; 类比你和你的朋友在网上聊天&#xff0c;你们两个人也是独立的&#xff0c;是如何通信的呢&#xf…

C#学习笔记10:winform上位机与西门子PLC网口通信_中篇_winform的窗口操作设计、日志的添加使用

今日继续我的C#winform上位机学习之路 这系列笔记的目标是尝试编写一个能够与西门子PLC进行以太网口通信的上位机软件。 文章提供完整代码解释、设计点解释、测试效果图、完整工程下载 本章主要学习&#xff1a;Winform多个窗体的一些操作 、无边框窗体的创建、Combox组件插…

Linux:文本编辑器 - vim

Linux&#xff1a;文本编辑器 - vim vim基本操作普通模式模式切换移动光标复制粘贴删除替换撤销 底行模式行号查找 vim基本操作 Vim(Vi Improved)是一款功能强大的文本编辑器&#xff0c;是Unix/Linux系统中广泛使用的编辑器之一。它源于上世纪70年代开发的Vi编辑器&#xff0…

Understanding Diffusion Models: A Unified Perspective翻译和公式补充解读

“Understanding Diffusion Models: A Unified Perspective”是一篇写的非常好的扩散模型DDPM数学原理解读文章&#xff0c;这里翻译了一遍&#xff0c;对于一些细节补充记录一下&#xff0c;方便对照原文更好的理解。 这篇文章作者是Calvin Luo&#xff0c;来自Google Resear…