前言

本文受到以下专栏文章的影响

本文部分细节需要读者有编写爬虫代码的经验。

没有经验的同学可以访问以下链接学习。

0x01 HTML页面的解析与信息的定位

好的,我们先在chrome里打开这个链接【知乎花式骗图】 - 收藏夹 - 知乎,我们的目标是

下载该收藏夹里所有答案中的图片。

第一步:

既然是要下载到收藏夹里所有问题的图片,我们第一个要知道的就是这个收藏夹有多少页,F12看一下页面结构,找到页码对应的HTMl结构。

...

63

...

第二步:

很明显在当前页面下显示的是各个问题的缩略图和简要信息,还没有将全部的信息加载出来,所以我们接着来看一下具体信息。点击显示全部,我们发现该问题的全部图片才会显示出来。

F12检查一下,我们可以看出在点击显示全部之后,会加载该问题的更多内容,具体问题的链接已经在a标签中写明了。我们只要解析出这些具体回答的链接,剩下的就是去下载具体回答里的图片了。

...

显示全部

...

第三步:

我们在显示全部上右键选择在新建标签中打开链接,再来F12看一下图片的HTML结构。

嗯 我无耻的点了赞...

...

class= "origin_image zh-lightbox-thumb lazy"

data-original=

"https://pic3.zhimg.com/60be4dde381622d4016cb5298693a46e_r.jpg"

...

>

好了,到现在具体的页面结构我们都清楚了。我们来整理一下代码思路。获取收藏夹页数

对特定页数的收藏夹页面解析出每个回答的具体链接

根据回答的具体链接,下载其中的图片

0x02 代码实现

技术路线:requests BeautifulSoup

第一步:代码解析HTML中的信息

1.解析出收藏夹页面个数

看不懂下面代码的同学需要先补充一下相关知识或者亲自实践一下。

pagenum = soup.find('div', class_='zm-invite-pager').contents[11].a.string.

2.找出页面上所有回答的链接

for more_tag in soup.find_all("a", class_="toggle-expand"):

link_list.append("https://www.zhihu.com" + more_tag['href'])

3. 再具体回答链接中找到所有图片的链接

for pic_tag in soup.find_all("img", class_="origin_image zh-lightbox-thumb"):

more_url.append(pic_tag['data-original'])

第二步:解析出图片链接之后,我们来下载图片

for pic_url in pic_list:

try:

#图片的名字就设为图片链接中的文件名

file = pic_url.split('/')[3]

#防止重复下载图片

if os.path.isfile(file) == False:

pic = requests.get(pic_url, headers=pic_headers, timeout=10)

pic.raise_for_status()

with open(file, "wb") as f:

f.write(pic.content)

print "\r正在下载回答中的第%s张图片, 共%s张图片"%(count, total)

count = count + 1

except:

print "download%sfailed"%(pic_url)

第三步:编写程序

这里先不展示全部代码,只是给出主函数代码,以作说明。

if __name__ == "__main__":

starturl = "https://www.zhihu.com/collection/69105016"

start = time.time()

pagenum = get_page_num(starturl)

#用for循环遍历所有的收藏夹页面,测试时pagenum可设成2

for i in range(pagenum):

link_list = get_pic_url(starturl, i)

print "正在下载:%s%s"%(starturl + "?page=", i+1)

for more_url in link_list:

print "下载:%s中的图片"%(more_url)

pic_list = getmorepic(more_url, headers)

download_pic(pic_list, more_url.split('/')[-1])

stop = time.time()

print 'time cost:%s'%(stop-start)

0x03 代码优化

好了,经历以上的步骤,我们应该已经能够实现爬虫的功能了。但是实际爬取速度并不理想,我下载一个52页的收藏夹,下载了两个G的图片,花了近一个小时。从代码上看我们的代码是IO密集型的程序而不是CPU密集型的,可以考虑multiprocessing库来加速我们的爬取过程。

from multiprocessing import Pool

from functools import partial

...

...

def main(start_url, page):

link_list = get_pic_url(start_url, page)

print "正在下载:%s%s"%(start_url + "?page=", page)

for more_url in link_list:

print "下载:%s中的图片"%(more_url)

pic_list = get_more_pic(more_url, headers)

download_pic(pic_list, more_url.split('/')[-1])

if __name__ == "__main__":

pool = Pool(processes=4)

start_url = "https://www.zhihu.com/collection/69105016"

start = time.time()

pagenum = get_page_num(start_url)

#partial偏函数

func = partial(main, start_url)

#如果想全部下载的话 range(1,int(pagenum)+1)

#测试时候参数可以设置成range(1,3)

pool.map_async(func, range(1,3))

pool.close()

pool.join()

stop = time.time()

print 'time cost :%ss'%(stop-start)

这里解释一下为什么要有以下这么一行代码

func = partial(main, start_url)

In [3]: help(pool.map_async)

Help on method map_async in module multiprocessing.pool:

map_async(self, func, iterable, chunksize=None, callback=None) method of multiprocessing.pool.Pool instance

Asynchronous equivalent of `map()` builtin

我们help以下pool.map_async这个函数,之所以要用偏函数是因为main函数中我们要传递两个参数start_url和page,而pool.map_async只能再接受一个iterable的参数。

