2020-08-07
浏览量3378
Pixiv爬虫2.0(Golang)
pixiv-golang版爬虫更新,新增根据关键字爬取和爬取某画师的全部图片功能,提供自定义的爬取图片比例类型功能。
新增了根据不同策略爬取图片,用户可根据需要自定义爬取策略(懂一点Golang)
下面介绍一下使用方法和扩展方法
使用方式
提供了几个可以自定义的爬取参数
默认: 输入关键字爬取 爬取像素比适合做电脑屏幕的宽图和长图 收藏数大于1000
参数
所有参数均不区分大小写
-
不论采用哪种爬取策略,第一个参数都为关键字(关键字/图片ID/作者ID)
-
-s(strategy) : 爬取策略
- -skeyword: 默认.根据关键字爬取
- -srelated: 根据输入图片的ID爬取相关图片
- -sauthor: 根据作者ID爬取该作者全部作画
- -t(type) : 爬取图片比例类型
- W: 横屏 H: 竖屏 S: 小图 O: 其他
- 完整参数
-tWHSO
默认-tWH
- -b(bookmarks) : 收藏数量
- 参数较为简单 例默认
-b1000
即爬取收藏大于1000的图片
- 参数较为简单 例默认
示例
例如爬取 关键字 miku
miku -twhs -b666
例如ID为10086图片相关图片
10086 -srelated -tw -b10086
例如爬取作者ID10086的全部图片
10086 -sauthor -twhso -b10086
扩展方法
实现扩展方法需要少量修改代码并go build
重新编译
只需要编写签名下例的方法, 建议放在strategy
包下
func KeywordStrategy(p *pixivic.Pixivic) {}
Pixivic
结构体定义如下
type Pixivic struct {
GoroutinePool chan struct{}
PicChan chan *PicDetail
CountDown *sync.WaitGroup
Memo map[string]bool
Done chan bool
// 爬取关键字
KeyWord string
// 要求点赞数 默认 1000
Bookmarks int
// 爬取的图片类型 W: 横屏 H: 竖屏 S: 小屏 O:其他(默认WH)
PicType string
// 负责向 PicChan 提供封装好的图片信息
CrawlStrategy func(p *Pixivic)
// 是否取消任务
IsCancel int32
}
只需要提供根据输入的关键字获取相关图片信息的方法(pixivic.com网站全部为此格式)
// 存储爬取图片原始信息的结构体
type UrlDetail struct {
Data []OriginalDetail
}
// 图片原始信息
type OriginalDetail struct {
Id int
Type string
// 图片地址
ImageUrls []struct {
Original string
}
// 创建时间
CreateDate string
// 图片宽度,高度,收藏数
Width, Height, TotalBookmarks int
}
然后对每个图片信息调用
picDetail, flag := process(p, &detail)
进行封装, 会根据输入信息判断是否需要爬取,flag
为true
则需要爬取
然后将picDetail
传递进Pixivic结构体里的PicChan
通道即可
p.PicChan <- picDetail
完整示例(根据作者ID爬取)
// 根据作者ID爬取其所有图片
func AuthorStrategy(p *pixivic.Pixivic) {
authorId := p.KeyWord
author := &struct {
Data struct{
Name string
}
}{}
// 通过此接口获取作者名,作为文件夹根目录
resp, _ := http.Get("https://api.pixivic.com/artists/" + authorId)
json.NewDecoder(resp.Body).Decode(author)
baseGroup := author.Data.Name
for i := 1; ; i++ {
// 根据作者ID获取作者图片的方法
originUrl := "https://api.pixivic.com/artists/" + authorId +
"/illusts/illust?page=" + strconv.Itoa(i) + "&pageSize=30&maxSanityLevel=4"
resp, err := http.Get(originUrl)
if err != nil {
log.Println(err)
break
}
// 存储原始图片信息
var details = &pixivic.UrlDetail{}
json.NewDecoder(resp.Body).Decode(details)
resp.Body.Close()
for _, detail := range details.Data {
// 解析图片信息
picDetail, flag := process(p, &detail)
// 如果图片信息经解析符合要求且爬虫未停止则向通道添加新的任务
if flag && atomic.LoadInt32(&p.IsCancel) == 0{
picDetail.Group = baseGroup + "/" + picDetail.Group
p.PicChan <- picDetail
}
}
// 如果当前页不足30个这说明爬取完成了,则退出
if len(details.Data) < 30{
break
}
}
}
评论
这是下载pixivic镜像站 还是原p站啊
添加一条评论