故障补牢贪吃的 Bing 爬虫,限量供应的应对措施

Posted 博客园官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了故障补牢贪吃的 Bing 爬虫,限量供应的应对措施相关的知识,希望对你有一定的参考价值。

相对于【故障公告】,【故障补牢】分享的是园子在发生故障后采取的亡羊补牢措施。在上次被微软 Bing 爬宕机后,我们采取了2个应对措施,然后解除了对 Bing 爬虫的屏蔽。措施1:限流——采用滑动窗口进行限流。措施2:隔离——专用 pod 限制计算资源、专用负载均衡限制带宽

相对于【故障公告】,【故障补牢】分享的是园子在发生故障后采取的亡羊补牢措施。

在上次被微软 Bing 爬宕机后(详见 【故障公告】被放出的 Bing 爬虫,又被爬宕机的园子),我们采取了2个应对措施,然后解除了对 Bing 爬虫的屏蔽。

措施1:限流——采用滑动窗口进行限流

我们之前采用的限流措施没有采用滑动窗口,只能防君子不能防小人,比如限制同一个IP一天只能请求2万次,但如果遇到大胃口的爬虫,1秒请求2万次,虽然没有超过限制,但服务器已趴下。

我们通过 ASP.NET Core 内置的 rate limiting middleware 进行滑动窗口限流,参考博文 ASP.NET Core rate limiting middleware in .NET 7

services.AddRateLimiter(
    _ =>
    
        _.GlobalLimiter = PartitionedRateLimiter.CreateChained(
            PartitionedRateLimiter.Create<HttpContext, string>(
                _ => RateLimitPartition.GetSlidingWindowLimiter(
                    "total",
                    _ => new SlidingWindowRateLimiterOptions()
                    
                        AutoReplenishment = true,
                        PermitLimit = limitOptions.TotalPermitLimit,
                        QueueLimit = 0,
                        Window = TimeSpan.FromSeconds(limitOptions.WindowSize),
                        SegmentsPerWindow = limitOptions.WindowSize,
                        QueueProcessingOrder = QueueProcessingOrder.OldestFirst
                    )),
            PartitionedRateLimiter.Create<HttpContext, string>(
                context => RateLimitPartition.GetFixedWindowLimiter(
                    partitionKey: context.GetUserIp() ?? "unspecified",
                    factory: _ => new FixedWindowRateLimiterOptions
                    
                        AutoReplenishment = true,
                        PermitLimit = limitOptions.PermitLimit,
                        QueueLimit = limitOptions.QueueLimit,
                        Window = TimeSpan.FromSeconds(limitOptions.WindowSize),
                        QueueProcessingOrder = QueueProcessingOrder.OldestFirst
                    )));
        _.OnRejected = (context, _) =>
        
            context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
            return default;
        ;
    );

措施2:隔离——专用 pod 限制计算资源、专用负载均衡限制带宽

借助 k8s 的资源隔离能力,部署专用的 pod 给 Bing 爬虫使用,最多把 pod 爬挂,不会造成服务器宕机,对其他应用 pod 毫无影响。

部署专门的负载均衡给 Bing 爬虫通行,这样可以避免因爬虫抢占带宽而造成其他正常请求无法正常响应,而且可以通过限制带宽控制爬虫的并发请求量以及带宽成本。

Python爬虫之提取Bing搜索的背景图片并设置为Windows的电脑桌面

??鉴于现阶段国内的搜索引擎还用不上Google, 笔者会寻求Bing搜索来代替。在使用Bing的过程中,笔者发现Bing的背景图片真乃良心之作,十分赏心悦目,因此,笔者的脑海中萌生了一个念头:能否自己做个爬虫,可以提取Bing搜索的背景图片并设置为Windows的电脑桌面呢?Bing搜索的页面如下:

技术分享图片
??于是在一个风雨交加的下午,笔者开始了自己的探索之旅。当然,过程是曲折的,但笔者尝试着能把它讲得简单点。
??首先,我们需要借助一些Python模块的帮助,它们是:

  • urllib
  • selenium
  • pywin32

当然,你的电脑上也需要安装PhantomJS, 因为,我们需要动态地爬取网页。

?? 好了,准备工作就绪。接下来就是Python代码时间了,完整的代码如下:

# -*- coding: utf-8 -*-
"""
   此程序用于提取Bing搜索的背景图片并设置为Windows的电脑桌面
"""
from urllib.request import urlretrieve
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
import win32api,win32con,win32gui

#利用PhantomJS加载网页
browser = webdriver.PhantomJS()
# 设置最大等待时间为30s
browser.set_page_load_timeout(30)

url = ‘https://cn.bing.com/‘
try:
    browser.get(url)
except TimeoutException:
    # 当加载时间超过30秒后,自动停止加载该页面
    browser.execute_script(‘window.stop()‘)

# 从id为bgDiv的标签中获取背景图片的信息
t = browser.find_element_by_id(‘bgDiv‘)
bg = t.get_attribute(‘style‘)

# 从字符串中提取背景图片的下载网址
start_index = bg.index(‘(‘)
end_index = bg.index(‘)‘)
img_url = bg[start_index+1: end_index]

# 下载该图片到本地
img_path = ‘E://Bing.jpg‘
urlretrieve(img_url, img_path)

# 将下载后的图片设置为Windows系统的桌面
# 打开指定注册表路径
reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\Desktop", 0, win32con.KEY_SET_VALUE)
# 最后的参数:2拉伸,0居中,6适应,10填充,0平铺
win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "2")
# 最后的参数:1表示平铺,拉伸居中等都是0
win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0")
# 刷新桌面
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE)

运行这个程序,稍等片刻,我们就会发现自己的电脑壁纸已经换成了今天Bing搜索页面的背景图片,真的是very amzing.

技术分享图片

本次分享到此结束,欢迎大家交流~~



以上是关于故障补牢贪吃的 Bing 爬虫,限量供应的应对措施的主要内容,如果未能解决你的问题,请参考以下文章

布道微服务_16服务端故障的紧急避险措施

故障原因归类分析及预防和应对措施

故障公告被放出的 Bing 爬虫,又被爬宕机的园子

11.6 实施风险应对-转自石志国

Python爬虫之提取Bing搜索的背景图片并设置为Windows的电脑桌面

只有能落实到“人”的风险应对措施才能发挥作用