python3.6抓取100知乎用户头像详解(四)
因公众号编辑器对代码不友好
在手机上阅读体验不佳
建议前往文末我的知乎文章链接
目标:抓取知乎最高点赞者的关注者的头像,并下载于本地文件夹。
我们采用:requests(获取)——json——urlretrieve(下载)
废话不多说,先上结果与代码:
前言:
:请求头(headers)
知乎对爬虫进行了限制,需要加上headers才能爬取。
请求头信息承载了关于客户端浏览器、请求页面、服务器等相关信息,用来告知服务器发起请求的客户端的具体信息。
对比知乎的请求头信息和常见的请求头信息,发现知乎请求头多了authorization和X-UDID的信息
:urlretrieve
urllib模块提供的urlretrieve()函数,可直接将远程数据下载到本地
:抓取页面,如图
现重点讲解代码四个部分:
一:请求头(headers)
每个网站的请求头都会不一样,但爬取得网站,都有例子,大家在不初期,跟着选就行
Authorization:HTTP授权的授权证书
User-Agent:代表你用哪种浏览器
X-UDID:一串验证码
二:真实的urls
异步加载中,真实的url并非https://www.zhihu.com/people/feifeimao/followers,真正的url需要我们通过抓包获取,流程如图:
所以我们得出真实url:https://www.zhihu.com/api/v4/members/feifeimao/followers?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20
通过加载更多,我们发现url中start随之同步变化,变化的间隔为20,即offset=20(第一页),start=40(第二页),以此类推,所以我们得出.format(i*20),大家可以对比第三篇的翻页。
三:img_url
我们抓取的img的url需要有序的排列,即采用append函数,依次把他们放入img_url。
四:json
之前我们用得.text是需要网页返回文本的信息,而这里返回的是json文件,所以用.json
json结构很清晰,大家一层一层选取就好了
取出字典中的值,需要在方括号中指明值对应的键
总结:
1:翻页,就是寻找url中的规律,大家可以对比第二、三篇的翻页哦,都是一个套路。
2:请求头(headers)就像一把开启大门的钥匙
3:抓取的头像url尺寸很小,我们把_is去掉,就变成正常尺寸了,不过这需要用到正则re,目前我没有学习过re,后续的文章将会大家解决这个坑哦
https://pic2.zhimg.com/v2-9686febfd53ca3defe8112790b24e67e_is.jpg。
下一篇文章,将对前四篇的语法做详细讲解。
有不清楚的地方,大家可以留言,点赞,我看到了,会第一时间回复你。
知乎链接:https://www.zhihu.com/people/lei-an-15/posts
- SPOJ NWERC11B Bird tree
- React多页面应用6(gulp自动化发布到多个环境、生成版本号、压缩成zip等)
- SDIBT 1046 Primary Arithmetic
- 洛谷P2415 集合求和
- React多页面应用5(webpack生产环境配置,包括压缩js代码,图片转码等)
- SDIBT 1046 Primary Arithmetic
- React多页面应用4(webpack自动化生成多入口页面)
- 第二周神经网络基础2.1 二分分类2.2 logistic回归2.3 logistic 回归损失函数2.4 梯度下降2.5 导数2.14 向量化logistic 回归的输出2.15 Python中的广
- 1031 SDIBT Where's Waldorf?
- poj 2469 Stack 'em Up
- React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)
- POJ 2646 The Trip
- React多页面应用2(处理CSS及图片,引入postCSS,及图片处理等)
- 图的广度优先搜索和深度优先搜索(邻接链表表示)邻接链表广度优先搜索深度优先搜索运行结果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在 Kubernetes 中使用 Helm Hooks 迁移数据库
- 漫画:如何螺旋遍历二维数组?
- 轻松学Pytorch-迁移学习实现表面缺陷检查
- 汇总 | OpenCV4中的非典型深度学习模型
- 如何使用私有仓库的 Go Modules
- python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
- Tungsten Fabric知识库丨关于OpenStack、K8s、CentOS安装问题的补充
- Cypress系列(51)- its() 命令详解
- 推荐 | 深度学习反卷积最易懂理解
- Java实现抢红包算法,附完整代码(公平版和手速版)
- 【代码审计】xyhcms3.5后台任意文件读取
- 前端架构探索与实践
- Centos编译JDK8源码
- R-tmap 绘制带指北针和比例尺的空间地图
- 升级Php Curl扩展遇到的坑