ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬虫之selenium

2022-08-02 18:04:04  阅读:260  来源: 互联网

标签:webdriver 浏览器 标签 selenium 爬虫 import find browser


目录

selenium介绍

由于requests模块不能执行js,有的页面内容,我们在浏览器中可以看到,但是请求下来没有。

selenium模块:模拟操作浏览器,完成人的行为。

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。

模块安装:

pip install selenium

下载驱动

驱动浏览器需要下载相应的驱动,谷歌要下谷歌的驱动,火狐要下火狐的驱动,并且版本要与当前浏览器对应。

这里我选择谷歌浏览器,首先查看当前谷歌浏览器的版本:

image

版本:

image

下载驱动,地址:CNPM Binaries Mirror (npmmirror.com),一定要下载对应的版本驱动,比如我谷歌浏览器版本为103.0.5060.134,就要下103.0.5060.134的驱动

image

下载对应操作系统即可。

基本使用

导入模块:

from selenium import webdriver

初始化(打开浏览器):

browser = webdriver.Chrome(executable_path='驱动路径')
# 不写路径,要放到项目路径下或环境变量中
browser = webdriver.Chrome()

在地址栏输入地址:

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

关闭标签:

browser.close()

关闭浏览器:

browser.quit()

selenium用法

元素操作

操作浏览器页面中的标签。

1.搜索标签

新版本:by=根据什么查找,value=查找的值

  • find_element(by, value):找第一个
  • find_elements(by, value):找所有
by的参数 含义
By.ID 根据标签id属性查找
By.LINK_TEXT 根据a标签的文字查找
By.PARTIAL_LINK_TEXT 根据a标签的文字模糊匹配
By.TAG_NAME 根据标签名查找
By.CLASS_NAME 根据标签class属性查找
By.NAME 根据标签name属性查找
By.CSS_SELECTOR 根据css选择器查找
from selenium.webdriver.common.by import By
# 查找网页中id为'login'的标签
tag = browser.find_element(by=By.ID, value='login')
# 查找网页中class为'login'的所有标签
tags = browser.find_elements(By.CLASS_NAME, value='login')
# 查找网页div标签中class属性为'dd'的标签
tag = browser.find_element(by=By.CSS_SELECTOR, value='div .dd')
# 查找网页中a标签文字为'登录'的标签
tag = browser.find_element(by=By.LINK_TEXT, value='登录')

老版本

browser.find_element_by_id()  # 根据id
browser.find_element_by_link_text()  # 根据a标签的文字
browser.find_element_by_partial_link_text()  # 根据a标签的文字模糊匹配
browser.find_element_by_tag_name()  # 根据标签名
browser.find_element_by_class_name()  # 根据类名
browser.find_element_by_name()  # 根据name属性
browser.find_element_by_css_selector()  # css选择器

2.点击标签

# 查找网页中id为'login'的标签
tag = browser.find_element(by=By.ID, value='login')
# 标签点击
tag.click()

3.向输入框中写内容

tag = browser.find_element(by=By.ID, value='inputTag')
tag.send_keys('内容')

4.清空

tag = browser.find_element(by=By.ID, value='inputTag')
tag.clear()

举例:打开百度搜索'博客园':

from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器
browser = webdriver.Chrome()
# 输入网址进入
browser.get('http://www.baidu.com')
# 查找百度输入框
word = browser.find_element(By.ID, 'kw')
# 输入框添加内容
word.send_keys('博客园')
# 查找搜索按钮
btn = browser.find_element(By.ID, 'su')
# 点击搜索按钮
btn.click()

# 等待2秒关闭浏览器
import time
time.sleep(2)
browser.quit()

等待元素被加载

程序操作页面非常快,所以在取每个标签的时候,标签可能没有加载好,取标签时就会报错,所以需要设置等待时间。

如果标签找不到,就会等待,还找不到就会报错:

from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器
browser = webdriver.Chrome()
# 找不到标签就等待2秒
browser.implicitly_wait(2)
# 输入网址进入
browser.get('http://www.baidu.com')
# 查找百度输入框
word = browser.find_element(By.ID, 'kw')
# 输入框添加内容
word.send_keys('博客园')
# 查找搜索按钮
btn = browser.find_element(By.ID, 'su')
# 点击搜索按钮
btn.click()
# 找到能进入博客园的a标签
cnblog = browser.find_element(By.LINK_TEXT, '博客园')
# 进入博客园
cnblog.click()

# 等待2秒关闭浏览器
import time
time.sleep(2)
browser.quit()

元素各项属性

标签对象调用 含义
标签对象.location 标签所在位置
标签对象.size 标签大小(高宽)
标签对象.id 标签id号(随机给的),不是id属性
标签对象.tag_name 标签名
标签对象.get_attribute('属性') 标签属性值
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器
browser = webdriver.Chrome()
# 输入网址进入
browser.get('http://www.baidu.com')
# 查找百度输入框
word = browser.find_element(By.ID, 'kw')

print(word.location)  # 标签所在位置,{'x': 298, 'y': 188}
print(word.size)  # 标签大小,{'height': 44, 'width': 550}
print(word.id)  # 标签id号,不是id属性
print(word.tag_name)  # 标签名字,input
print(word.get_attribute('class'))  # 获取标签的class属性值,s_ipt

browser.quit()

执行js代码

执行js用途:

  1. 普通滑屏,打开新标签
  2. 可以执行js代码,别人网站的变量,函数,都可以拿到并执行

滚动条到最底部

from selenium import webdriver
# 打开浏览器
browser = webdriver.Chrome()
# 输入网址进入
browser.get('https://www.cnblogs.com/')
# 滚动条到最底部
browser.execute_script('scrollTo(0,document.body.scrollHeight)')

import time
time.sleep(3)
browser.quit()

打开新标签

from selenium import webdriver
# 打开浏览器
browser = webdriver.Chrome()
# 输入网址进入
browser.get('https://www.cnblogs.com/')
# 打开新标签
browser.execute_script('window.open()')

import time
time.sleep(3)
browser.quit()

切换选项卡

浏览器打开了多个选项卡,需要切换时:

browser.switch_to.window(browser.window_handles[1])
# 已弃用的方法
browser.switch_to_window(browser.window_handles[1])

browser.window_handles[0]代表第一个选项卡
browser.window_handles[1]代表第二个选项卡

from selenium import webdriver
import time
# 打开浏览器
browser = webdriver.Chrome()
# 进入博客园
browser.get('https://www.cnblogs.com/')
time.sleep(1)
# 打开新标签
browser.execute_script('window.open()')
# 切换到新标签
browser.switch_to.window(browser.window_handles[1])
# 新标签进入百度
browser.get('https://www.baidu.com/')
time.sleep(1)
# 切换回博客园
browser.switch_to.window(browser.window_handles[0])

time.sleep(2)
browser.quit()

浏览器前进后退

浏览器前进:

browser.forward()

浏览器后退:

browser.back()

无界面浏览器

不显示的打开浏览器的图形化界面,还能获取数据

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()

chrome_options.add_argument('window-size=1920x3000')  # 指定浏览器分辨率
chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

browser = webdriver.Chrome(options=chrome_options)
browser.get('https://www.cnblogs.com/')
print(browser.page_source)  # 当前页面的内容(html内容)
browser.quit()

异常处理

由于有时候程序操作浏览器过快,有些标签会找不到等一些情况会出现报错,这时候可以用异常处理:

from selenium.common.exceptions import TimeoutException, NoSuchElementException, NoSuchFrameException

from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器
browser = webdriver.Chrome()
try:
    # 输入网址进入
    browser.get('http://www.baidu.com')
    # 查找百度输入框
    word = browser.find_element(By.ID, 'kw')
    # 输入框添加内容
    word.send_keys('博客园')
    # 查找搜索按钮
    btn = browser.find_element(By.ID, 'su')
    # 点击搜索按钮
    btn.click()
    # 找到能进入博客园的a标签
    cnblog = browser.find_element(By.LINK_TEXT, '博客园')
except Exception as e:
    print(e)
finally:  # 不管报不报错最后都关闭浏览器
    # 等待2秒关闭浏览器
    import time
    time.sleep(2)
    browser.quit()

登录获取cookie保存

获取浏览器所有cookie:

cookies = browser.get_cookies()
print(cookies)

登录博客园并保存cookie:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 打开浏览器
browser = webdriver.Chrome()
browser.implicitly_wait(2)
try:
    # 进入博客园
    browser.get('https://www.cnblogs.com/')
    # 查找登录按钮
    login_btn = browser.find_element(By.LINK_TEXT, '登录')
    login_btn.click()
    # 查找用户名和密码输入框
    username = browser.find_element(By.ID, 'mat-input-0')
    password = browser.find_element(By.ID, 'mat-input-1')
    # 输入用户名密码
    username.send_keys('xx')
    password.send_keys('123')
    btn = browser.find_element(By.CSS_SELECTOR, 'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button')
    btn.click()
    # 可能要验证,睡眠一下手动过验证
    time.sleep(10)
    # 保存cookie
    import json
    cookies = browser.get_cookies()
    with open('cnblog.json', 'w', encoding='utf-8') as f:
        json.dump(cookies, f)

except Exception as e:
    print(e)
finally:  # 不管报不报错最后都关闭浏览器
    # 等待2秒关闭浏览器
    time.sleep(2)
    browser.quit()

如果标签不好找出来,可以打开F12,找到标签位置,复制css选择器:

image

通过cookie达成登录效果

from selenium import webdriver
import time
# 打开浏览器
browser = webdriver.Chrome()
browser.implicitly_wait(2)
try:
    # 进入博客园
    browser.get('https://www.cnblogs.com/')
    # 此时还不是登录后的状态
    time.sleep(2)
    # 拿出cookie
    import json
    with open('cnblog.json', 'r', encoding='utf-8') as f:
        cookies = json.load(f)
    # cookie保存时是列表套字典,但写入cookie需要用字典格式,所以用循环
    for cookie in cookies:
        browser.add_cookie(cookie)
    # cookie全写入后刷新页面
    browser.refresh()
    # 此时是登录后的状态

except Exception as e:
    print(e)
finally:  # 不管报不报错最后都关闭浏览器
    # 等待2秒关闭浏览器
    time.sleep(2)
    browser.quit()

标签:webdriver,浏览器,标签,selenium,爬虫,import,find,browser
来源: https://www.cnblogs.com/yume-zbh/p/16544662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有