❤️不到100行把流式热榜截屏合成一张?爬虫终极秘诀【建议收藏】❤️

简介: 爬虫如何应对流式加载页面,这100行代码请收藏!

前篇学委弄了一篇把网站拍照留存,发现截屏的页面是一个流式页面,就截了一部分怎么办?


所谓的流式加载的页面,页面高度是不断变长的,这种页面无法一次加载就获取到整个页面的真实高度!

身边有没有哪些流式加载的页面呢? 比如 CSDN的热榜 没跑了。


这种流式加载窗口就开打开水龙头一样,内容哗啦啦的展示出来,关掉了就不加载。


经常冲榜的朋友就知道,打开热榜,发现就几条Top 5,需要浏览器往下拉,才会继续动态加载更多内容出来。一直往下拉,慢慢拉整个热榜就出来了。


本文实现流程概括如下图:


image.png

第一个问题:这这个获取流式窗口高度的操作怎么实现呢?

爬虫怎么开始设置,在前一篇文章,请自行阅读。

下面直击重点,我们怎么样获取动态流式内容窗口的高度。

'''
雷学委应对流式页面的爬虫解决秘诀
核心代码:
'''
def resolve_height(driver, pageh_factor=5):
    js = "return action=document.body.scrollHeight"
    height = 0
    page_height = driver.execute_script(js)
    ref_pageh = int(page_height * pageh_factor)
    step = 150 
    max_count = 15 
    count = 0 
    while count < max_count and height < page_height:
        #scroll down to page bottom
        for i in range(height, ref_pageh, step):
            count+=1
            vh = i
            slowjs='window.scrollTo(0, {})'.format(vh)
            print('exec js: %s' % slowjs)
            driver.execute_script(slowjs)
            sleep(0.3)
        if i >= ref_pageh- step:
            print('not fully read')
            break
        height = page_height
        sleep(2)
        page_height = driver.execute_script(js)
    print("finish scroll")
    return page_height

代码不多哦。

核心思想

  1. 持续滚动学习窗口内容
  2. 然后直到一个页面不再加载或者页面加载到限定值
  3. 停止更新(因为有些流式页面是没有下限的,你只要一直拉下,总会看到新东西)

看看效果图:

image.png

'''
雷学委应对流式页面的爬虫解决秘诀
截屏的核心代码:
'''
def resolve_height(driver, pageh_factor=5):
    js = "return action=document.body.scrollHeight"
    height = 0
    page_height = driver.execute_script(js)
    ref_pageh = int(page_height * pageh_factor)
    step = 150 
    max_count = 15 
    count = 0 
    while count < max_count and height < page_height:
        #scroll down to page bottom
        for i in range(height, ref_pageh, step):
            count+=1
            vh = i
            slowjs='window.scrollTo(0, {})'.format(vh)
            print('[雷学委 Demo]exec js: %s' % slowjs)
            driver.execute_script(slowjs)
            sleep(0.3)
        if i >= ref_pageh- step:
            print('[雷学委 Demo]not fully read')
            break
        height = page_height
        sleep(2)
        page_height = driver.execute_script(js)
    print("finish scroll")
    return page_height
#获取窗口实际高度
page_height = resolve_height(driver)
print("[雷学委 Demo]page height : %s"%page_height)
sleep(5)
driver.execute_script('document.documentElement.scrollTop=0')
sleep(1)
driver.save_screenshot(img_path)
page_height = driver.execute_script('return document.documentElement.scrollHeight') # 页面高度
print("get accurate height : %s" % page_height)
if page_height > window_height:
   n = page_height // window_height #floor
   for i in range(n):
       driver.execute_script(f'document.documentElement.scrollTop={window_height*(i+1)};')
       sleep(1)
       driver.save_screenshot(f'./leixuewei_rank_{i}.png')

代码还是不多哦。

核心思想

  1. 持续滚动截屏窗口内容
  2. 保持为图片(带上下标记)

下面是中间截取的一个图片:

image.png

那么多个图怎么合成一张呢?

我们在代码项目目录中,可以看到这里生成了(如下图的)多张图片。总不能自己动手PS吧?

image.png

首先要理解图片是什么?

图片本质上就是一个2d的像素点的一个矩阵。

我们看到的每张图片,其实就是很多的像素分横向纵向排列,显示出来就是图片了。

好办,合并的思路有了,用numpy库直接来

我们拿上面的代码改造一下:

'''
雷学委应对流式页面的爬虫解决秘诀
截屏的核心代码:
'''
import numpy as np
if page_height > window_height:
   n = page_height // window_height #floor
   base_matrix = np.atleast_2d(Image.open(img_path))
   for i in range(n):
       driver.execute_script(f'document.documentElement.scrollTop={window_height*(i+1)};')
       sleep(1)
       driver.save_screenshot(f'./leixuewei_rank_{i}.png')
       delta_matrix = np.atleast_2d(Image.open(f'./leixuewei_rank_{i}.png'))
       #concentrate the image
       base_matrix = np.append(base_matrix, delta_matrix, axis=0) 
   Image.fromarray(base_matrix).save('./leixuewei_rank_full.png')

牛比吧,就加一点点代码,关键是思路。


代码解析

这里其实就是在截屏循环中不断的吧图片转换为2d矩阵。


然后把多个2d矩阵再追加,这样横向长度不变,但纵向内容追加,形成了一张完整的图片了。


这里就是热榜列表的全屏截图展示了。


总结

整个思路还是很流畅的,代码不到一百行,但是思路不对就做不了, 主要用了下面几个库。


selenium
numpy
Pillow

最后使用爬虫必须谨慎,不要当做儿戏去爬机构网站。你学习也不能拿严肃的网络来刷,这个行为迟早会让你吃上LAO饭!

本文仅作展示目的,对于演示网站有任何异议,请告知修改。

目录
相关文章
|
24天前
|
数据可视化 项目管理
告别文档比对盲区,这个功能学术人一定要知道!
在学术研究和项目管理中,文档版本对比至关重要。传统工具仅限于纯文本比对,难以应对多格式文档的复杂变化。智能比对工具通过上下文感知、语义分析和格式识别,高效捕捉关键变更,显著提升研究效率和项目成功率。
|
4月前
|
机器学习/深度学习 语音技术 开发工具
【独家秘籍】揭秘!如何用阿里云TTS魔法般将文字瞬间变成天籁之音,让你的作品开口说话,震撼人心!
【8月更文挑战第15天】通过阿里云语音合成服务(TTS),开发者可将文本转为自然语音,适用于有声阅读、客服等场景。首先注册并获取AccessKey ID/Secret,然后安装阿里云Python SDK。使用示例代码设置语音参数(如发音人xiaoyun、引擎wavenet),发送请求并保存生成的MP3文件。注意正确认证及异常处理,以确保应用稳定可靠。
384 0
|
2月前
|
算法 Java 程序员
【福利😍】2024年最新103本互联网大厂程序员编程书合集【高清文字版无水印pdf】
推荐优质编程电子书资源,涵盖Python入门、算法设计、Java高并发、Docker、机器学习等领域,适合从小白到高级开发者。书籍包括《编程小白的第一本Python入门书》、《编程珠玑》等,助你提升技能,紧跟技术前沿,在职场中脱颖而出。下载地址含国内外网盘链接,更多资源可访问资料吧网站获取。
213 0
|
6月前
|
JSON 数据格式 网络架构
技术心得:快手的小视频爬取
技术心得:快手的小视频爬取
398 1
|
6月前
|
JSON 数据格式 网络架构
技术心得记录:快手的小视频爬取
技术心得记录:快手的小视频爬取
|
7月前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
机器学习/深度学习 人工智能 自然语言处理
AI模型教你写出秒抓读者眼球的好标题
广告大师大卫·奥格威曾在《一个广告人的自白》中提到:标题在大部分广告中,都是最重要的元素,能够决定读者会不会看这则广告。一般来说,读标题的人比读内人的人多出4倍。换句话说,你所写标题的价值将是整个广告预算的80%。因此对于一篇文章、新闻来说,标题的好坏决定了点击和流量。本文介绍通过ModelScope的AI模型PALM来完成标题/摘要生成
AI模型教你写出秒抓读者眼球的好标题
|
JSON 数据可视化 API
粉丝让我爬取热搜话题,结果做成了实时热搜『跑马灯』可视化
之前有粉丝让我爬取网上热搜话题,根据粉丝的这个提议,我想到了爬取不同平台的热搜话题并做成了一个:**全网实时热搜话题『****跑马灯****』可视化**。 特点:**实时**、**可视化浏览** 这里的热搜数据来源主要是:**微博**和**知乎**,选择这两个平台的目的:1.用户流量大、2.直接的热搜数据Api接口。
271 0
粉丝让我爬取热搜话题,结果做成了实时热搜『跑马灯』可视化
|
机器学习/深度学习 人工智能 Oracle
懒人福音!谷歌AI整理房间、收盘子、叠罗汉,样样拿手!
谷歌AI研究院的研究人员提出了 「Transporter Network」,用全新方式实现3D理解,可以让机械臂更好更快的进行操作。
167 0
懒人福音!谷歌AI整理房间、收盘子、叠罗汉,样样拿手!

热门文章

最新文章