Python爬虫学习笔记 (13) [中级] 动态网页处理 selenium 1+ 当当网图书清单 (下拉滚动条加载页面)

本文介绍了如何使用selenium处理动态网页,特别是针对当当网图书清单的下载。内容包括selenium的基本流程、安装注意事项、初始化driver、元素定位及交互、条件等待等,并提供了一个小练习,通过下拉滚动条加载页面来抓取完整图书清单。
摘要由CSDN通过智能技术生成

更新日期: 2021.04.11

本节学习内容

处理动态网页的利器 selenium~

1. selenium是什么?

selenium是一套web测试系统,包含了测试的录制,编写和运行,以及测试的并行处理。支持多种主流浏览器。

selenium被应用在爬虫中,是因为它可以模拟人的操作来驱动浏览器,完成加载动态网页所要求的点击和下拉等动作,以获取网页的完整代码。selenium驱动浏览器操作的过程是可以在网页上直接观察到的,也可以使用无界面模式。

通过selenium获取内容需等待页面加载完毕,所以速度比直接构造请求获取内容慢,因此应仅在requests不能胜任时使用

2. 使用selenium 的基本流程

  • 设置 action chain:驱使浏览器按顺序执行预定操作(如找到"下拉获取更多信息"的按键并点击)
  • 设置监听:确认网页是否符合某个条件 (如,查询页面上是否还有"下拉获取更多信息"的按键)
  • 获取网页代码: 符合监听条件后,获取网页代码。注意使用Exceptions避免意外崩溃。

3. 安装时可能遇到的问题

以Chrome浏览器为例,selenium 通过webdriver.Chrome() 操控Chrome浏览器。

chromewebdriver和其操控的浏览器版本存在对应关系,比如:

  • chromewebdriver版本v2.46 支持 Chrome v71-73
  • chromewebdriver版本v2.45 支持 Chrome v70-72

因此,需要先查看自己Chrome浏览器的版本号,然后下载对应的chromewebdriver。

我的情况是,Chrome浏览器是最新版本(v89), 而 pip selenium 时带来的chromewebdriver是 2.24…所以,重新下载了v2.46版的chromewebdriver,然后卸载了最新的Chrome,下载了v73 的Chrome,再禁止Chrome自动更新版本。

4. 初始化 driver (伪装 / 反反扒 + 性能优化)

  • 使用前,对 driver 进行各种装饰,避免被网站识别为爬虫而禁止访问~~
  • 同时,设置属性禁止加载图片,加速进程。
  • 还可以设置使用无界面模式。
from selenium import webdriver
from selenium.webdriver import ChromeOptions

my_options = ChromeOptions()

# 设置 enable-automation 避免被识别为爬虫
my_options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 禁止加载图片,加速加载过程
no_image = {
   "profile.managed_default_content_settings.images": 2}
my_options.add_experimental_option("prefs", no_image)

# 规避使用 Chrome可能出现的 bug
my_options.add_argument('--disable-gpu')

# 使用无界面模式
my_options.add_argument('--headless')

driver = webdriver.Chrome(options=my_options)

5. 定位webdriver对象

使用selenium模拟人的操作,首先要定位需操作的对象。例如,一个按键,一个输入框,网页右侧的下拉栏,或者是一个网页。

定位一个webdriver对象,可通过对象的 id, 名称等进行定位。

如需定位多个同级对象中的一个,在element 后面加 s,在返回的列表中选择相应的序号,例如:需点击列表中第六个元素:
driver.find_elements_by_class_name(“docs”)[5].click()

find_element匹配不到将抛出异常,find_elements匹配不到返回空列表。

  • find_element_by_id
  • 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
from selenium import webdriver
driver = webdriver.Chrome()
# driver2 = webdriver.PhantomJS() # 初始化一个无界面浏览器对象
url = "http://www.baidu.com"
driver.get(url)

#找到名字为wd的对象
driver.find_element_by_name('wd')
#找到超链接文本中含有'贴&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值