Python爬取网页Flex渲染的动态内容

这篇具有很好参考价值的文章主要介绍了Python爬取网页Flex渲染的动态内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我最近使用Python爬取网页内容时遇到Flex渲染的动态页面,比如下图的课程目录标题,此时按鼠标右键,菜单里没有复制链接的选项。

Python爬取网页Flex渲染的动态内容

我的目的是:获取各个视频标题、链接。

按F12进入开发者模式分析网页,可见有多个flex标签,像这种通过flex动态渲染的网页,视频链接隐藏在JS代码里,需要人工点击才能运算出正确的链接,普通的requests库的get是无法直接获取的。

Python爬取网页Flex渲染的动态内容

于是改变思路,尝试selenium的webdriver来打开浏览器,打开该网页,然后用find_element的By来搜索关键词“视频”,看看能不能定位到“视频”的元素:

from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
# 关掉密码弹窗
options.add_experimental_option("prefs", prefs)
# 关闭提示“您的连接不是私密连接”
options.add_argument("--ignore-certificate-errors")
# 关闭提示“Chrome受自动控制提示”
options.add_experimental_option('useAutomationExtension', False) 
# 关闭提示“Chrome受自动控制提示”
options.add_experimental_option('excludeSwitches', ['enable-automation']) 
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(options=options)

driver.get('......') # 打开网页url

l1=driver.find_element(By.PARTIAL_LINK_TEXT,'视频')
l2=driver.find_element(By.LINK_TEXT,'视频')

结果无论是l1还是l2,都会报错。

再尝试别的办法,如selenium的locate with:

from selenium.webdriver.support.relative_locator import locate_with, with_tag_name

l3=locate_with(By.LINK_TEXT, '视频')
l3.click()

l3=locate_with(...) 这一行通过了,但下一句l3.click()报错,提示没有click()的属性。

再想办法,改为:

l4=driver.find_element(l3)
l4.click()

但同样报错:selenium.common.exceptions.NoSuchElementException: Message: Cannot locate relative element with: {'link text': '视频'}

上面都使用了By.LINK_TEXT查找关键词来定位,是希望能精确定位,但在Flex渲染的页面里定位不了。

那么find_element改用By.CLASS_NAME又行不行?

l5=driver.find_element(By.CLASS_NAME,'item-title')
print(l5.text)

好!这下没有报错。结果返回l5的值是字符串:'一张图了解技术指标(上)'

接下来发送点击命令,如果顺利的话就通过driver.current_url获取播放视频页面的链接。

使用while 1循环,遍历查找所有class为“item-title”,直至查找报错,跳出循环。

links=[]
# 参考来源:https://blog.csdn.net/saber_sss/article/details/103460706
new_location=WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME,'item-title')))

while 1:    
    try:
        # 查询窗口总数,返回一个包含所有窗口句柄handles的列表
        handles=driver.window_handles 
        title=new_location.text # 获取视频标题
        new_location.click()
        # 对比一开始获取的窗口总数,确认新窗口出现了再去切换
        WebDriverWait(driver,5).until(EC.new_window_is_opened(handles))
        # 切换到新窗口
        handles=driver.window_handles #再次获取窗口句柄handles
        #执行切换窗口操作
        driver.switch_to.window(handles[-1])
        links.append([title, driver.current_url])
        # 关闭当前窗口
        driver.close()
        # 记得还要再切换去原来的窗口
        driver.switch_to.window(handles[0])
        last_location=new_location
        # 查找下一行
        new_location=driver.find_element(locate_with(By.CLASS_NAME,'item-title').below(last_location))
    except Exception:
        break

for i in links: print(i)

运行结果:

Python爬取网页Flex渲染的动态内容

貌似成功了。但是对比原网页上的视频标题,获取的结果少了一半,find_element代码每次都隔行获取,为什么会隔行?离得太近了吗?

后来我到selenium的官网文档里查看关于locators的用法,发现除了below是查找下一行之外,还有“near”查找,于是把below改为near,结果却是查找到视频标题的第一行、第二行、第一行、第二行。。。如此循环。

为解决这个问题,只能先后处理查找奇数行、偶数行,最后合并奇、偶行结果并重新排序。

# 初始化webdriver的过程不写了

links = []
l1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'item-title')))
l2 = driver.find_element(locate_with(By.CLASS_NAME,'item-title').near(l1))
index = 0
for locator in (l1,l2):
    while 1:    
        try:
            # 查询窗口总数,返回一个包含所有窗口句柄handles的列表
            handles = driver.window_handles 
            title = locator.text
            locator.click()
            # 对比一开始获取的窗口总数,确认新窗口出现了再去切换
            WebDriverWait(driver, 5).until(EC.new_window_is_opened(handles))
            # 再次获取窗口句柄handles
            handles = driver.window_handles 
            # 新老句柄列表可以看出,新出现的句柄在列表里面排在后面
            # 执行切换窗口操作
            driver.switch_to.window(handles[-1])
            print(index, title, driver.current_url)
            links.append([index, title, driver.current_url])
            driver.close()
            # 记得还要切换回原来的窗口
            driver.switch_to.window(handles[0])
            locator = driver.find_element(locate_with(By.CLASS_NAME,'item-title').below(locator))
            # 为解决隔行,index加2
            index+=2
        except Exception:
            # 查找不到再多的元素就退出循环
            break
    # 然后处理偶数行,index设为1
    index = 1
# 把结果重新排序
links = sorted(links)
for i in links: print(i)
driver.quit()

运行结果截图:

Python爬取网页Flex渲染的动态内容

很不错!但还有一个bug:运行结果的第2、3项重复,估计是selenium的定位元素存在误差造成的。

2023年4月13日更新:简单而优雅的写法

