前言
前几天,由于个人有需求,所以就要对站酷网一些类别下的作品的图片进行批量抓取,首先是采用的是NodeJs来写的,但是在运行的途中遇到很多的问题,所以后来就换成了Python,同时使用了多线程,使得图片下载时达到了宽带的峰值,同样也保证了其质量(首先声明:此代码仅供于学习交流使用,不能用于其他的任何用途)。
/>
正文
我本次采用的是request和BeautifulSoup组合来进行抓取的,首先我们需要分析站酷的DOM结构:
/>
由上我们可以看出,其主要内容包含在class为work-list-box的这个div内,并且每个作品又是单独包含在class为card-box这个div内的,所以我们需要获取到页面所有的作品元素集合,我封装成了一个函数:
def startRequest(url):
print("【提示】正在抓取 - %s " % url)
res = requests.get(url)
if res.status_code == 200:
res_html = res.content.decode()
doc = BeautifulSoup(res_html)
work_box = doc.find('div', class_={'work-list-box'})
card_box_list = work_box.find_all('div', class_={'card-box'}) # 此处为所有的作品元素集合
else:
print("【文档获取失败】【状态为%s】 - %s," % (url, res.status_code))
接下来分析每个模块元素的结构,通过查看DOM元素得知每个card-box下的class为title-content的这个a标签包含了其作品的链接地址以及作品标题,所以我们就可以由此来获取:
title_content = item.find("a", class_={'title-content'})
avatar = item.find('span', class_={'user-avatar'})
但是在作品集合元素内,嵌套着推广或广告,但是推广和广告是没有头像avatar元素的,所以我们只需要这样检测头像是否为空就可以过滤掉广告元素,其后获取到作者,URL链接以及标题: