python爬虫爬取知乎图片,轻松解决头像荒

在这里插入图片描述

前言

        最近逛知乎,发现了一个问题。
在这里插入图片描述
        回答下很多好看的头像,因此我动了一个心思,想要制作一个小网页,可以随机返回一款好看的情头。心思既起,当然要开始付诸行动。但是想要制作如此一个网页,后台也需要拥有足够的情头头像数据,毕竟巧妇难为无米之炊嘛。
        所以通过本文,分享给大家爬取知乎问答下头像的方法~
        由于情头需要成对出现,为了方便数据清洗,所以使用了单线程模式。在使用多线程爬取时,总是顺序混乱。所以如果只是单纯为了爬取头像的小伙伴,可以自行实现多线程程序。


运行环境

  • python3.7
  • 依赖:requests

正文

首先我们来观察一下知乎问题的url格式:
在这里插入图片描述
其中这串数字便代表的是该问题的id号。
我们首先来设置下全局变量。

# 知乎问题id
question_id = 372666372
#爬取的回答数
answers_num = 30
#爬取起点
answer_startnum = 0
#排序方式
sorted_choi = 'default' #按时间排序则修改为updated
#爬取头像存放根目录
save_path = './'

知乎回答采取的是瀑布流加载格式,即所有回答不是一次性加载完毕的,而是随着你不断的下拉浏览逐步加载完成的。
打开f12控制器,随着我们不断下拉滑动栏。
可以看到随着问题的加载,控制栏显示:

在这里插入图片描述
我们点进去详细看一看:
在这里插入图片描述
可以发现这个返回的数据便是一个个答主的回答。得到了该项返回数据,那我们的爬虫编写便开始有眉目啦~
接下来我们看一看该项网络请求的url地址:
在这里插入图片描述
但是其中很多参数都是无关的,大胆猜想一下,api的构成格式如下:

https://www.zhihu.com/api/v4/questions/{问题id号}/answers?include=content&limit={返回几个答案}&offset={从第几个问题开始}&sort_by={返回类型}

我们精简一下来try一下:
在这里插入图片描述
数据返回正确,试验成功。

图片抓取

由于我们只需要爬取回答中的头像图片,那么便知需要用正则提取一下即可。

pattern = re.compile('''<img\s.*?\s?data-original\s*=\s*['|"]?([^\s'"]+).*?>''')

运行结果

每个答主的回答分别存放在不同的文件夹内。
在这里插入图片描述
在这里插入图片描述


完整源码

'''
author: Ericam_
createtime: 2021-01-20
description: 用于知乎图片爬取,仅学习生活使用,非商业用途。
'''
import re
import requests
import os
import time
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
    "Connection": "keep-alive",
    "Accept": "text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.8"}

# 知乎问题id
question_id = 372666372
#爬取的回答数
answers_num = 30
#爬取起点
answer_startnum = 0
#排序方式
sorted_choi = 'default' #按时间排序则修改为updated
#爬取头像存放根目录
save_path = './'

pattern = re.compile('''<img\s.*?\s?data-original\s*=\s*['|"]?([^\s'"]+).*?>''')
while answer_startnum<answers_num:
    try:
        url = url = f'https://www.zhihu.com/api/v4/questions/{question_id}/answers?include=content&limit=10&offset={answer_startnum}&sort_by=default'
        html = requests.get(url,headers=headers)
        answers = html.json()['data']
        for answer in answers:
            author = answer['author']['name']
            content = answer['content']
            results = re.findall(pattern,content)
            results = results[::2]
            imgpath = os.path.join(save_path,author)
            if not os.path.isdir(imgpath):
                os.makedirs(imgpath)
            for i,imgurl in enumerate(results):
                res = requests.get(imgurl)
                with open(imgpath+'/{}.jpg'.format(i),'wb') as f:
                    f.write(res.content)
                time.sleep(0.5)
                print(i)
        answer_startnum += 10
    except requests.ConnectionError:
        print('Failed to connect')

情头扭蛋机

        由于我在开头便讲了,头像的爬取是为了制作一款小网页嘛,可以用来随机返回一款情头。
        网页命名为【情头扭蛋机】。
在这里插入图片描述
在这里插入图片描述
        速撸的网页,偷了个懒。手机端访问应该适配,电脑访问估计样式不适配。(ps:功能不影响

访问地址:情头扭蛋机

其他

原创不易,希望大家可以留下赞 评论 收藏。
有什么想法和建议欢迎交流。
请勿随意转载!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值