点击上方“Python极客社区”,选择“置顶或者星标”
第一时间阅读精彩文章!
小编有时候无聊就喜欢看看知乎。刷刷帖子。经常就看到“谢邀,人在美国”,“谢邀,刚下飞机”,“现在月收入刚过百万”,“圈内人太多,匿了”不由的羡慕他们的生活 知乎,分享你身边(gang bian)的故事。最近经常看到一些帖子,XXX 是怎样的一直体验。有个问题是『长得太帅是怎样的一种体验?』,小编进去分享了一下我的切身经历,引来了许多的赞,而且经常会收到一些妹子私信,以至于我都不能愉快的写代码了。 可有些帖子很明显就是老司机的钓鱼贴,譬如:腿长是一种怎样的体验/ 胸大是一种怎样的体验/ 身材好是一种怎样的体验 。。。 下面的回答当然是妹子的各种照片,身为一名程序员,一页页的去浏览,显得效率太低。于是我本着学习的心态,决定把回答里的所有图片下载下来! 什么?你说文字不爬了吗?文字什么的不重要,主要想试试怎么下载图片。。。好了 ,直接进入正题吧...
如下图所示,在地址栏中我们看到
https://www.zhihu.com/question/26037846
那26037846就是该问题的id,
通过观察每次下拉加载新的回答,我们发现所有回答信息都是通过 https://www.zhihu.com/api/v4/questions/26037846/answers,这个Get接口获取响应数据的。 该请求的参数必传参数有3个include :一堆比较长的字符串,可能校验用
limit : 当页显示的条数
offset:偏移量
在响应体的data这个列表中,每个元素中的content的值为回答的内容,是以Html格式返回的,而在paging中用is_end的值去标识是否是最后一页的回答。 前面我们说过,文字不重要,主要是学习爬图片。因此可以通过正则匹配的方式去提取图片的URL。 所以整体来看还是比较简单的,爬取部分代码如下: def zhihu_spider(question_id): # 当页条数 limit = 10 # 偏移量 offset = 0 # 知乎问题地址 answer_url = f'https://www.zhihu.com/api/v4/questions/{question_id}/answers' # 用于匹配回答内容中的图片 pic_reg = re.compile('<noscript>.*?data-original="(.*?)".*?</noscript>', re.S) # 记录图片数量 pic_num = 1 # 循环执行爬虫,直至最后一页 while True: # 请求参数 data = { 'include': """data[*].is_以下省略...""", 'limit': limit, 'offset': offset, } response = requests.get(answer_url, params=data, headers=headers) resp = response.json() # 当前页所有回答 answers = resp.get('data') for answer in answers: content = answer['content'] # 图片url pic_urls = re.findall(pic_reg, content) # 答主名字 author_name = answer['author']['name'] # 将回答中的所有图片写入url.txt for i in pic_urls: pic_num += 1 with open('url.txt', 'a', encoding='utf-8') as f: f.write(i + '\t' + author_name + '\n') print(f'已获取前 {offset +limit} 个回答,当前图片总数为 {pic_num}') paging = resp.get('paging') # is_end = True 已到最后一页 if paging['is_end']: print('爬取完毕') break offset += limit在上面的方法中,我们获取到了所有回答中的图片URL,下一步就是讲这些图片下载到本地。
部分代码如下:
# 获取当前文件所在目录 path = os.path.dirname(os.path.abspath(__file__)) + os.sep + 'zhihuPic' # 创建文件夹 用来存抓取的图片 if not os.path.exists(path): os.makedirs(path) filename = path + os.sep + img_author_name + '_' + str(num) + '.jpg' try: # urllib.request模块提供的urlretrieve()函数。直接将远程数据下载到本地。 request.urlretrieve(img_url, filename) num += 1 except Exception as e: print(f'图片: {img_url} 下载失败...') continue print(f'图片 {img_url} 下载完成..({num} / {total})')主要代码就差不多这些,已将完整代码上传至GitHub,如果需要可以点击阅读原文。
然后执行代码之后才发现,竟然有6888张图片!!!
然后。。 等待了不知多久,还是没下载完。
只能给大家看这么多了..(其实也没什么,毕竟也是为了安全起见)当然上面只是拿xxx是种怎样的体验 这类话题举了一个小例子,演示了一下怎么下载知乎问题下的所有图片。知乎里还是有很多有意思的图片,小伙伴们可以自己根据自己的需求,修改一下代码中的问题id, 然后直接运行即可。
有兴趣的同学,可以用pyinstall将其打包成exe文件。这样也可以当成一个小工具使用。
代码已上传GitHub:https://github.com/python3xxx/zhihu_spider
或者点击阅读原文,直接访问
感谢您的阅读