Selenium实战:高效爬取Google Images的猫猫图片

Ardupilot姿态控制详解(完结篇) 本文主要是对过去写的一些APM中姿态控制流程及函数博文的汇总。 按照之前写的博文以及个人认为的学习顺序,给出APM姿态控制器的学习顺序如下: APM姿态旋转理论基础 Ardupilot姿态控制器 PID控制流程(整定后的P控制器) 详解APM的开方控制器sqrt_controller Ardupilot前馈及平滑函数input_euler_angle_roll_pitch_yaw解析 Ardupilot倾转分离函数thrust_heading_rotation_angles Ardupilot四元数姿态控制 阅读详情

1. 为什么用Selenium来“抓”猫猫图?

你可能试过用普通的爬虫工具去抓取Google Images上的图片,结果发现要么啥也抓不到,要么抓回来的是一堆看不懂的代码,根本不是你要的图片。这事儿我刚开始也头疼过,后来发现,问题出在Google Images这个页面的“脾气”上。

它不像一个静态的、把所有东西都一次性给你的老式网页。你打开它,搜索“cat”,它先给你加载几十张图。当你用鼠标滚轮往下滑,想看更多的时候,神奇的事情发生了:页面没有刷新,也没有跳转,但新的图片就像变魔术一样,“唰”地一下出现在了你眼前。这种技术,我们通常叫它“动态加载”或者“无限滚动”。对于传统的、只抓取网页初始HTML代码的爬虫(比如用requests库加BeautifulSoup)来说,它们只能看到你第一眼看到的那几十张图,后面“变”出来的那些,它们根本“看”不见。

这时候,就该Selenium登场了。你可以把它想象成一个由代码操控的“机器人浏览器”。它能像真人一样,打开Chrome(或者Firefox等),输入网址,滚动页面,点击按钮。我们写的Python代码,就是指挥这个机器人浏览员的“遥控器”。因为Selenium操作的是真实的、渲染完毕的浏览器页面,所以页面上动态加载出来的所有内容,包括那些随着滚动才出现的猫猫图片,它都能“看”得一清二楚,并且能从中把图片的地址给“抠”出来。这就是为什么我们要用Selenium来对付Google Images——它用魔法(动态加载),我们就用更强的魔法(模拟真人操作的浏览器)来打败它。

这个方法的另一个巨大好处是“所见即所得”。你在浏览器里能看到什么,Selenium就能抓到什么,几乎不存在误判。对于咱们这个“抓猫猫图”的小项目来说,目标明确,工具趁手,再合适不过了。接下来,我就带你一步步搭建这个“机器人”,并把它调教得既高效又聪明,避开那些我当初踩过的坑。

2. 开工前的准备:安装与配置

工欲善其事,必先利其器。在开始写代码指挥“机器人”之前,我们得先把“机器人”本体和它的“操作手册”准备好。这里主要需要两样东西:Selenium库,以及一个浏览器驱动。

2.1 安装Selenium库

这一步最简单。打开你的命令行(Windows上是CMD或PowerShell,Mac或Linux上是Terminal),输入下面这行命令,回车:

pip install selenium

如果你用的是Python3,并且系统里同时有Python2和Python3,那可能需要用pip3:

pip3 install selenium

安装过程通常很快,看到“Successfully installed selenium-xx.xx.xx”就表示搞定了。我实测过很多次,网络正常的话基本不会出问题。

2.2 下载并配置浏览器驱动

这是稍微容易卡住的一步,但只要你跟着做,一分钟就能解决。Selenium需要调用一个真实的浏览器来工作,而它和浏览器之间的“翻译官”,就是浏览器驱动。我们以最常用的Chrome浏览器为例。

首先,你需要确认自己电脑上Chrome的版本。打开Chrome,点击右上角的三个点 -> 帮助 -> 关于Google Chrome。记下那个版本号,比如“版本 128.0.6613.138”。

然后,我们需要下载对应版本的ChromeDriver。这里我强烈推荐去淘宝的镜像站下载,速度比官方快得多。地址是:https://registry.npmmirror.com/binary.html?path=chromedriver/。打开这个页面后,找到与你Chrome版本号前三位一致的文件夹。比如你的Chrome是128.0.6613.xxx,就进入128.0.6613.x/这个目录(通常选最新的子版本就行)。

