python爬虫---selenium库的用法

news/2024/7/19 11:08:05 标签: 爬虫, 测试, python

selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器

爬虫中的应用主要是用来解决JS渲染的问题。

 

1.使用前需要安装这个第三方库,CMD下:

pip install selenium

2.为你的测试浏览器下载驱动,我用的是Chrome,对应的去百度一下Chrome webdrive下载,并解压到python安装目录scripts下。

 

开始使用

from selenium import webdrive

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

运行代码就会弹出一个Chrome浏览器,并执行了一个get请求到达了百度。

如果是像微博这样的页面经过大量JS代码渲染过的,仅仅使用requests来打印页面源码,看到的时很简单的html和少量JS代码,这就获取不了我们需要的内容

所以,selenium解决了这个问题,通过模拟浏览器的访问,实现了页面源码的完整打印

from selenium import webdrive

browser = webdrive.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.page_source)
browser.close() #源码打印后,可以选择自动关闭或者手动关闭

这样的话,页面完全加载后,源码全部打印。

 

 

 

元素查找

单个元素查找

查找方法有以下七种:

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

 

以淘宝作为示例,下面是淘宝输入框的html代码

<input id="q" name="q" aria-label="请输入搜索文字" accesskey="s" autofocus="autofocus" autocomplete="off" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">

其中id为q

使用三种方式进行查找

from selenium import webdriver


browser = webdriver.Chrome()
browser.get('http://www.taobao.com') input_first
= browser.find_element_by_id('q') input_sec = browser.find_element_by_css_selector('#q') #在进行css选择时,class以#代替 input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first, input_sec, input_third)

 输出信息:可以看到三者的element值全部相同

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

 

另一种查找方式:

这种查找方式无非就是将查找方式作为参数传入,相比还是上一种更简洁

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input_fir = browser.find_element(By.ID, 'q')
input_sec = browser.find_element(By.CSS_SELECTOR, '#q')
input_thi = browser.find_element(By.XPATH, '//*[@id="q"]')
print(input_fir, input_sec, input_thi)

输出:三者的element值还是相同的

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

 

多元素查找

find_elements_by_xxx,find_elements(By.xxxxx)

淘宝元素查找示例,服务导航条的html代码如下

<ul class="service-bd" role="menubar">
<li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="101" class="J_Cat a-all">

 

查找service-bd下级的li标签

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
a = browser.find_elements_by_css_selector('.service-bd li')
# b = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')  #第二种的参数传入查找方式

print(a)

结果:li标签的值仍然是相同的,多元素查找时,返回的时list集合

[<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-1")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-2")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-3")>,

.......]

 

 

元素交互操作

由网页get--->>>元素查找---->>>键值插入及删除--->>>点击事件

以下代码实现的过程是:到达淘宝--->>>查找输入框id为q的元素--->>>键入值---等待---重新键入值-----提交按钮元素查找---点击

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(2)
input.clear()
input.send_keys('gigabyte')
button = browser.find_element_by_class_name('btn-search')
button.click()
print(browser.current_url)  # 打印当前页面的url

 

 

执行JS语句

from selenium import webdriver

#执行js语句:实现一个网页下拉动作
browser = webdriver.Chrome()
browser.get('http://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("succ")')

 

前进与后退操作

>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get('http://www.baidu.com')
>>> driver.get('http://www.sina.com')
>>> driver.back()
>>> driver.forward()

 

标签页的增加

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.zhihu.com/explore')
driver.execute_script('window.open()')
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[0])
driver.get('http://www.taobao.com')
driver.switch_to.window(driver.window_handles[1])
driver.get('http://m.weibo.com')
driver.close()

今天博客园抽风了,截图上传不了...

我用selenium做了模拟登陆百度,不过验证码需要自己手打

验证码问题的解决需要依赖PIL库,我还没学习过。。

from selenium import webdriver
import time

#声明浏览器对象
browser = webdriver.Chrome()
browser.get('https://passport.baidu.com/v2/?login&fr=old&login&tpl=mn')

username = browser.find_element_by_id('TANGRAM__PSP_3__userName')
username.send_keys('account')

password = browser.find_element_by_id('TANGRAM__PSP_3__password')
password.send_keys('passwd')
time.sleep(5)


button = browser.find_element_by_id('TANGRAM__PSP_3__submit')
button.click()

# sendcode = browser.find_element_by_class_name('forceverify-button forceverify-button-send')
# sendcode.click()
# 
# time.sleep(10)
# 
# finalogin = browser.find_element_by_id('TANGRAM__28__button_submit')
# finalogin.click()

 如果不需要显示的调用浏览器,可以使用第三方浏览器:PhantomJS

phantomjs介绍

     (1)一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。

     (2)提供javascript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。

     (3)提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。

Windows下安装使用:

pip install PhantomJS

用法

from selenium import webdriver

browser = webdriver.PhantomJS()

只有声明浏览器对象时不同,其他用法全部相同

异常的捕获:

http://selenium-python.readthedocs.io/index.html


转载于:https://www.cnblogs.com/mzc1997/p/7814002.html


http://www.niftyadmin.cn/n/1534741.html

相关文章

计算机单位

容量的单位 TBGBMBKBBbit102410241024102410248 网络传输数据单位 TbitGbitMbitKBitbit10001000100010001000 假设为20M光纤速度为:20*1000*100020000000bit 然后传输速率为2.5MB CPU命令周期单位 HZ 每秒执行的次数 1GHZ1000MHZ 1MHZ1000KHZ 1KHZ1000HZ

CRF++使用小结(转)

1. 简述 最近要应用CRF模型&#xff0c;进行序列识别。选用了CRF工具包&#xff0c;具体来说是在VS2008的C#环境下&#xff0c;使用CRF的windows版本。本文总结一下了解到的和CRF工具包相关的信息。 参考资料是CRF的官方网站&#xff1a;CRF: Yet Another CRF toolkit&#xff…

【Python】【有趣的模块】【Requests】session cookie

保存http请求的状态&#xff08;请求的上下文&#xff09; 【区别&联系】 1. cookie保存在客户端的浏览器&#xff0c;比如标识是哪个请求者、购物车应用等 session保存在服务端&#xff0c;http连接时无则创建&#xff0c;有则用现有的 2. cookie是明文&#xff0c;相对不…

Linux与Windows间的编码

在 Debian Linux 中用 VirtualBox 虚拟了一个 Windows XP。但遗憾的是&#xff0c;Windows XP 的默认编码格式是 GBK&#xff0c;而我的 Linux 编码格式是 UTF-8。这就给两者的中文操作形成困扰。不过VIM编辑器可以很平滑地解决这个问题&#xff0c;具体做法是在Windows和Linux…

Logger.getLogger和 LogFactory.getLog

Logger.getLogger和 LogFactory.getLog Logger.getLogger LogFactory.getLogLogger来自log4j自己的包。如果用Logger.getLogger&#xff0c;需要一个log4j的jar包&#xff0c;用此方式你只能依靠log4j&#xff1a; 而LogFactory来自common-logging包。如果用LogFactory.getLog&…

1.Kubernetes入门

文章目录1.1.Kubernetes是什么1.2.为什么要用Kubernetes1.3.Kubernetes基本概念和术语1.3.1.Master1.3.2.Node1.3.3.Pod1.4.4.Label1.4.5.Replication Controller1.4.6.Deployment1.4.7.Horizontal Pod Autoscaler1.4.8.Statefulset1.4.9.Service1.4.10.Volume1.4.11.Persisten…

图解搜索引擎工作原理

做SEO的&#xff0c;如果不懂搜索引擎的工作原理是很难恰当开展工作的。前几天给学生讲SEO课程中的搜索引擎工作原理时&#xff0c;很多同学表示不太懂。后来我画了搜索引擎主要工作流程的示意图给大家&#xff0c;很多同学表示“懂了”。 我们先来看搜索引擎的主要工作&#x…

1、防火墙 Iptables Firewalld

文章目录1.防火墙的概念2.Iptables与Firewalld防火墙区别3.Iptables是什么?做什么用&#xff1f;1.防火墙的概念 防⽕墙说⽩了其实是⼀种隔离技术&#xff0c; 就是把从外⾯进来的访问&#xff08;进⼊操作系统或进下⼀个⽹络设备&#xff09;按照事先定义好的⼀套规则进⾏过滤…