主页 分类 关于

爬虫 selenium自动化(牢饭吃到饱)

每天一个入狱小技巧

安装

打开cmd 输入以下内容

pip install selenium

原理

  • 代码调用webdriver操作浏览器
  • 不同的浏览器使用各自不同的driver

根据实际环境选择浏览器 谷歌浏览器/火狐浏览器

  • 开发使用有头浏览器
  • 部署使用无头浏览器

使用

from selenium import webdriver
import time

# 采用有头浏览器
browser = webdriver.Chrome()

# 要爬取的网页
browser.get("https://www.baidu.com/")

# 在百度中搜索史迪奇
browser.find_element_by_id('kw').send_keys('史迪奇')

#模拟点击
browser.find_element_by_id('su').click

# 延时3秒
time.sleep(3)

# 一定要退出
browser.quit()

其他操作

# 当前标签页浏览器渲染之后的网页源代码
browser.page_source

# 当前标签页的url
browser.current_url

# 关闭当前标签页面, 如果只有一个标签页面则关闭整个浏览器
browser.close()

# 关闭浏览器
browser.quit()

# 页面前进
browser.forward()

# 页面后退
browser.back()

# 页面截图
browser.screen_shot(img_name)

driver对象定位标签元素获取标签对象方法

# 返回一个元素
find_element_by_id

# 根据类名获取元素列表
find_element(s)_by_class_name

# 根据标签的name属性值返回包括标签对象元素的列表
find_element(s)_by_name

# 返回一个包含元素的列表
find_element(s)_by_xpath

# 根据连接文本获取元素列表
find_element(s)_by_link_text

# 根据标签名获取元素列表
find_element(s)_by_partial_link_text

# 根据css选择器来获取元素列表
find_element(s)_by_css

特别注意:

  • find_element和find_elements的区别:
    • 多了给s就返回列表, 没有s就返回匹配到的第一个标签对象
    • find_element匹配不到就抛出异常, find_elements匹配不到就返回空列表
  • by_link_text和by_partial_link_text的区别:
    • 全部文本和包含某个文本
  • find_element_by_xxx
    • 定位到则是一个对象
    • 定位不到则是报错
  • find_elements_by_xxx
    • 定位到则是一个含有元素的列表
    • 定位不到则是空列表

标签对象提取文本内容和属性值

  • 获取文本 element.text
    • 通过定位获取的标签对象的 text 属性, 获取文本内容
  • 获取属性值 element.get_attribute(“属性名”)
    • 通过定位获取的标签对get_attribute 函数, 传入属性名, 来获取获取属性的值

例子

from selenium import webdriver

url = "https://sz.58.com/ershoufang/?PGTID=0d200001-0000-4f6f-f947-87e3a87719a1&ClickID=1"

browser = webdriver.Chrome()

browser.get(url)

el_list = browser.find_elements_by_xpath('//*[@id="__layout"]/div/section/section[3]/section[1]/section[2]/div/a/div[2]/div[1]/div[1]/h3')

for el in el_list:
print(el.text,el.get_attribute('href'))

标签页的切换

  • 获取所有标签页的窗口句柄

  • 利用窗口句柄字切换句柄指向的标签页

    • 这里的窗口句柄是指:
      • 指向标签页对象的标识

# 获取当前所有的标签页的句柄构成的列表
current_windows = browser.window_handles

# 根据标签页句柄列表索引下标进行切换
browser.switch_to.window(current_windous[0])

窗口切换

ifame是html中常用的一种技术, 即一个页面嵌套

# 操作frame外边的元素需要切换出去
Windows = browser.window_handles
browser.switch_to.window(windows[0])
content = browser.find_element_by_class_name().text
print(content)
browser.quit()

cookies操作

import time
from selenium import webdriver

url = "http://www.baidu.com/"

browser = webdriver.Chrome()
browser.get(url)

# cookies = {}
# for data in browser.get_cookies():
# cookies[data['name']] = data['value']

# 字典推导式
cookies = {data['name'] : data['value']for data in browser.get_cookies()}

print(cookies)

关于js执行

import time
from selenium import webdriver

url = "http://jn.lianjia.com/"

browser = webdriver.Chrome()

browser.get(url)

# 滚动条拖动 x和y
js = 'scrollTo(0,900)'

# 执行js
browser.execute_script(js)

无界面模式

# 实例化配置对象
options = webdriver.ChromeOptions()

# 配置对象添加开启无界面模式的命令
options.add_argument("--headless")

# 配置对象添加禁用gpu的命令
options.add_argument("--disable-gpu")

# 实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=options)

代理

# 实例化配置对象
options = webdriver.ChromeOptions()

# 配置对象添加使用代理ip的命令
options.add_argument("--proxy-server=http://202.20.16.82:9527")

# 配置对象添加禁用gpu的命令
options.add_argument("--disable-gpu")

# 实例化带有配置对象的browser对象
browser = webdriver.Chrome('./chromedriver',chome_options=options)

替换user-agent(上网设备)

# 实例化配置对象
options = webdriver.ChromeOptions()

# 配置对象添加使用代理ip的命令
options.add_argument("--user-agent=Mozilla/5.0 HAHA")

# 配置对象添加禁用gpu的命令
options.add_argument("--disable-gpu")

# 实例化带有配置对象的browser对象
browser = webdriver.Chrome('./chromedriver',chome_options=options)











作者: 我叫史迪奇
本文来自于: https://sdq3.link/reptile-selenium.html博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议