今天更新一下简单一点又没有上述 bug 的方法。先来看第一幅图:

Python爬取网页Flex渲染的动态内容

之前的笨方法是先定位 class="item-title",由于有很多个相同的 class 元素,导致Selenium定位不准确。

简单而优雅的方法是:先定位 class="item-title" 的上一级 class="column_catalog_item_wrap",然后从这个元素开始往下循环遍历定位 class="item-title",再进行点击链接、获取链接。

下面是优化后的代码:

# 初始化webdriver的过程不写了

links = []
l1 = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'column_catalog_item_wrap')))
l2 = l1.find_elements(By.CLASS_NAME, 'item-title')

for index, locator in enumerate(l2):
    # 查询窗口总数,返回一个包含所有窗口句柄handles的列表
    handles=driver.window_handles 
    title=locator.text
    locator.click()
    # 对比一开始获取的窗口总数,确认新窗口出现了再去切换
    WebDriverWait(driver,5).until(EC.new_window_is_opened(handles))
    # 再次获取窗口句柄handles
    handles=driver.window_handles 
    # 新老句柄列表可以看出,新出现的句柄在列表里面排在后面
    # 执行切换窗口操作
    driver.switch_to.window(handles[-1])
    print(index, title, driver.current_url)
    links.append([index, title, driver.current_url])
    driver.close()
    # 记得还要切换回原来的窗口
    driver.switch_to.window(handles[0])
    
for i in links: print(i)
driver.quit()

参考来源:

【1】 爬虫实例(5)网页动态内容的识别_网页内容分类识别_演技拉满的白马的博客-CSDN博客

【2】浅谈selenium4新增功能之相对定位_the-ruffian的博客-CSDN博客_selenium相对定位法

【3】 python+selenium之窗口切换三种操作_saber_sss的博客-CSDN博客_python wd 切换窗口

【4】 Locator strategies | Selenium文章来源地址https://www.toymoban.com/news/detail-441847.html

到了这里,关于Python爬取网页Flex渲染的动态内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript动态渲染页面爬取——Selenium的使用

    JavaScript动态渲染得页面不止Ajax一种。例如,有些页面的分页部分由JavaScript生成,而非原始HTML代码,这其中并不包含Ajax请求。还有类似淘宝这种页面,即使是Ajax获取的数据,其Ajax接口中也含很多加密参数,使我们难以直接找出规律,也很难直接通过分析Ajax爬取数据。 Pyt

    2024年04月11日
    浏览(28)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(59)
  • 使用Apache HttpClient爬取网页内容的详细步骤解析与案例示例

    Apache HttpClient是一个功能强大的开源HTTP客户端库,本文将详细介绍如何使用Apache HttpClient来爬取网页内容的步骤,并提供三个详细的案例示例,帮助读者更好地理解和应用。 在项目的pom.xml文件中添加依赖,将以下代码添加到pom.xml文件中: 创建一个名为WebCrawler的Java类。 使用

    2024年02月07日
    浏览(35)
  • python通过selenium爬取网页信息,python获取浏览器请求内容,控制已经打开的浏览器

    背景:通过python中直接get或者urlopen打开一些有延迟加载数据的网页,会抓取不到部分信息。 1. 命令行打开chrome,并开启调试端口 (前提,找到chrome安装目录,找到chrome.exe所在路径,添加到环境变量中,例如我的是C:Program FilesGoogleChromeApplication) remote-debugging-port指定远程调试

    2024年02月16日
    浏览(51)
  • selenium爬取网页内容,对网页内容进行点击

    所需要的库 首先明确所要爬取的网页,选择调用方法,增加无界面模式的无头参数,然后调用,获取网址,使页面放大,为最大化窗口 获取数据运用XPATH函数,将获取的数据作为item,运用XPATH函数获取,   模仿人点击下一页,运用 for语句,每10个一点,停留5秒 同样寻找下一

    2024年01月17日
    浏览(46)
  • 使用Selenium抓取网页动态内容

    Selenium 是一个自动化测试工具,支持多种浏览器,包括 Chrome、Firefox、Edge 等,具有强大的浏览器自动化能力,可以用于Web应用程序的自动化测试、数据挖掘等领域。Selenium的主要特点有: 支持多种浏览器 Selenium支持多种浏览器,包括Chrome、Firefox、Edge、Safari等,可以满足不同

    2023年04月25日
    浏览(60)
  • 爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

    随着互联网的发展,许多网站开始采用动态网页来呈现内容。与传统的静态网页不同,动态网页使用JavaScript等脚本技术来实现内容的动态加载和更新。这给网页爬取带来了一定的挑战,因为传统的爬虫工具往往只能获取静态网页的内容。本文将介绍如何使用Selenium和API来实现

    2024年02月11日
    浏览(43)
  • scrapy爬虫爬取多网页内容

    摘要 :此案例是爬取目标网站( https://tipdm.com/ )的 新闻中心 板块的 公司新闻 中所有新闻的标题、发布时间、访问量和新闻的文本内容。 我使用的是 Anaconda prompt 我们使用如下命令创建scrapy项目: scrapy startproject spider_name 爬虫路径 spider_name 是项目的名字 爬虫路径 就是项目

    2023年04月21日
    浏览(27)
  • Python小姿势 - # 如何使用Python爬取网页数据

    如何使用Python爬取网页数据 今天我们来学习一下如何使用Python来爬取网页数据。 首先,我们需要准备一个空白的文件,在文件中输入以下代码: ``` import requests url = \\\'http://www.baidu.com\\\' r = requests.get(url) print(r.text) ``` 上面的代码中,我们首先导入了 requests 库,然后声明了一个

    2024年02月04日
    浏览(33)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包