爬取Canvas标签的数据(获取截屏)

前言

爬取canvas有两种办法,一种是获取其base64数字码,第二种是直接截屏,我两种都试过,但第一种过于繁琐,也会导致内存紧张(一截屏的数字码都有几MB大小了(╯‵□′)╯︵┻━┻),所以我展现第二种方式,截屏。

实操

建议使用python,python有个很好的类库

首先install三个个类库,一个numpy,一个selenium,还有一个PIL。

然后去网上下载谷歌驱动到你的python安装目录下

下载链接:http://chromedriver.storage.googleapis.com/index.html

例子如下:

import time
import numpy as np
from PIL import Image
from numpy import array
from selenium import webdriver
from selenium.webdriver.common.by import By
# 需要先安装谷歌驱动(http://chromedriver.storage.googleapis.com/index.html)安装你谷歌浏览器对应的版本,放在python安装目录下,不然会报错:找不到驱动
opt = webdriver.ChromeOptions()
# opt.add_argument('headless')  # 设置option,后台运行
driver = webdriver.Chrome(options=opt)  # 创建浏览器对象

url = "https://weread.qq.com/web/bookDetail/5de32c70719cc6825de03e5"
path = '.\\'

driver.get(url)# 打开网页
driver.find_element(By.CLASS_NAME, value = "blue").click()
# window_height = driver.get_window_size()['height'] - 130  # 窗口高度

# driver.execute_script(f'document.getElementsByClassName("readerTopBar")[0].style.display="none"')
# driver.save_screenshot(r'.\screenshot.png')
test = 1
while test <= 19:
    time.sleep(1)# 给系统一个反应的时间
    window_height = driver.get_window_size()['height'] - 130  # 窗口高度
    page_height = driver.execute_script('return document.documentElement.scrollHeight')  # 页面高度
    if page_height > window_height:
        n = (page_height / window_height)  # 需要滚动的次数
        path2 = ".\\snapshot\\"
        driver.execute_script(f'document.getElementsByClassName("readerTopBar")[0].style.display="none"')
        driver.save_screenshot(r'.\screenshot.png')
        base_mat = np.atleast_2d(Image.open(r'.\screenshot.png'))  # 打开
        for i in range(int(n)):
            driver.execute_script(f'document.documentElement.scrollTop={window_height * (i + 1)};')
            fileName = fr"snapshot_{i}.png"
            time.sleep(0.5)
            driver.save_screenshot(path+fileName)  # 保存截图
            mat = np.atleast_2d(Image.open(path+fileName))  # 打开截图并转为二维矩阵
            base_mat = np.append(base_mat, mat, axis=0)  # 拼接图片的二维矩阵

        file_path = fr".\mySnapshot_{test}.png"
        print(file_path)
        Image.fromarray(base_mat).save(file_path)
    test += 1
    if test != 19:
        driver.find_element(By.CLASS_NAME,value="readerFooter_button").click()

里面的注解讲的挺详尽的,我这里粗略的说一下

思想是将每一个页面都依据屏幕大小分成好几段,然后再将这好几段的截屏合并,这一页的屏幕就截下来了。

至于保证无缝隙嘛,就靠自己慢慢试数据咯。希望拓印文字的话,搞个图片转文字的类库即可。

步骤讲解

  1. 创建chrome的对象
opt = webdriver.ChromeOptions()
# opt.add_argument('headless')  # 设置option,后台运行
driver = webdriver.Chrome(options=opt)  # 创建浏览器对象
  1. 设置好爬取的url并打开
url = "https://weread.qq.com/web/bookDetail/5de32c70719cc6825de03e5"
path = '.\\'
driver.get(url)# 打开网页
  1. 获取爬取的元素
driver.find_element(By.CLASS_NAME, value = "blue").click()
  1. 设置爬取几页
test = 1
while test <= 19:
    time.sleep(1)# 给系统一个反应的时间
  1. 获取单页面的爬取高度,将所有的截屏截下来后再合并
    window_height = driver.get_window_size()['height'] - 130  # 窗口高度
    page_height = driver.execute_script('return document.documentElement.scrollHeight')  
  1. 遍历单页面的所有截屏
    if page_height > window_height:
        n = (page_height / window_height)  # 需要滚动的次数
        path2 = ".\\snapshot\\"
        driver.execute_script(f'document.getElementsByClassName("readerTopBar")[0].style.display="none"')
        driver.save_screenshot(r'.\screenshot.png')
        base_mat = np.atleast_2d(Image.open(r'.\screenshot.png'))  # 打开
        for i in range(int(n)):
            driver.execute_script(f'document.documentElement.scrollTop={window_height * (i + 1)};')
            fileName = fr"snapshot_{i}.png"
            time.sleep(0.5)

