Go和JavaScript结合使用:抓取网页中的图像链接

news/2024/7/19 9:17:14 标签: golang, javascript, 开发语言, python, 爬虫

DALL·E 2023-10-11 15.19.20 - Illustration of a pristine white background with a large '16YUN' Logo centered. Beside the logo are three small icons representing speed, security, an.png

前言

在当今数字化时代,数据是金钱的源泉,对于许多项目和应用程序来说,获取并利用互联网上的数据是至关重要的。其中之一的需求场景是从网页中抓取图片链接,这在各种项目中都有广泛应用,特别是在动漫类图片收集项目中。

需求场景:动漫类图片的项目需求

假设我们正在开发一个动漫类图片收集项目,我们需要从百度图片搜索结果中获取相关图片的链接。这些链接将用于下载图像并建立我们的图片数据库。这个需求背景可以应用于各种领域,从艺术研究到娱乐资讯。

Go和JavaScript结合优点

Go和JavaScript结合使用具有多个优点,尤其适用于网页内容的抓取和解析任务:

  1. 并发处理:Go是一门强大的并发编程语言,能够轻松处理多个HTTP请求,从而提高抓取速度。
  2. JavaScript处理:JavaScript在网页加载后可以修改DOM(文档对象模型),这对于抓取那些通过JavaScript动态加载的图像链接非常有用。
  3. 丰富的库支持:Go和JavaScript都有丰富的库和工具生态系统,可以轻松解决各种问题。
  4. 性能和效率:Go以其高效的性能而闻名,JavaScript则是Web前端的标配,两者结合可以在爬取任务中取得理想的效果。

反爬应对策略

在进行网络爬取时,常常会遇到反爬机制,这些机制旨在保护网站免受不合法的数据采集。以下是应对反爬机制的策略:

  1. 使用代理:配置代理服务器,隐藏您的真实IP地址,降低被封禁的风险。在完整爬取代码中,我们将使用以下代理信息:
  2. 模拟用户行为:通过设置合法的用户代理(User-Agent)头,使请求看起来像是由真实的浏览器发出的,而不是爬虫
  3. 限速:避免过于频繁的请求,通过添加延迟或使用定时器来控制爬取速度,以减少被检测到的风险。
  4. 处理验证码和登录:某些网站可能会要求用户输入验证码或进行登录才能访问内容,需要相应的代码来处理这些情况。

爬取流程

爬取流程可以分为以下步骤:

  1. 使用Go发送HTTP请求,获取百度图片搜索结果页面的HTML内容。
  2. 使用JavaScript解析页面,提取图像链接。

下面是爬取流程的详细描述:

步骤1:发送HTTP请求

首先,我们使用Go来发送HTTP请求,以获取百度图片搜索结果页面的HTML内容。这里使用Go标准库的net/http包来实现,同时配置代理信息:

proxyHost := "www.16yun.cn"
proxyPort := "5445"
proxyUser := "16QMSOML"
proxyPass := "280651"

proxyUrl := fmt.Sprintf("http://%s:%s@%s:%s", proxyUser, proxyPass, proxyHost, proxyPort)
proxy := func(_ *http.Request) (*url.URL, error) {
    return url.Parse(proxyUrl)
}

transport := &http.Transport{
    Proxy: proxy,
}

client := &http.Client{
    Transport: transport,
}

url := "https://www.baidu.com/images/search?q=anime"
resp, err := client.Get(url)
defer resp.Body.Close()

if err != nil {
    log.Fatal(err)
}

body, err := ioutil.ReadAll(resp.Body)

if err != nil {
    log.Fatal(err)
}

// 此时,body中包含了百度图片搜索结果页面的HTML内容

步骤2:使用JavaScript解析页面

在这一步骤中,我们使用一个Go库,例如github.com/rogchap/v8go,来执行JavaScript代码并解析页面。以下是一个示例代码片段,演示如何使用JavaScript来提取图像链接:

ctx, _ := v8go.NewContext(nil)
_, _ = ctx.RunScript(`
    var images = document.querySelectorAll('img');
    var imageLinks = [];
    for (var i = 0; i < images.length; i++) {
        var src = images[i].src;
        imageLinks.push(src);
    }
    imageLinks;
`, "getImages.js")

result, _ := ctx.RunScript("getImages();", "getImagesCaller.js")
imageLinks, _ := result.ToSlice()

// 现在,imageLinks中包含了从页面中提取的图像链接

总结

最后,通过将抓取的图像链接用于下载图像,您可以建立您的动漫图片收集项目。请注意,此示例中的代码仅用于演示目的,实际项目中可能需要更多的功能和改进。


http://www.niftyadmin.cn/n/5158989.html

相关文章

Health Kit申请验证有问题?解决方案全解析

在接入Health Kit的过程中&#xff0c;应用上线前需要完成申请验证环节&#xff0c;获得正式的运动健康权限。 我们贴心整理了申请验证被驳回的高频问题&#xff0c;您可以在申请前阅读以下内容&#xff0c;避免在您的申请材料中出现下述问题影响审核通过的进度哦&#xff01;…

每日一练 | 华为认证真题练习Day126

1、RSTP协议包含以下哪些端口状态&#xff1f;&#xff08;多选&#xff09; A. Forwarding B. Discarding C. Listening D. Learning 2、如下图所示&#xff0c;所有主机之间都可以正常通行&#xff0c;下列说法正确的有&#xff1f;&#xff08;多选&#xff09; A. SWB的…

应用架构的演进 | 拒绝牺牲性能为代价的安全

微服务架构下有大量服务&#xff0c;每个服务都会暴露自己的 API。随着时间推移&#xff0c;不同服务的 API 容易出现不一致、重复的情况。这给 API 的维护带来很大难度。同时&#xff0c;服务间存在复杂的依赖关系。一个 API 的实现可能依赖多个其他服务的 API。这种依赖关系的…

福科安物联网——王小平 从大厂员工到创业者的转变

在杭州滨江区&#xff0c;有一家名叫福科安的物联网初创公司。杭州福科安由王小平创办于2022年&#xff0c;专注于智慧城市和智慧乡村的数字化建设。 年过不惑的王小平曾是华为和大华的大厂老员工&#xff0c;凭借着多年的工作经验和技术实力&#xff0c;他决定毅然离开舒适的大…

Android 设置中增加 OTG 开关以方便调试

Android 设置中增加 OTG 开关以方便调试 在开发工作中我们经常可能需要用到USB调试&#xff0c;然而有些设备默认是在host模式&#xff0c;我们知道host之间是不能互联的&#xff0c;所以如果这时我们想要使用USB调试的话&#xff0c;需要将设备进行host与devices模式之间的切…

linux用户组管理

介绍linux系统如何创建用户组&#xff0c;修改用户组属性&#xff0c;删除用户组&#xff0c;维护用户组中成员 1.创建用户组groupadd 参数 用户组名 参数 -r 创建系统用户组创建student用户组&#xff1a; [rootmaster ~]# groupadd student2.修改用户组属性groupmod 参数 …

立冬将至,别忘记吃饺子!Don‘t forget to eat dumplings

立冬通常是每年的11月7日或8日。每年这个时候&#xff0c;河水就开始结冰。“Winter Begins” arrives on November 7 or November 8 each year. At this time of the year, some rivers in China start to freeze. 立冬是冬季的第一个节气&#xff0c;进入这一时节&#xff0…

SELECT COUNT( * ) 与SELECT COUNT( 1 ) 区别

在 SQL 中&#xff0c;SELECT COUNT(*) 和 SELECT COUNT(1) 都用于统计符合条件的行数&#xff0c;但它们在具体实现和效率上有一些区别。 SELECT COUNT(*)&#xff1a;这是一种常见且通用的写法&#xff0c;它会统计所有符合查询条件的行数&#xff0c;包括所有列&#xff0c;…