根据你的操作系统,下载对应的压缩包:

  • Windows系统:下载 chromedriver_win32.zip
  • Mac系统(Intel芯片):下载 chromedriver_mac64.zip
  • Mac系统(Apple Silicon芯片):下载 chromedriver_mac_arm64.zip
  • Linux系统:下载 chromedriver_linux64.zip

下载完成后,解压压缩包,你会得到一个名为 chromedriver(Windows下是chromedriver.exe)的文件。接下来是关键:把这个文件放在一个系统能够找到的地方。有三种常见方法:

  1. (推荐)放在Python的Scripts目录下:这个目录通常在你的Python安装路径里,比如 C:\Users\你的用户名\AppData\Local\Programs\Python\Python39\Scripts\ 或者 D:\python\Scripts\。放这里之后,你可以在命令行任何位置直接运行chromedriver。
  2. 放在项目文件夹里:直接把chromedriver.exe扔到和你即将要写的Python脚本同一个文件夹里。这样代码里指定路径最简单。
  3. 添加到系统环境变量PATH中:这是一个一劳永逸的方法,但步骤稍复杂。你可以把chromedriver.exe所在的文件夹路径(比如D:\webdrivers\)添加到系统的PATH环境变量里。具体怎么加,可以搜索“Windows添加环境变量”或“Mac添加PATH”,教程很多。

为了最省事,我一般就用第二种方法,项目文件夹里干干净净,驱动和脚本在一起。配置好之后,你可以打开命令行,切换到驱动所在的目录,输入 chromedriver(Windows下输入chromedriver.exe)回车。如果出现“Starting ChromeDriver...”等字样,并且没有立刻关闭,说明驱动已经准备好了。按Ctrl+C可以停止它。

3. 核心代码拆解:一步步打造爬虫机器人

环境准备好了,现在我们来写代码,给这个“机器人”注入灵魂。我会把完整的代码拆成几个功能模块,一块一块讲清楚,你完全可以跟着我的注释和解释,自己敲一遍,理解会更深刻。

3.1 初始化与浏览器启动

我们用一个类来组织代码,这样结构清晰,以后想爬别的关键词也方便复用。首先,导入必要的工具包,并设定好搜索目标。

from selenium import webdriver
import time
import os
import requests

# 你想搜索什么,就在这里改。今天我们的主角是‘cat’!
keyword = 'cat'
# 拼接出Google Images的搜索网址
url = f'https://www.google.com.hk/search?q={keyword}&tbm=isch'

class CatImageCrawler:
    def __init__(self):
        self.url = url  # 把网址存为类的一个属性

这里我们定义了一个类CatImageCrawler。__init__是初始化方法,创建这个爬虫对象时,它会自动把我们要爬的网址存好。f‘...{keyword}...’ 是Python的格式化字符串,非常方便,它会将变量keyword的值(也就是‘cat’)填充到字符串里,形成完整的网址。

接下来,我们要启动“机器人浏览器”了。

    def init_browser(self):
        # 创建Chrome的配置选项
        chrome_options = webdriver.ChromeOptions()
        # 这个参数可以关闭浏览器顶部“Chrome正受到自动测试软件控制”的提示栏,让环境更干净
        chrome_options.add_argument("--disable-infobars")
        # 如果你把chromedriver放在了项目文件夹,需要指定路径,例如:
        # browser = webdriver.Chrome(executable_path='./chromedriver', options=chrome_options)
        # 如果已经配置了PATH环境变量或放在Scripts目录,直接这样写就行:
        browser = webdriver.Chrome(options=chrome_options)

        # 命令浏览器打开我们的目标网址
        browser.get(self.url)
        # 最大化窗口,确保一屏能看到更多图片,方便我们后续抓取
        browser.maximize_window()
        # 等待2秒,让页面充分加载
        time.sleep(2)
        return browser  # 把这个启动好的浏览器对象返回,后面要用

