Python网络爬虫(十五)——Selenium

本文探讨了AJAX的工作原理及如何通过分析接口或使用Selenium获取动态加载数据,介绍了Selenium的基本使用方法,包括常见操作如元素定位、输入框操作、页面等待等,并讲解了如何设置代理和切换页面。
部署运行你感兴趣的模型镜像

AJAX

对于静态网页来说,在你发出请求的时候会请求全部的资源,而对于网页资源涉及较多,有一部分资源加载较慢的网页来说,等所有的资源全部加载完毕之后才显示整个网页的策略则会大大影响用户的使用。而动态网页则可以避免这个问题。

异步 JavaScript 和 XML(Asynchronouse JacaScript and XML)能够在后台与服务器进行少量的数据交换,从而可以使网页实现异步更新,这样就可以在不重新加载整个页面的情况下,对网页的数据进行更新,通过 AJAX 加载的数据可以通过 JSON 将数据直接渲染到浏览器中。

获取 AJAX 数据

和之前利用 Cookie 信息保持登陆状态一样,获取 AJAX 动态加载的数据也有两种方法:

  • 直接分析 AJAX 调用的接口,然后通过代码发送请求
  • 使用 Selenium 模拟浏览器行为获取数据

两种方法的优缺点为:

方式优点缺点
分析接口可以直接获取数据,不需要进行解析,代码量少,性能高接口分析比较复杂
selenium模拟浏览器的行为,更加稳定代码量多,性能低

Selenium

chromedriver

chromedriver 相当于是一个驱动 chrome 浏览器的驱动程序,使用该驱动能够驱动浏览器正常工作。国内有 chromedriver 的镜像可供下载,对于不同的浏览器有不同的驱动,可以根据自己浏览器自行下载。

Selenium

selenium 可以模拟用户在浏览器上的行为,比如点击,输入等,从而达到自动的效果。

基本使用

from selenium import webdriver
import time

# chromedriver 的路径
driver_path = r'D:\chromedriver\chromedriver.exe'
# 要访问的网页
url = r'https://www.baidu.com/'
# 初始化 driver
driver = webdriver.Chrome(executable_path=driver_path)
# 通过 driver 请求 url
driver.get(url)
# 等待
time.sleep(5)
# 退出浏览器
driver.quit()

之后 chromedriver 便能够自动打开 chrome 访问指定页面,等待 5 秒后退出。

常用操作

函数描述示例
close()关闭当前页面dirver.close()
quit()退出浏览器dirver.quit()
find_element()获取第一个满足条件的元素dirver.find_element(By.ID,'su')
find_elements()获取所有满足条件的元素dirver.find_element(By.ID,'su')
find_element_by_id()根据 id 来查找元素dirver.find_element_by_id('su')
find_element_by_class_name()根据类名查找元素dirver.find_element_by_class_name('name')
find_element_by_name()根据 name 属性值查找元素dirver.find_element_by_name('name')
find_element_by_tag_name()根据标签名查找元素dirver.find_element_by_tag_name('div')
find_element_by_xpath()根据 xpath 语法查找元素dirver.find_element_by_xpath('//div')
find_element_by_css_selector()根据 css 选择器选择元素dirver.find_element_by_css_selector('//div')
send_keys()操作输入框

input=driver.find_element_by_id('kw')

input.send_keys('python')

clear()清除输入框内容input.clear()
click()鼠标点击

checkbox=driver.find_element_by_name('rememberMe')

checkbox.click()

click_and_hold(element)点击但不松开鼠标 
context_click(element)鼠标右击 
double_click(element)鼠标双击 
Select下拉列表的类

from selenium.webdriver.support.ui import Select

tag=Select(driver.find_element_by_name('jumpMenu'))

tag.select_by_index(1) 

# tag.select_by_value('value')

# tag = select_by_visible_text('text')

tag.deselect_all()

ActionChain

如果某个操作需要使用很多步骤才能够完成,此时需要借助 ActionChain 来完成:

inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')

actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()

cookie

函数描述示例
get_cookies()获取所有 cookiedriver.get_cookies()
get_cookie()根据 key 获取 cookie 的 valuedriver.get_cookie(key)
delete_all_cookies()删除所有 cookiedriver.delete_all_cookies()
delete_cookie()根据 key 删除 cookiedriver.delete_cookie(key)

页面等待

有时网页加载的速度较慢,因为不能在指定的元素加载之前就进行操作,因此此时需要进行页面等待。等待分为两种:

  • 隐式等待:调用 driver.implicitly_wait,此时在获取到元素之前,会先等待 10 秒
driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
driver.get("https://www.douban.com/")
  • 显式等待:此时在某个条件成立后才执行操作。也可以设置最大等待时间
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

其它的一些等待条件为:

函数描述
presence_of_element_located某个元素已经加载完毕
presence_of_all_emement_located网页中所有满足条件的元素都加载完毕
element_to_be_cliable某个元素可以点击

切换页面

如果需要切换页面,可以使用 switch_to_window 进行切换,切换到的页面则由 driver.window_handles 确定:

# 打开一个新的页面
driver.execute_script("window.open('"+url+"')")
# 切换到这个新的页面中
driver.switch_to_window(driver.window_handles[1])

设置代理

使用 selenium 设置代理的方法为:

from selenium import webdriver

driver_path = r"D:\chromedriver\chromedriver.exe"
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=https://117.89.25.75:8118")

driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)

driver.get('http://httpbin.org/ip')

WebElement

该类是获取元素的所属类,常用属性有:

get_attribute标签的某个属性值
screenshot获取当前页面的截图,只能用于 driver

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在某些情况下,像淘宝这类页面,其 Ajax 接口参数复杂,包含加密密钥等,自行构造 Ajax 参数困难,此使用 Selenium 是方便快捷的抓取方法。Selenium 可在浏览器中运行,模拟用户真实浏览网页操作,能实现浏览器加载页面、搜索关键字和点击翻页等操作,即使是使用异步加载技术的网页,也可模拟翻页获取不同网页的数据 [^1][^2]。 以下是一个简单示例代码,用于使用 Python 结合 Selenium 爬取淘宝商品信息并实现翻页抓取: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器 driver = webdriver.Chrome() # 打开淘宝页面 driver.get('https://www.taobao.com') # 定位搜索框并输入关键词 search_box = driver.find_element(By.ID, 'q') search_box.send_keys('手机') search_box.send_keys(Keys.RETURN) # 等待页面加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div.items div.item.J_MouserOnverReq')) ) # 模拟翻页 for i in range(3): # 这里设置翻页次数,例如翻 3 页 # 等待商品信息加载 time.sleep(3) # 获取当前页面商品信息 items = driver.find_elements(By.CSS_SELECTOR, 'div.items div.item.J_MouserOnverReq') for item in items: try: title = item.find_element(By.CSS_SELECTOR, 'div.row.row-2.title').text price = item.find_element(By.CSS_SELECTOR, 'strong').text print(f'商品标题: {title}, 价格: {price}') except Exception as e: print(f"Error: {e}") # 点击下一页 try: next_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'li.next')) ) next_button.click() except Exception as e: print(f"翻页失败: {e}") # 关闭浏览器 driver.quit() ``` 上述代码实现了打开淘宝页面,搜索“手机”关键词,然后模拟翻页 3 次,每次翻页后获取商品的标题和价格信息并打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值