首页 > 编程语言 >一篇文章带你了解Python之Selenium自动化爬虫

一篇文章带你了解Python之Selenium自动化爬虫

时间:2023-12-18 15:03:07浏览次数:31  
标签:__ webdriver web Python Selenium driver 爬虫 import selenium


Python之Selenium自动化爬虫


0.介绍

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。


1.安装

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple


2.下载浏览器驱动

这里用的谷歌浏览器

CNPM Binaries Mirror

查看自己的浏览器版本下载对应的驱动。

一篇文章带你了解Python之Selenium自动化爬虫_selenium

把解压后的驱动放在自己的python.exe 目录下。


3.实例

我之前写过3个实例

Python之Selenium自动化浏览器测试详解_python_脚本之家


4.开启无头模式

是否开启无头模式(即是否需要界面)

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = 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 Options
option = 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 Options
option = 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 time
if __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"
# 执行js
driver.execute_script(js)
time.sleep(2)
# 滚动到顶部
js = "document.documentElement.scrollTop=0"
driver.execute_script(js)  # 执行js
time.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 webdriver
if __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.size
width_ = 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 webdriver
if __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 webdriver
import time
driver = webdriver.Chrome()
start_url = 'https://www.baidu.com'
start_url_1 = ''
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 Chrome
if __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 time
options = 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 time
agent = '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 webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
import time
start_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由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

标签:__,webdriver,web,Python,Selenium,driver,爬虫,import,selenium
From: https://blog.51cto.com/u_15333581/8873883

相关文章

  • Python多线程应用于自动化测试操作示例
    本文实例讲述了Python多线程应用于自动化测试操作。分享给大家供大家参考,具体如下:多线程执行测试用例实例:importthreadingfromtimeimportsleep,ctimefromseleniumimportwebdriver#测试用例1deftest_baidu(browser,search):print("开始,现在时间是%s"%ctime())print("......
  • 在Python中进行自动化单元测试的教程
    一、软件测试大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施。正像软件熵(softwareentropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地......
  • 在Python中,你可以使用面向对象的方法来创建一个甘特图的模板。以下是一个使用`matplot
    在Python中,你可以使用`matplotlib`或者`plotly`库来制作甘特图¹²⁴⁵。以下是一些示例:**使用matplotlib制作甘特图**¹:```pythonimportmatplotlib.pyplotasplt#设置字体和负号显示plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=F......
  • python openstacksdk
     参考:openstackregionlist获取yaml配置的域信息ragion_name,也可以通过配置less/etc/neutron/neutron.conf获取region_name  openstacksdk旨在与任何OpenStack云对话。为此,需要一个配置文件。openstacksdk支持 clouds.yaml 文件,但也可以使用环境变量。......
  • 关于python http.server 开启多线程并发的问题
    问题描述thon中的http.server模块是单线程的,这意味着它一次只能处理一个请求,而其他请求必须等待。为了解决这个问题,您可以考虑使用多线程或异步处理来处理并发请求。您可以使用Python的ThreadingMixIn来创建一个支持多线程的HTTP服务器,或者考虑使用异步框架如asyncio来处理请求......
  • python动态规划求解最长回文子串
    回文是什么,回文是正着读和反着读都是一样的字符叫着回文。 如‘aba’,‘aa’,‘b’,这些都是回文classSolution:deflongestPalindrome(self,s:str)->str:n=len(s)dp=[[False]*nfor_inrange(n)]ans=""forlinrange(n):......
  • python递归求解青蛙跳台阶问题
    一只青蛙一次可以跳上1级台阶,也可以跳上2级。请问该青蛙跳上一个n级的台阶总共有多少种跳法。输入台阶数,输出一共有多少种跳法。defjump1(n):ifn==1:return1elifn==2:return2else:returnjump1(n-1)+jump1(n-2)x=eval(input())pr......
  • python回溯求解电话号码组合
    给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例2:......
  • python回溯法n皇后问题
    classSolution:defsolveNQueens(self,n:int):defgenerateBoard():board=list()foriinrange(n):row[queens[i]]="Q"board.append("".join(row))......
  • Wasserstein距离的python代码实现scipy.stats.wasserstein_distance解释
    在官方文档scipy.stats.wasserstein_distance—SciPyv1.8.0.dev0+1869.838cfbeManual(osgeo.cn)页面中scipy.stats.wasserstein_distance(u_values,v_values,u_weights=None,v_weights=None)对参数u_values,v_value,u_weights,v_weights解释不清晰。通过看文章Wassers......