webdriver.Chrome(options=chrome_options) 这一行就是召唤Chrome浏览器的咒语。browser.get() 命令它访问目标网址。maximize_window() 让窗口最大化,这是一个小技巧,因为页面布局可能会随着窗口大小变化,最大化能获得更稳定的元素定位。最后time.sleep(2)是让程序等一下,给网络和浏览器一点时间把图片加载出来,避免后续操作时页面元素还没准备好。

3.2 模拟滚动与图片抓取逻辑

这是整个爬虫最核心的部分:如何让页面不断滚动,并把滚动后新出现的图片地址抓出来。

    def download_images(self, browser, scroll_times=10):
        # 创建一个文件夹来存我们可爱的猫猫图片
        save_path = './cat_pictures'
        if not os.path.exists(save_path):
            os.makedirs(save_path)

        # 用一个集合(Set)来存储已经抓到的图片URL。集合天生能去重,比用列表效率高。
        downloaded_urls = set()
        img_count = 0  # 给下载的图片编个号
        current_scroll_position = 0  # 记录当前滚动到的位置

        print("开始滚动页面并抓取图片...")
        for i in range(scroll_times):
            # 每次滚动,把滚动位置增加800像素。这个数可以调整,模拟人类滚动的幅度。
            current_scroll_position += 800
            # 这是一段JavaScript代码,通过它来控制浏览器滚动条的位置
            scroll_script = f"window.scrollTo(0, {current_scroll_position});"
            browser.execute_script(scroll_script)
            # 滚动后等待1.5秒,让新图片加载出来。时间太短可能图没加载完,太长则效率低。
            time.sleep(1.5)

            # 魔法时刻:找到当前浏览器窗口里所有的<img>标签
            img_elements = browser.find_elements(By.TAG_NAME, 'img')

            # 遍历每一个图片元素
            for element in img_elements:
                # 获取图片最关键的属性——它的网络地址(src)
                img_url = element.get_attribute('src')

                # 关键过滤步骤开始!
                if img_url and isinstance(img_url, str):
                    # 过滤条件1:URL长度。Google Images前几张推荐图或广告图的URL长得离谱,不是直接图片。
                    if len(img_url) > 200:
                        continue
                    # 过滤条件2:检查URL中是否包含‘images’字样。真正的图片链接通常都有这个特征。
                    # 注意:Google的Logo的src里没有‘images’,会被过滤掉。
                    if 'images' not in img_url:
                        continue
                    # 过滤条件3:去重。如果这个URL我们已经下载过了,就跳过。
                    if img_url in downloaded_urls:
                        continue

                    # 通过了所有过滤!现在下载它
                    try:
                        downloaded_urls.add(img_url)  # 先加入集合,标记为已下载
                        filename = os.path.join(save_path, f"{img_count}.jpg")
                        # 使用requests库发起网络请求,获取图片的二进制数据
                        response = requests.get(img_url, timeout=10)
                        response.raise_for_status()  # 检查请求是否成功(状态码200)

                        # 将二进制数据写入文件,这就是保存图片的过程
                        with open(filename, 'wb') as f:
                            f.write(response.content)

                        img_count += 1
                        print(f'成功下载第 {img_count} 张图片: {filename}')
                        # 礼貌地等待0.3秒再下载下一张,避免请求过于频繁
                        time.sleep(0.3)

                    except Exception as e:
                        # 如果某张图片下载失败,打印错误信息,但不要中断整个程序
                        print(f'下载失败(URL: {img_url[:50]}...): {e}')
                        continue

        print(f"所有轮次滚动完成。共尝试抓取 {len(downloaded_urls)} 个唯一URL,成功下载 {img_count} 张图片。")

这段代码里有几个我踩过坑后总结的精髓点:

  1. 用集合(set())而不是列表(list())存URL:这是为了高效去重。集合查找元素的速度极快,能避免我们反复下载同一张图。原始文章里用列表,每次都要遍历整个列表来检查是否重复,图片多了会非常慢。
  2. 三层过滤网:
    • 长度过滤:直接丢弃超长的URL,它们通常是广告或推荐卡片,不是直接的图片文件。
    • 关键词过滤:通过判断‘images’是否在URL中,可以精准地过滤掉Google的Logo、按钮图标等无关图片。
    • 去重过滤:利用集合的特性,保证每张图只下一次。
  3. browser.execute_script():这是Selenium执行JavaScript代码的方法。我们用window.scrollTo来精确控制滚动位置,模拟人的滚动行为。
  4. 异常处理(try...except):网络请求总有可能失败(图片失效、网络波动)。用try包住下载过程,即使某一张图挂了,也不会影响后续所有图片的抓取,程序会继续运行。