7.保存单个屏幕截屏并合并截屏

            driver.save_screenshot(path+fileName)  # 保存截图
            mat = np.atleast_2d(Image.open(path+fileName))  # 打开截图并转为二维矩阵
            base_mat = np.append(base_mat, mat, axis=0)  # 拼接图片的二维矩阵

        file_path = fr".\mySnapshot_{test}.png"
        Image.fromarray(base_mat).save(file_path)
    test += 1

8.跳转下一页

    if test != 19:
        driver.find_element(By.CLASS_NAME,value="readerFooter_button").click()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python可以使用BeautifulSoup或者Scrapy等库来爬取Canvas标签数据。首先需要了解Canvas标签的结构和属性,然后使用Python代码来解析HTML文档,提取出Canvas标签的内容和属性。可以使用requests库来获取网页内容,然后使用BeautifulSoup或者Scrapy等库来解析HTML文档,提取出Canvas标签的内容和属性。最后可以将提取出来的数据保存到本地文件或者数据库中。 ### 回答2: Canvas是HTML5中一种新的元素类型,可以使用JavaScript在上面绘制图形和动画等。在网站中,Canvas标签常常被用来显示图表、地图等交互式页面元素。对于爬虫程序员而言,如果需要获取这些交互式页面元素的数据,就需要借助一些特殊的技巧。 那么,如何用Python爬取Canvas标签数据呢?以下是一些方法: 1. 使用Selenium自动化测试工具 可以使用Selenium自动化测试工具来对页面进行模拟操作,从而获取Canvas标签产生的数据。Selenium可以模拟人类在浏览器中的点击、输入等交互操作,通过JavaScript代码,将Canvas数据转化为一个URI,然后用Python程序读取此URI即可。 2. 使用PhantomJS无头浏览器 PhantomJS是一个不需要图形显示界面的浏览器,它可以在后台执行JavaScript代码并将其转化为UI层。与Selenium相似,使用PhantomJS也可以模拟浏览器的操作,但是相比Selenium更加轻量级,速度更快。 3. 直接解析HTML源代码 可以直接解析HTML源代码,找到Canvas标签所对应的JavaScript代码,通过分析代码获取Canvas数据。这种方法需要爬虫程序员对JavaScript较好的理解,同时也需要对HTML源代码进行一定的编码处理。 无论采用哪种方式,都需要一定的爬虫编程技能和对Canvas标签及JavaScript的理解。同时,爬取数据也需要注意一些法律法规问题,不能侵犯他人隐私和知识产权等相关规定。 ### 回答3: Python 爬取 Canvas 标签数据的过程需要经过以下步骤: 1. 安装相关 Python 库和工具 我们需要使用 Python 的第三方库 requests 安装,以及使用 Chrome 浏览器的开发者工具来查看 Canvas 标签的 XHR 数据。 2. 获取 Canvas 标签的标识 token 首先,我们需要获取 Canvas 标签的标识 token,这个 token 和用户身份是相关的,所以需要登录 Canvas 后才能获取到。具体获取方式是在 Chrome 浏览器中登录 Canvas 后,按 F12 进入开发者模式,进入 Network 面板,筛选 XHR 请求类型,找到包含 token 的请求,即可获取到 token。 3. 模拟登录并获取数据 接下来,我们使用 requests 库来模拟登录,获取 Canvas 数据。代码示例如下: ```python import requests # 你的 Canvas 帐号和密码 email = '' password = '' # Canvas 的 URL 和 token url = '' token = '' # 模拟登录 session = requests.Session() login_url = f'{url}/login/canvas' session.post(login_url, data={ 'pseudonym_session[unique_id]': email, 'pseudonym_session[password]': password, 'authenticity_token': token }) # 进行其他操作,如获取数据 response = session.get(f'{url}/courses/xxxx/modules/yyyy/items/zzzz') ``` 4. 解析数据 我们可以使用 Python 的第三方库 BeautifulSoup 来解析 Canvas 的 HTML 数据,或使用 requests 库自带的解析工具来解析 JSON 数据。根据具体需要来选择解析方式。 5. 注意事项 在使用 Python 爬取 Canvas 标签数据时,需要注意不要过度频繁地访问 Canvas 网站,以免被认为正在进行恶意攻击。此外,还需要注意个人隐私和数据安全,不要泄露其他用户的个人信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值