彼岸图网收集了大量美图,是个不错的爬取对象。话不多说,直接上图。

分析站点

分类列表

爬取之前,自然要分析一波,这个站点的框架比较简单,从分类着手,共包含12个分类项。

  1. 4K人物
  2. 4K动漫
  3. 4K动物
  4. 4K宗教
  5. 4K影视
  6. 4K明星
  7. 4K汽车
  8. 4K游戏
  9. 4K美女
  10. 4K美食
  11. 4K背景
  12. 4K风景

名称都含有4K,但是获取原图是需要会员的,所以我这里获取的不是原图,而是详细页展示的大图。首先要获取的当然是分类页面的网址,看下面的DOM.

通过xpath //div[contains(@class, "classify")]/a 可以得到分类链接信息,从而可以得到分类名称和网址。

缩略图列表

接下来以4k影视为例,解析每个分类页面,从分类页面可以看到图片的缩略图列表,点击缩略图就能进入详细页面看到大图。

缩略图列表中的图片链接可以通过xpath //div[@class="slist"]//a/@href 获得。

此外,分类页面包含大量图片,是通过分页展示的,分页的页数可以从页面尾部看到。

页面数量可以通过xpath //span[@class="slh"]/following-sibling::a[1]/text()获得,也就是...后的同胞元素。

大图页面

最后就是通过缩略图访问的大图页面了,根据大图的id信息,其实际链接可以通过xpath //*[@id="img"]/img/@src获得。

到此,整个网站已经分析完成。

爬取方案

根据分析过程可以很容易想到爬取步骤:

  1. 获取分类信息,包括名称和链接
  2. 根据分类链接爬取缩略图信息,逐页爬取
  3. 逐页爬取过程中,获取大图实际链接
  4. 下载大图到本地

为了加速爬取过程,我们可以使用多进程,使用Python中的进程池Pool即可。

代码实现

下面通过代码进行实现,为了方便资源共享,减少全局变量或参数传递,我将爬虫封装成一个类Netbian_Spider. 将主页网址和爬虫所需的UA放到初始化信息中。

class Netbian_Spider(object):def __init__(self):self.index = 'http://pic.netbian.com'self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}

函数定义

在类中,可以先按爬取步骤定义好成员函数,当然在编码过程中可以依情况进行增删改。

    def get_path(self, name):passdef get_categories(self):'''get categories of website'''passdef spider_by_category(self, category, url):'''Process function which use to capture images base on category'''passdef parse_thumb_page(self, url, first_page=False):'''parse thumbnail page and get all the detail pages url'''passdef parse_detail_page(self, url):'''parse detail page and get source image url'''passdef download_image(self, url, path):pass

下面对爬虫的实现过程进行详细说明。

保存路径

首先确定图片的保存路径,根目录为~/Pictures/python/netbianwindows对应用户默认的图片目录,linux用户也是同样。

调用get_path会在根目录下会根据分类名称name新建子文件夹。

    def get_path(self, name):home_path = os.path.expanduser('~')path = os.path.join(home_path, 'Pictures/python/netbian/' + name)if not os.path.isdir(path):os.makedirs(path)return os.path.realpath(path)

获取分类信息

按照前面的分类,爬虫第一步是爬取分类信息,我们使用yield定义一个生成器,逐个返回获取到的分类名称和分类网址。

    def get_categories(self):'''get categories of website'''res = requests.get(self.index, headers=self.headers)doc = html.fromstring(res.content)categories = doc.xpath('//div[contains(@class, "classify")]/a')for category in categories:name = category.xpath('text()')[0]url = category.xpath('@href')[0]yield name, url

按分类逐页爬取

得到分类页面url后,通过后续实现的page_thumb_page解析分类页面得到

  1. 大图详细页面链接detail_pages
  2. 每个分类的总页面数量page_cnt

之后就逐页爬取大图并下载到本地,直到所有页面都爬取完成。

    def spider_by_category(self, category, url):'''Process function which use to capture images base on category'''path_category = self.get_path(category)detail_pages, page_cnt = self.parse_thumb_page(url, first_page=True)img_cnt = 0page_num = 1while True:for page in detail_pages:img_cnt += 1print('[{} page-{} img-{}] Parsing page {}'.format(category, page_num, img_cnt, page))img_url = self.parse_detail_page(page)self.download_image(img_url, path_category)page_num += 1if page_num > page_cnt:breakdetail_pages = self.parse_thumb_page('{}index_{}.html'.format(url, page_num))

解析缩略图

在分类页面,也就是缩略图页面,通过前面提及的xpath可以得到所有缩略图对应大图的链接。此外,如果是当前分类的首页,还需要返回分页数。

    def parse_thumb_page(self, url, first_page=False):'''parse thumbnail page and get all the detail pages url'''res = requests.get(self.index + url, headers=self.headers)doc = html.fromstring(res.content)detail_pages = doc.xpath('//div[@class="slist"]//a/@href')if first_page:page_cnt = doc.xpath('//span[@class="slh"]/following-sibling::a[1]/text()')[0]return detail_pages, int(page_cnt)else:return detail_pages

下载大图

大图页面的解析也是一个xpath就搞定了,然后通过requests下载到本地指定路径就ok啦。

    def parse_detail_page(self, url):'''parse detail page and get source image url'''res = requests.get(self.index + url, headers=self.headers)doc = html.fromstring(res.content)img_url = doc.xpath('//*[@id="img"]/img/@src')[0]return img_urldef download_image(self, url, path):img_name = url.split('/')[-1]save_path = os.path.join(path, img_name)res = requests.get(self.index + url, headers=self.headers, timeout=20)if res.status_code == 200:with open(save_path, 'wb') as f:f.write(res.content)

main函数

主函数用到的最关键的知识点就是进程池Pool,使用Pool创建多进程,进程数量由multiprocessing.cpu_conut()决定,也就是PC包含的CPU数量。

主函数首先创建Netbian_Spider类的对象spider,然后获取分类信息。进程池中,每个进程处理一个分类,共12个进程,每次最多执行cpu_count()个进程,剩下的需要前面至少一个执行结束才会开始。

def main():spider = Netbian_Spider()categories = spider.get_categories()p = Pool(cpu_count())for name, url in categories:p.apply_async(spider.spider_by_category, args=(name, url))p.close()p.join()print('All Done!')if __name__ == "__main__":main()

爬取测试

使用python3爬取彼岸图网,共爬取图片17796张,9.18G

写在最后

该爬虫源码已放置Github项目capturer,欢迎交流。

此外,爬取图片仅供学习,不得商用哦。

原文首发于博 https://www.litreily.top/2020/08/09/netbian/

Python网络爬虫8 - 爬取彼岸图网美图相关推荐

  1. Python 网络爬虫:爬取4K高清美图

    爬取4K高清美图 这篇爬虫主要是用来爬取网站高清4K图片,这也是笔者学初学爬虫的时候最先写一个的爬虫脚本,现在回过头来重新梳理一下,也算是对从前知识的一个总结,希望对大家有所帮助! 文章目录 爬取4K ...

  2. Python网络爬虫:爬取并下载个性化签名图片 附GUI窗体版

    Hello,大家好,我是wangzirui32,最近我开了个新的系列,是"Python网络爬虫"分类,还请大家多多支持! 今天,我们来学习如何爬取并下载个性化签名图片,开始学习吧! ...

  3. 【爬虫实战】10应用Python网络爬虫——定向爬取百度百科文字

    python百度百科爬虫 网页源代码分析 编程实现 小结 网页源代码分析 首先找一下需要爬取的正文: 对应的源代码有两个地方: 上图往后翻会发现省略号,所以下面这张图才是我们需要爬取的部分: 编程实现 ...

  4. Python网络爬虫:爬取豆瓣上《小王子》书评

    本文为南大<用Python玩转数据>学习笔记 用到的库或模块: 1.Requests第三方库 用于中小型网络爬虫的信息抓取. 基本方法: requests.get() 请求获取指定YRL位 ...

  5. Python网络爬虫之爬取微博热搜

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  6. Python网络爬虫:爬取CSDN热搜数据 并保存到本地文件中

    hello,大家好,我是wangzirui32,今天我们来学习如何爬取CSDN热搜数据,并保存到Excel表格中. 开始学习吧! 学习目录 1. 数据包抓取 2. 编写代码 1. 数据包抓取 打开CS ...

  7. Python网络爬虫5 - 爬取QQ空间相册

    自毕业后,就再也没有用过QQ,QQ空间里记录的是些并不精彩的青葱岁月,但好歹也是份回忆,近日想着学以致用,用Python把QQ空间相册的所有照片爬取下来,以作备份. 分析QQ空间 登录QQ空间 爬取第 ...

  8. Python网络爬虫:爬取腾讯招聘网职位信息 并做成简单可视化图表

    hello,大家好,我是wangzirui32,今天我们来学习如何爬取腾讯招聘网职位信息,并做成简单可视化图表,开始学习吧! 文章目录 1. 网页分析 2. 获取json数据 3. 转换为Excel ...

  9. python网络爬虫,爬取猫眼电影中复联4上映前南昌市的票房

    额...由于是个新手,爬虫前没做好防护措施,所以导致小编的ip地址被封了,至今还没找到解决办法,所以现在我的电脑已经没法打开猫眼电影的购票窗口了.. 但是数据以前拿到过,所以这里只讲方法,结果大家自己 ...

最新文章

  1. web标准的投资回报
  2. 你所不知道的Python奇技淫巧
  3. CVPR 2020 三篇有趣的论文解读
  4. 微信支付的坑(思路)
  5. PHP的Excel操作
  6. B. Light It Up
  7. 【 || 短路运算】if语句的简化:短路原理、短路效应
  8. matlab设计译码器,基于MATLAB的循环码编译码器设计与仿真.doc
  9. 机器学习基础(四十六)—— 遗传算法(GA)
  10. vue3.0版本怎么修改服务器路径,@vue/cli 3.0 下通过npm命令切换不同服务器地址
  11. 数独的优化回朔算法(二)
  12. AVRNET 学习笔记UDP部分
  13. 仓库入库出库管理软件 PDA盘点软件功能太强大了 兼容大多数PDA手持终端
  14. Python3 sorted自定义排序
  15. 搜索引擎学习之旅3 - 搜索引擎工作流程
  16. 一本书一句话:真北敏捷的微信读书2021
  17. 如何实现音视频云服务弱网高可用性-数据篇
  18. 数据库 schema含义
  19. java工程师项目经验_最新JAVA工程师个人简历中的项目经验范文.doc
  20. 远程服务器拷贝数据库或者大量数据,出现会话空闲时间已超出限制,将在2分钟之内断开连接

热门文章

  1. Springboot-Mysql数据库的SSL连接问题
  2. 六月集训(第13天) —— 双向链表
  3. 麦当劳重金收购一大数据创业公司,持续加码数字化转型
  4. 【汇正财经】有色金属,小金属价格新高
  5. IH8SN0W公布6.1.3-6.1.5完美越狱源代码
  6. 易行信息恭祝大家新年快乐!
  7. 程序员来聊一聊信用卡(四)——哪些银行的哪些卡容易办、值得办
  8. Vue中,$forceUpdate()的使用
  9. 雷锋科普:主流手机屏幕材质有哪些?
  10. python3+openCV实现图片的人脸人眼检测,原理+参数+源代码