使用Selenium获取当当网异步加载的部分分类数据

本文记录了我学习selenium的一个小测试,目的是获取当当网这部分异步加载的分类信息
在网页源码中无法直接定位到这部分元素,需要通过selenium模拟鼠标移动hover操作才能获取这部分数据
在这里插入图片描述

环境条件:

  • python 3.8(2.5以上应该都行,涉及到2.5版本之后异常的基类变成了BaseException,代码中有用到)
  • 谷歌驱动下载及环境变量配置(网上相关博文很多,这里不赘述了)
  • selenium安装(安装:pip install selenium查看:pip list

网页结构分析:

要爬取数据,分析网页源码结构是一个很重要的部分,
就我的理解来看,对网页结构的理解决定了你的代码是否能够做到简洁明了
不同的人对同一网页源码结构可能有不同的理解,爬取数据的代码逻辑也可以不尽相同
建议读者自己分析一遍网页源码结构,我的实现方式不一定是最好的,具体分析见代码注释


刚学爬虫,如果有不当之处还望大佬们不吝赐教,(●ˇ∀ˇ●)

运行结果:

在这里插入图片描述

python代码及详细注释:

from selenium import webdriver
from selenium.webdriver import ActionChains
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.Chrome()  # 获取谷歌浏览器驱动
driver.get("http://www.dangdang.com/")  # 打开网址

# driver.maximize_window()  # 窗口最大化

try:
    # 显性等待 WebDriverWait,需要与 until 或 until_not 配合
    # 最长等待时间 5 秒,每 0.5 秒检查 id=“li_label_1” 的元素是否加载完成
    # 加载完成:返回定位的 id=“li_label_1” 的元素并执行下一步
    # 未加载完成:继续等待,直到超过最长等待时间=》报错(一般是网速问题)
    ele = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "li_label_1")))
    ActionChains(driver).move_to_element(ele).perform()  # 操作链,这里执行鼠标移动到ele元素上的操作
except BaseException as msg:  # BaseException 是异常的基类,可以接收所有类型的异常
    print(msg)  # 打印报错信息 message

# 要获取的数据是异步加载的,直接在页面源码中定位是找不到的,所以需要先执行鼠标移动到ele元素上的操作才能获取数据
div_left_box = driver.find_element_by_xpath('//*[@id="__ddnav_sort1"]/div')  # xpath定位element,找到图书、童书对应的盒子
# 分析网页结构可以知道,left_box中的每一行数据对应一个li元素,找到所有的li即可
liItems = div_left_box.find_elements_by_tag_name("li")  # 通过tag_name定位elements

for liItem in liItems:
    # 分析 left_box 的源码,每个 li 标签中有一个 h4 标签和若干个 a 标签
    title = liItem.find_element_by_css_selector("h4").text  # 通过标签名定位元素并获取文本内容
    aItems = liItem.find_elements_by_css_selector("a")  # 获取 li 中的所有 a 元素
    data = []  # 声明列表
    for aItem in aItems:  # 遍历 a 元素 并逐一加入到列表 data 中
        data.append(aItem.text)
    print(title + ":" + str(data))  # 打印这一行 li 的数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值