GO爬取彼岸网壁纸

目标

  1. 爬取彼岸图网的精美壁纸
  2. 爬取非会员版的缩略壁纸
  3. 爬取会员版的4K壁纸

网页结构解析

选取一个分类,这里选择的是美食,其url长这样:https://pic.netbian.com/4kmeishi/
在这里插入图片描述
谷歌浏览器,点击F12审查元素,有两个地方值得注意,一个是标黄的a标签与标橙的img标签,后续需要从这两个标签获取要爬取的图片的url与name。a标签的href用于4k壁纸的url拼接,img标签的src用于缩略图url的拼接,img标签的alt用于图片的命名
在这里插入图片描述
点进大图,其url为:https://pic.netbian.com/tupian/23196.html,从上图与下图的对比可知,大图的url由主站的https://pic.netbian.com与a标签的fref属性值/tupian/23196.html拼接而成。
在这里插入图片描述
要想获取4k图片需要点击上图的下载原图按钮,但是根据参考文献可知这是动态获取的,通过获取data-id的属性值再添加随机数向/e/extend/downpic.php传参即可,仔细观察可发现图二中的a标签的href属性值中就包括data-id这个值,data-id应该是图片的唯一id。但是批量下载原图是需要会员的,也就是说需要传cookie,否则不能下载原图。
在这里插入图片描述
所以通过上述方式就能轻易获取图片的url与name,那么完整的url长什么样呢
缩略图长这样,完整url见图
在这里插入图片描述
4K壁纸的url:https://pic.netbian.com/downpic.php?id=23196&t=0.1561613,因为这个url输入浏览器直接就下载了(带有cookie的话),所以没有展示图。前文提到是向/e/extend/downpic.php传参,其实会跳转,但若直接在浏览器输入https://pic.netbian.com/e/extend/downpic.php?id=23196&t=0.1561613反而会出现这种情况
在这里插入图片描述

代码

如何在html中提取目标属性值

在浏览器中的html代码对应位置右击,如图选择copy其xpath,然后需要对拷贝的xpath进行一些修改
在这里插入图片描述
所以拷贝下来的

  1. a标签是这样的://*[@id=“main”]/div[3]/ul/li[1]/a
  2. img标签是这样的: //*[@id=“main”]/div[3]/ul/li[1]/a/img

因为是要获取当前页面的所有图片,所起将其修改为

  1. a标签://*[@id=“main”]/div[3]/ul/li/a
  2. img标签: //*[@id=“main”]/div[3]/ul/li/a/img

使用工具为htmlquery,可参考golang:xpath选择器htmlquery简单用法
当然也可使用正则表达式获取,但是好久没用又搞忘了,就懒得折腾了

文件结构

点击下载原图的时候,可通过查看header来查看cookies,复制就行,我最后将其放在cookie.txt文件里,放成一排,每个cookie由;隔开。
在这里插入图片描述
文件结构如下,getBianPic.go是获取缩略图的代码,getBianPic4k.go是获取4K图片的代码。
在这里插入图片描述
代码内均有注释,可按需修改

getBianPic.go

package main

import (
	"bufio"
	"fmt"
	"github.com/antchfx/htmlquery"
	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding"
	"golang.org/x/text/encoding/unicode"
	"golang.org/x/text/transform"
	"io/ioutil"
	"net/http"
	"os"
	"strconv"
	"strings"
	"sync"
)

/**
 * @Author: zx
 * @Date: 2021.05.18
 * @Version: golang1.15
 */

/**
 * @Description: 存放图片的url与对应的名称
 */
type imgAttr struct {
   
	url  string
	name string
}

var (
	// 存放图片链接的数据管道
	chanImages chan imgAttr
	waitGroup  sync.WaitGroup
	// 用于监控协程
	chanTask chan string
	// xpath
	xp      = "//*[@id='main']/div[3]/ul/li/a/img"
	// 爬取页面数量
	chanNum = 26
	// FilePath,存放图片的文件
	filePath = "F:/crawler/bian/meishi/"
	// urlMainPath,大分类的主地址
	mainPath = "https://pic.netbian.com/4kmeishi/"
)

/**
 * @Description:就是一个打印err的函数
 * @param err err类型
 * @param why 哪个阶段发生了错误
 */
func HandleError(err error, why string) {
   
	if err != nil {
   
		fmt.Println(why, err)
	}
}

/**
 * @Description: 爬图片链接到管道
 * @param url 传的整页链接
 */
func getImgUrls(url string) {
   
	imgs := getImgs(url)
	// 遍历切片里所有链接,存入数据管道
	for _, img := range imgs {
   
		chanImages <- img
	}
	// 标识当前协程完成
	// 每完成一个任务,写一条数据
	// 用于监控协程知道已经完成了几个任务
	chanTask <- url
	waitGroup.Done()
}

/**
 * @Description: 获取当前页图片链接
 * @param url 当前页的链接
 * @return urls 当前页所有图片的链接
 */
func getImgs(url string) (imgs []imgAttr) {
   
	pageStr := GetPageStr(url)
	root, _ := htmlquery.Parse(strings.NewReader(pageStr))
	results := htmlquery.Find(root, xp)
	fmt.Printf("共找到%d条结果\n", len(results))
	for _, result := range results {
   
		img := imgAttr{
   
			url:  "https://pic.netbian.com" + result.Attr[0].Val,
			name: result.Attr[1].Val + ".jpg",
		}
		imgs = append(imgs, img)
	}
	return
}

/**
 * @Description: 抽取根据url获取内容
 * @param url 当前页的链接
 * @return pageStr
 */
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值