设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 373|回复: 1
收起左侧

[其他情况] Go和JavaScript结合使用:抓取网页中的图像链接

[复制链接]
发表于 2023-11-7 16:25:47 | 显示全部楼层 |阅读模式
本帖最后由 suger7 于 2023-11-7 16:27 编辑

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



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


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



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



爬取流程[size=1em]
爬取流程可以分为以下步骤:[size=1em]
1使用Go发送HTTP请求,获取百度图片搜索结果页面的HTML内容。[size=1em]
2使用JavaScript解析页面,提取图像链接。[size=1em]
下面是爬取流程的详细描述:[size=1em]



步骤1:发送HTTP请求[size=1em]
首先,我们使用Go来发送HTTP请求,以获取百度图片搜索结果页面的HTML内容。这里使用Go标准库的net/http包来实现,同时配置代理信息:[size=1em]
[backcolor=var(--lakex-editor-background-primary)]


[color=rgba(89, 89, 89, 0.5)]Plain ext


复制代码




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34






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解析页面[size=1em]
在这一步骤中,我们使用一个Go库,例如github.com/rogchap/v8go,来执行JavaScript代码并解析页面。以下是一个示例代码片段,演示如何使用JavaScript来提取图像链接:[size=1em]
[backcolor=var(--lakex-editor-background-primary)]


[color=rgba(89, 89, 89, 0.5)]Plain Text


复制代码




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16






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

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

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












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


[backcolor=var(--yq-bg-primary)][color=var(--yq-text-primary)]


[color=var(--yq-text-primary)][backcolor=var(--yq-bg-primary)]










[color=var(--yq-text-caption)]若有收获,就点个赞吧














发表于 2023-11-8 17:47:07 | 显示全部楼层
22.jpg
沙发 2023-11-8 17:47:07 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-5-3 14:43 , Processed in 0.082313 second(s), 11 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表