3.3 组装与运行

最后,我们把各个部分组装起来,并提供一个简单的启动入口。

    def run(self):
        print(f"启动爬虫,目标关键词:'{keyword}'")
        browser = self.init_browser()  # 启动浏览器
        try:
            self.download_images(browser, scroll_times=15)  # 开始滚动和下载,这里设定了滚动15次
        except KeyboardInterrupt:
            print("\n用户中断了程序。")
        except Exception as e:
            print(f"爬虫运行过程中出现未知错误: {e}")
        finally:
            # 无论成功还是出错,最后都要关闭浏览器,释放资源
            browser.quit()
            print("浏览器已关闭。")

# 如果直接运行这个脚本,就启动爬虫
if __name__ == '__main__':
    crawler = CatImageCrawler()
    crawler.run()

run方法就像总指挥。try...except...finally结构确保了程序的健壮性:即使你中途想用Ctrl+C停止,或者程序意外出错,finally块里的browser.quit()都会执行,帮你把打开的浏览器窗口关掉,避免它留在后台占用内存。

4. 优化与实战技巧:让你的爬虫更稳更快

把上面的代码跑起来,你应该已经能收获上百张猫猫图片了。但作为一个有追求的“铲屎官”(指爬虫工程师),我们肯定不满足于此。下面分享几个我实战中总结的优化技巧,能让你的爬虫更智能、更隐蔽、更高效。

4.1 处理页面懒加载与等待策略

你有没有发现,有时候滚动到底部,图片加载会特别慢,或者出现灰色的占位符?这是因为现代网站大量使用“懒加载”技术:图片只有快要进入用户视野时,才去加载真实的高清图。我们的爬虫滚动得太快,可能图片还没加载出来,我们就去抓它的src,抓到的可能是一个模糊的预览图地址或者干脆是空值。

解决方案是使用更聪明的等待。 Selenium提供了两种主要的等待方式:

  • 隐式等待:browser.implicitly_wait(10)。这告诉浏览器,在查找任何一个元素时,如果没立刻找到,就最多等10秒,期间会不断重试。这是一个全局设置。
  • 显式等待:针对某个特定条件进行等待,比如等待某个图片元素加载完成。这需要用到WebDriverWait。

对于我们的场景,可以在每次滚动后,加入一个显式等待,等待页面底部出现新的图片元素。这里我们稍微修改一下滚动循环里的代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ... 在download_images方法的滚动循环内 ...
current_scroll_position += 800
scroll_script = f"window.scrollTo(0, {current_scroll_position});"
browser.execute_script(scroll_script)

# 优化点:等待新图片出现。这里等待最多5秒,直到页面至少比之前多了一个img标签。
try:
    wait = WebDriverWait(browser, 5)
    # 这个条件比较宽松,实际可以根据需要调整,比如等待某个特定class的图片加载出来
    wait.until(lambda driver: len(driver.find_elements(By.TAG_NAME, 'img')) > previous_img_count)
except:
    print(f"第{i+1}次滚动后,新图片加载可能较慢或已到底部。")
    # 即使没等到,也继续执行,不中断
finally:
    previous_img_count = len(browser.find_elements(By.TAG_NAME, 'img'))
    time.sleep(1)  # 额外再给一点缓冲时间

这个技巧能显著提高抓取图片的完整性和质量,避免抓到占位符。

4.2 反反爬策略与请求头模拟

虽然Selenium模拟的是真人操作,但Google这类大厂依然有办法检测出一些自动化行为。长时间、高频率的访问可能导致IP被暂时限制,或者弹出验证码。我们可以通过一些设置,让我们的“机器人”看起来更像一个真人用户。

  1. 修改Chrome选项:在init_browser方法里,我们可以添加更多参数。
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--disable-infobars")
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")  # 隐藏自动化控制特征
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 同上
    chrome_options.add_experimental_option('useAutomationExtension', False)
    # 可以添加一个真实的User-Agent,但Selenium会自动使用当前Chrome版本的UA,通常不需要改。
    # chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...')
    
  2. 控制请求频率:我们已经做了两处等待:滚动后等待页面加载(time.sleep(1.5)),以及每下载一张图后等待(time.sleep(0.3))。千万不要为了图快而把这些等待去掉! 这是最基本的礼貌,也是对目标网站服务器的尊重。你可以微调这些时间(比如改成1秒和0.5秒),但不要进行无间隔的狂轰滥炸。
  3. 使用代理IP(高级):如果你需要大规模爬取,可以考虑轮换代理IP。这在Selenium中可以通过chrome_options.add_argument('--proxy-server=http://ip:port')来实现。但请注意,寻找稳定、可靠的免费代理本身就是一个技术活,且本教程主要面向初学者,这里就不深入展开了。对于抓取几百张猫猫图来说,正常速度下的单IP访问完全足够。

4.3 错误处理与日志记录

一个健壮的程序必须能妥善处理各种意外。我们的代码里已经有了基本的try...except来捕获下载错误。我们可以把它做得更好。

  • 细分异常类型:requests.get()可能会抛出连接超时、拒绝连接、HTTP错误(如404)等。我们可以捕获更具体的异常,并做出不同反应。
    try:
        response = requests.get(img_url, timeout=10)
        response.raise_for_status()  # 如果状态码不是200,会抛出HTTPError异常
        # ... 保存图片 ...
    except requests.exceptions.Timeout:
        print(f"超时:{img_url[:50]}...")
    except requests.exceptions.ConnectionError:
        print(f"连接错误:{img_url[:50]}...")
    except requests.exceptions.HTTPError as e:
        print(f"HTTP错误(状态码 {response.status_code}): {img_url[:50]}...")
    except Exception as e:
        print(f"未知下载错误: {e}")
    
  • 记录日志到文件:与其只在屏幕上打印,不如把成功和失败的信息都记录到一个日志文件里,方便事后分析。
    import logging
    logging.basicConfig(filename='cat_crawler.log', level=logging.INFO,
                        format='%(asctime)s - %(levelname)s - %(message)s')
    # 在成功下载后
    logging.info(f'成功下载第 {img_count} 张图片,URL: {img_url}')
    # 在下载失败后
    logging.warning(f'下载失败,URL: {img_url}, 错误: {e}')
    

这些优化能让你的爬虫从“能用”升级到“好用且可靠”。最后,把所有这些代码块按顺序组合在一起,你就得到了一个功能完整、经过优化的Google Images猫猫图片爬虫。运行它,泡杯咖啡,回来就能看到一个装满可爱猫咪的文件夹了。记住,技术是用来创造乐趣和价值的,请务必遵守网站的服务条款,合理、有节制地使用爬虫。

家用智能监控摄像机如何使用NAS进行存储/备份(小米智能摄像机如何解决群晖 / 飞牛 NAS 识别失败、文件目录不显示问题) 小米摄像头NAS存储总出问题?🤯 别慌!本文揭秘NAS底层逻辑,群晖、飞牛实战指南。手把手教你排查解决所有难题,轻松搞定监控录像安全备份!🔒 阅读详情

相关推荐

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

总的来说,Long-CLIP是一个改进的视觉-语言预训练模型,它通过知识保留的位置上插值和主要成分匹配策略,有效解决了原始CLIP模型在处理长文本输入时的限制。这一模型不仅在长文本图像检索任务中表现出色,而且在零样本图像分类任务中保持了与原始CLIP相当的性能,同时还能以即插即用的方式增强图像生成任务中的长文本处理能力。

Angelina_Jolie的博客 1380

GEO如何控制AI搜索爬虫?robots.txt、noindex与训练抓取权限实战