更多信息可以参看以下链接

0x04 最后

嗯,秉着不放代码谈编程就是耍流氓的思想,代码可以在下面的链接中找到。

大家可以比较一下顺序执行的代码和使用multiprocessing的代码之间有什么区别。

有更好,更快实现方法的同学,请和我交流,不要找我要图XD。

个人邮箱:gamblenull1996@gmail.com

python知乎爬虫收藏夹_知乎福利收藏夹爬虫相关推荐

  1. 知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取.

    知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取. JDGSL4 YPHPV4 CJGYB4 NGXSL4 NNBUJ4 GUEJG4

  2. python 绿色字体是什么意思_知网报告上的绿色字体代表什么?

    知网查重是同学们在提交毕业论文之前非常重要的一个部分,但是很多人都会在这一部分出现很多问题,有的人在进行知网查重之后,得到了查重报告,但是他们却看不懂知网查重系统的一些检测结果,因为这份查重报告里面有 ...

  3. 知乎cookies的介绍_知乎更新隐私政策:不点同意可选“仅浏览”,相关数据一月内删除...

    近年来,不时出现的大型互联网公司数据外泄丑闻,让人们对企业是否有能力保护自己的隐私产生了忧虑.为了赢得消费者的信任,隐私保护在当下已然成为一家公司的核心竞争力. 不久前,苹果上线隐私数据管理网站,以便 ...

  4. python爬取软件内数据_各种数据爬取工具爬虫合集整理

    却道天凉好个秋~ 不用编程敲代码的爬取数据的工具合集,简单上手易用的爬虫脚本工具软件汇总 1.工具软件类: Microsoft Excel excel也可以爬一些规整的表格数据等,没想到吧! 八爪鱼 ...

  5. python自动整理文件夹_计算机文件和文件夹的Python自动管理,自动化,电脑,及

    目录 一.输出目录所在的文件以及文件夹 import os print(os.getcwd())#获得当前文件的地址 print(os.path.join('MyProjects','AI'))#让P ...

  6. 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理

    前言 在我对项目组的一些训练图像进行预处理的时候,发现处理的图像是分好了类,在文件夹里的文件夹里,套娃式存储的,所以对我批处理,以及按原文件夹规则进行存储的时候,就会造成很大困扰 但通过下面几个函数的 ...

  7. python 图片对比文件夹_初学Python-找出文件夹下的所有图片

    这个命题,有2种含义. 1.找出指定某个文件夹目录下的图片 2.找出指定某个文件夹及其子文件夹下的图片 两者的区别在于,子文件夹的图片是否需要找出来.对应的处理方法也略微有所区别,下面具体讲解一下.找 ...

  8. 收藏功能_微信强大的收藏功能,你们用了吗?

    在中国说到即时聊天工具,就得说到微信和QQ了,他们都是腾讯旗下的产品,今天麦叔要和大家聊的是微信,去年官方数据显示微信用户已超过10亿,庞大用户群体在使用它,但它的一些功能并不是每个人都会知道,今天麦 ...

  9. Clover 驱动文件夹_黑苹果(clover文件夹中各个文件的主要功能)

    我们现在都应该知道了Clover中EFI文件夹的重要性了吧,而这个文件夹下又有好多文件它们都是做什么的呢,让我们来学习一下吧. EFI/MICROSOFT: 如果是双系统,这个文件夹下面就是Windo ...

最新文章

  1. 根据数据库中不同的值显示不同的图片
  2. iphone电池怎么保养_怎么保持iPhone的电池健康?掌握这4个方面,3年不用换电池...
  3. Kubernetes集群安全概述
  4. hibernate session的load和get方法
  5. 使用Angular的property binding给HTML DOM元素的class动态赋值
  6. Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)
  7. 一个小码农对嵌入式的理解
  8. Python的正则匹配
  9. 黑客借“甲型流感”传毒 挂马疾病预防控制中心网站
  10. 如何设置计算机网共享文件夹,局域网内如何设置共享文件夹呢
  11. 广工大第12届ACM校赛A
  12. 最简单解决jpa自动生成表后字段乱序问题
  13. linux安装wine
  14. linux 怎么彻底删除用户,linux如何完全删除用户
  15. Win10 AMD610显卡驱动安装出现错误206安装失败
  16. ArcGIS空间统计——点密度计算
  17. 苹果笔记本怎么查看计算机基本信息,如何查询苹果电脑型号_查询苹果电脑型号的方法...
  18. 黑群晖使用pc端 Drive
  19. 线性规划以及二次规划
  20. andriod——Fresco+Retrofit+GreenDao

热门文章

  1. 程序员学习投资股票的简要说明
  2. 51单片机编程5-蜂鸣器实验
  3. java-net-php-python-jsp桂林母婴用品二手交易网计算机毕业设计程序
  4. 药店商场 java,java药店管理平台
  5. 4899空口令过滤器
  6. hive常用内部函数
  7. js验证不完全收录(非空,中英逗号,字数限制,特殊字符,密码,用户名,手机号)
  8. 计算机属于事业单位哪一类,会计属于事业单位哪一类
  9. 显示标题格式和内容格式
  10. javamagic使用教程