如何用Python,正确的围观知乎的“钓鱼话题”

mac2025-05-03  3

点击上方“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

或者点击阅读原文,直接访问


以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位。

感谢您的阅读

最新回复(0)