GEO中的爬虫访问控制需区分搜索抓取与模型训练抓取,因二者目的不同。OpenAI的OAI-SearchBot与GPTBot、Google的Googlebot与Google-Extended可独立配置。robots.txt控制抓取权限,noindex控制索引,二者不可混淆;仅靠Disallow无法确保内容不被索引。配置时应避免通配符规则叠加错误,且需结合服务器认证保障安全。验证可通过Python robotparser工具及实际日志分析。关键在于:规则表达意图≠平台必然执行,需依平台文档精准配置。

AB 客·外贸 B2B GEO 系统化提供商的博客 242

手把手教你设计STM32的JTAG电路:从原理图到PCB布局(含JLINK连接详解)

本文详细介绍了STM32的JTAG电路设计全流程,从核心原理、接口规范到PCB布局布线技巧,特别包含JLINK调试器的连接与配置方法。通过信号滤波、上拉配置和防反接保护等关键设计要点,帮助开发者构建稳定可靠的JTAG调试环境,提升嵌入式开发效率。

weixin_29159441的博客 392

SEO 正常、AI 不引用:一次站点对照体检的复盘

我们的站是标准的外贸独立站:静态页面、sitemap、结构化数据、内链都做过,SEO 该做的动作基本齐了。所以这次不是从头查,是做一次对照:同一批页面,搜索引擎看到什么,AI 看到什么。用 GSC 的 URL Inspection 跑了全量,75 个页面,16 个被收录,51 个是 URL unknown to Google,8 个是已发现未抓取。我们自己的外贸站,Google 收录正常,品牌词能搜到,页面也能打开。十个采购问题可以先列出来:认证、产能、交期、MOQ、包装、验厂、付款、样品、物流、售后。

Ly803124的博客 216

基于STM32的智能水温控制系统设计

智能水温控制系统广泛应用于家庭、工业、农业等多个场景,尤其在热水器、恒温泳池和地暖系统中,通过实时监测和调节水温,提高设备的效率和用户的舒适度。本文基于STM32微控制器设计了一个智能水温控制系统,能够实时监测水温、用户设置温度,并根据需要控制加热器或冷却装置,确保水温维持在设定范围内。系统能够根据用户设定自动控制加热和冷却设备,确保水温维持在舒适的范围内,并通过OLED屏实时显示水温信息。在生成的项目基础上,编写水温监测、目标温度设定、加热器和冷却装置控制、OLED数据显示以及超温报警的代码。

2401_88410555的博客 2476

伪距单点定位算法原理以及利用最小二乘法计算实例

即该公式:建立下列代价函数满足最佳估值的条件为:即:可解得未知参数 X 的最佳估值由于每个可见卫星观测量的精度可能不一样,这时,需要对不同观测量赋予一个权重系数,称为加权。

qq_43381998的博客 1万+

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 426

Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案

AI Agent作为当前人工智能应用开发的核心范式,通过赋予大语言模型(LLM)自主规划、工具调用和环境交互能力,正在重塑软件智能化进程。其技术原理基于智能体架构,通过提示工程、函数调用和记忆机制,将LLM从单纯的文本生成器转变为能够执行复杂任务的工作流引擎。这一技术价值在于显著降低了构建智能应用的开发门槛,同时保持了高度的灵活性和可扩展性。在实际应用场景中,AI Agent广泛落地于智能客服、代码助手、数据分析自动化等领域,成为连接大模型能力与具体业务需求的关键桥梁。本文聚焦的Koog框架,正是针对JVM

weixin_42594419的博客 397

用短效代理池构建Python爬虫采集脚本的实践

本文分享了基于短效动态代理构建本地代理池的爬虫数据采集实战方案。针对高频请求易被封IP的问题,通过API批量获取存活3分钟的短效代理,配合轮换与重试策略,有效提升采集稳定性。以Python脚本为例,演示了从代理获取、随机轮换到并发采集全流程,并强调选型需关注可用率、接口响应速度与计费模式匹配度。实操建议:小规模验证后放量,确保代理质量与任务节奏协同,实现高效、低成本的数据采集。

bufengwangluo的博客 191

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1742

Swift 也能做爬虫:URLSession、HTML 解析与数据可视化全流程解析

