python知乎爬虫收藏夹_知乎福利收藏夹爬虫
前言
本文受到以下专栏文章的影响
本文部分细节需要读者有编写爬虫代码的经验。
没有经验的同学可以访问以下链接学习。
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知乎爬虫收藏夹_知乎福利收藏夹爬虫相关推荐
- 知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取.
知犀思维导图_知犀导图本地保存邀请码6个[未使用]需者自取. JDGSL4 YPHPV4 CJGYB4 NGXSL4 NNBUJ4 GUEJG4
- python 绿色字体是什么意思_知网报告上的绿色字体代表什么?
知网查重是同学们在提交毕业论文之前非常重要的一个部分,但是很多人都会在这一部分出现很多问题,有的人在进行知网查重之后,得到了查重报告,但是他们却看不懂知网查重系统的一些检测结果,因为这份查重报告里面有 ...
- 知乎cookies的介绍_知乎更新隐私政策:不点同意可选“仅浏览”,相关数据一月内删除...
近年来,不时出现的大型互联网公司数据外泄丑闻,让人们对企业是否有能力保护自己的隐私产生了忧虑.为了赢得消费者的信任,隐私保护在当下已然成为一家公司的核心竞争力. 不久前,苹果上线隐私数据管理网站,以便 ...
- python爬取软件内数据_各种数据爬取工具爬虫合集整理
却道天凉好个秋~ 不用编程敲代码的爬取数据的工具合集,简单上手易用的爬虫脚本工具软件汇总 1.工具软件类: Microsoft Excel excel也可以爬一些规整的表格数据等,没想到吧! 八爪鱼 ...
- python自动整理文件夹_计算机文件和文件夹的Python自动管理,自动化,电脑,及
目录 一.输出目录所在的文件以及文件夹 import os print(os.getcwd())#获得当前文件的地址 print(os.path.join('MyProjects','AI'))#让P ...
- 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理
前言 在我对项目组的一些训练图像进行预处理的时候,发现处理的图像是分好了类,在文件夹里的文件夹里,套娃式存储的,所以对我批处理,以及按原文件夹规则进行存储的时候,就会造成很大困扰 但通过下面几个函数的 ...
- python 图片对比文件夹_初学Python-找出文件夹下的所有图片
这个命题,有2种含义. 1.找出指定某个文件夹目录下的图片 2.找出指定某个文件夹及其子文件夹下的图片 两者的区别在于,子文件夹的图片是否需要找出来.对应的处理方法也略微有所区别,下面具体讲解一下.找 ...
- 收藏功能_微信强大的收藏功能,你们用了吗?
在中国说到即时聊天工具,就得说到微信和QQ了,他们都是腾讯旗下的产品,今天麦叔要和大家聊的是微信,去年官方数据显示微信用户已超过10亿,庞大用户群体在使用它,但它的一些功能并不是每个人都会知道,今天麦 ...
- Clover 驱动文件夹_黑苹果(clover文件夹中各个文件的主要功能)
我们现在都应该知道了Clover中EFI文件夹的重要性了吧,而这个文件夹下又有好多文件它们都是做什么的呢,让我们来学习一下吧. EFI/MICROSOFT: 如果是双系统,这个文件夹下面就是Windo ...
最新文章
- 根据数据库中不同的值显示不同的图片
- iphone电池怎么保养_怎么保持iPhone的电池健康?掌握这4个方面,3年不用换电池...
- Kubernetes集群安全概述
- hibernate session的load和get方法
- 使用Angular的property binding给HTML DOM元素的class动态赋值
- Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)
- 一个小码农对嵌入式的理解
- Python的正则匹配
- 黑客借“甲型流感”传毒 挂马疾病预防控制中心网站
- 如何设置计算机网共享文件夹,局域网内如何设置共享文件夹呢
- 广工大第12届ACM校赛A
- 最简单解决jpa自动生成表后字段乱序问题
- linux安装wine
- linux 怎么彻底删除用户,linux如何完全删除用户
- Win10 AMD610显卡驱动安装出现错误206安装失败
- ArcGIS空间统计——点密度计算
- 苹果笔记本怎么查看计算机基本信息,如何查询苹果电脑型号_查询苹果电脑型号的方法...
- 黑群晖使用pc端 Drive
- 线性规划以及二次规划
- andriod——Fresco+Retrofit+GreenDao