在苹果生态中,Swift 不只是用于 iOS、macOS 客户端开发,借助并发能力、HTML 解析库与原生 Swift Charts,我们可以实现一套端到端数据采集、清洗、可视化的完整链路。不同于 Python 爬虫成熟的数据分析栈,Swift 爬虫更适合 macOS 本地工具、iOS 数据采集 App、Vapor 后端数据统计场景;爬取网页公开数据后,直接在 SwiftUI 中渲染折线图、柱状图,免去跨语言数据传递,类型安全、性能可控。

Z_suger7的博客 365

跟踪雷达点迹处理

1,点迹定义: 假设研究对象为位置x和速度v,预测值是根据这一时刻的x值、v值来预测下一时刻的x、v;测量值是根据传感器也就是雷达得到的,因为各种误差的存在,这两个值都不准确,所以把他们加权融合,得到一个新的量—状态值。 点迹就是所谓的测量值,由雷达对同一个目标探测到的一系列点(假设目标静止,但由于误差的存在,会扫描出不止一个点),航迹对应状态值,是点迹和预测轨迹的加权融合。 2,雷达信号和点迹处理关系: 3,点迹航迹处理流程 4,仿真 clear all; RealData=G

wangjie36的博客 1万+

Node.js AI 就绪度体检:一个脚本查清页面有没有为 AI 爬虫准备好

本文介绍一个无需依赖的 Node.js 脚本,一键检测网页对 AI 爬虫的友好度。通过检查 robots.txt 是否允许 GPTBot/ClaudeBot、是否存在 llms.txt、结构化数据(JSON-LD/FAQ)、标题层级与正文字数,全面评估页面的 AI 就绪度,助力内容被 AI 正确抓取与理解。

SEO_juper的博客 246

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

沈阳 GEO 可验落点:爬虫日志与索引怎么核

这一条解决不了引用问题,但能解决「事后查不到」的问题——验收时拿不出原始日志的一方,通常也拿不出复盘结论。工程侧的落实点是元数据字段与页面可见说明,这两处都可以在源码里核到,属于能在验收单上打勾的一项。参考来源:Nginx 访问日志、站点地图与 robots.txt、各平台回答页面的来源链接、账号页面源码中的结构化数据与署名节点、《人工智能生成合成内容标识办法》(2025-09-01 施行)。字段缺失的,后面所有归因都是猜的。核对的顺序是先确认「来过」,再确认「拿走了什么」,再看「有没有进索引」。

2601_96681240的博客 184

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

医美医生个人IP的可抓取性:实体建模、结构化标记与索引原理

医美医生个人IP能否被大模型引用,关键在于可抓取性与结构化表达。通过静态URL、NAP一致性校验、Python生成并校验Physician JSON-LD标记,结合主动推送sitemap与权威信源互证,实现页面可抓取、可解析、可归属。落地需遵循合规边界,避免疗效承诺,聚焦执业注册信息核验。该方法使医生在AI问答中实现精准识别与推荐,是AI品牌营销中提升专业实体可见性的核心技术路径。

JBGT2026的博客 149

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

robots.txt 写不出 Brave:网站还剩多少退出权

索引被转售给AI公司后,不具名爬虫让基于身份的屏蔽规则失效,退出Brave索引等同退出Google。GEO优化先做site自查,内容自带日期与适用范围。

charliecarr的博客 220

AI友好型网站实战:下一代robots.txt?部署 llms.txt 引导AI爬虫的实战指南

本文由GEO服务商司曜珩GEO详解AI时代新标准——llms.txt的实战部署。作为专为大语言模型设计的“核心内容导航图”,llms.txt通过简洁的Markdown结构,引导AI优先抓取产品目录、资质文件、白皮书等高价值页面,提升信息提取效率。文章提供标准模板、部署步骤(根目录上传+HTML引用)及避坑指南,强调聚焦20-50个核心链接、定期更新、不替代sitemap。建议B2B制造与专业服务企业立即部署,迈向真正意义上的AI友好型网站。

162

数据集市场 VS 自己写爬虫:什么时候该买,什么时候该抓?

数据团队面临“买还是抓”的核心决策:标准化、批量化需求优先采购数据集,高时效、定制化或长尾数据则评估自建采集。应从时效性、定制化与成本结构三维度比较,结合样本验证与总拥有成本(TCO)分析。推荐组合策略——用市场数据打底,通过Scraper Studio等工具按需抓取特殊字段,兼顾效率与灵活性。最终决策可收敛为三个问题:是否有现成数据?能否满足时效?是否需要定制字段?明确需求后,答案自现。

白洞,白色的明天在等着我们 1万+

什么是网络爬虫?完全入门指南

网络爬虫是自动化收集网页公开数据并转化为结构化信息的工具,通过发送请求、解析HTML、提取与清洗数据实现高效信息采集。其核心在于数据提取,区别于侧重网页发现的网络爬虫。广泛应用包括电商价格监控、潜在客户开发、SEO分析及房地产与金融数据聚合,助力企业实时获取市场动态,提升决策效率。

2603_96896892的博客 250

免逆向直接抓包!利用 DrissionPage 原生数据包监听打穿前端混淆加密

纯 HTTP 请求跑得飞快但难以应对动态风控与复杂加密,传统 Selenium 虽能渲染却笨重且极易暴露特征。国产框架 DrissionPage 另辟蹊径,底层通过 CDP 协议直连 Chromium 内核彻底规避检测,创新性地将轻量请求与浏览器渲染收敛于同一套 API,并支持网络数据包静默监听。本文从底层通信、动静双模切换、免逆向拦截到隧道代理生产集成展开全景实测,为你剖析其内存边界与工业级“混合动能”落地方案。

ip16yun的博客 168

Nginx

Nginx 是7层 Web 服务器 + 反向代理服务器,常做入口网关,核心职责SSL,静态资源缓存、DDoS 防护、全局负载均衡。区别Gateway作为微服务的“管家”。接收来自 Nginx 的请求,根据业务逻辑进行鉴权(如校验 Token)、路由到具体的微服务(如订单服务、用户服务),并实施精细的限流策略。

248

Spider-第01讲-第一个爬虫与那条不能跨的线

本讲通过自建靶场,带你亲手发起首个HTTP请求,理解status_code、resp.url、content与text区别及编码问题。重点揭示爬虫与浏览器的本质差异:User-Agent等请求头是反爬第一道防线。通过模拟403拒绝,直观感受“伪装”与“合规”的边界。强调技术之上必须守住法律与伦理底线——爬虫不是越界工具,而是有责任的探索。

u011697185的专栏 255

常用python爬虫库介绍与简要说明

本文介绍了一些常用的python爬虫库其中包括python网络库,python网络爬虫框架,python HTML解析,python文本处理,python 自然语言处理

2601_96798737的博客 113

企业API安全防护:接口防刷、防爬、防篡改

API安全的三个高频问题——防刷、防爬、防篡改,它们的攻击模型和防护落点完全不同。这是防篡改最容易被忽视的一环:金额可以签名,但`isAdmin`、`orderStatus`、`userLevel`这类字段,正确做法是服务端完全忽略客户端传值,由服务端根据业务逻辑自行判定。这些能力大多可以先用云WAF和API网关快速补齐边界防护,但业务层的鉴权、幂等、状态校验是绕不过去的代码改造,别指望靠产品配置解决逻辑漏洞。统一接入API网关,做全局限流、签名校验、时间窗过滤、参数基础校验(类型、长度、枚举范围)。

weixin_Ruisucs04的博客 305

商品页AI读不读得到:电商站爬虫可达性的分离统计实验(2026)

给电商站做 AI 可见度优化,第一步不是写内容,是先搞清楚一件事:你的商品页,AI 到底读不读得到。背景是最近的一组扫描数据:某头部电商平台已在其 robots.txt 里对 12 家主流 AI 爬虫全部 Disallow——训练类、索引类、用户触发类一概不留,与行业「留索引类、放用户触发类」的精细做法相反;同一口径下,全球 Top 2000 域名中已有 19.1% 屏蔽至少一个主流 AI 爬虫。

2601_96067177的博客 233
上一篇: JS实现中文拼音首字母索引与动态搜索优化方案
下一篇: Android墨水屏开发实战:如何用黑白红色阶算法优化电子书阅读体验
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值