-前言

之前一直用scrapy与urllib姿势爬取数据,最近使用requests感觉还不错,这次希望通过对知乎数据的爬取为 各位爬虫爱好者和初学者更好的了解爬虫制作的准备过程以及requests请求方式的操作和相关问题。当然这是一个简单的爬虫项目,我会用重点介绍爬虫从开始制作的准备过程,目的是为了让和我一样自学的爬虫爱好者和初学者更多的了解爬虫工作。

一、观察目标网页模板和策略

很多人都忽略这一步,其实这一步最为重要,因为它决定了你将采取什么策略来获取数据,也可以评估出你能够做到什么程度

(1)打开浏览器的开发工具F12

这里我用的是Google浏览器,打开浏览器按F12,你将看到你加载网页情况,以及网络请求的方式和交互的参数情况。如果你没有看到,你应该百度自己的浏览器开发者工具,如何打开。我们在打开知乎门户网页后,F12看到开发者工具的Network一栏没有出现任何东西。如图1.1所示:

开发者工具 图 1.1

然后我们在知乎搜索框内输入需要搜索的内容,你将会看到网页后台与前台数据交互的变化,加载的数据以及数据请求的方式和参数。如图1.2:

服务端与浏览器交互的信息 图1.2

这里你可以看到有很多js文件和png格式文件,这些文件都是通过你的搜索这个动作,对方服务器返回的文件,根据这些你可以更加了解网页服务端与浏览器的交互过程。这里如果你很有经验的话,可以根据它的size和name字段快速找出你想要的交互文件。

因为我们之前的搜索操作,所以很容易可以看出来第一个带有search字段的是搜索操作时和网站服务器交互的文件。点击我们可以看到 如图1.3:

与服务器通信请求参数 图1.3

这里有返回给我们与服务器通信后的过程以及相关数据,右上方可以看到Headers、Previes、Response、cookie等选项 。

headers可以看到请求的参数,我们很多时候写爬虫访问服务器被拒绝就是因为这里有很多参数验证没有通过,所以学会运用这里的参数是很有必要的。Requests Headers 是你请求时所用的请求头,重要的是cookie与User-Agent,cookie可以让你免登陆,虽然有时效性,但是有时候会帮助你节省时间,同时它有时候也是网站监测你是否是爬虫的手段,userAgent基本都会被服务端检测,所以每次请求都需要带上。Query String Parameters是你请求时所带的参数,因为这里是get方式请求,所以这里的参数在你的请求链接是可以看到的。post请求时,这里的参数会很重要,每次请求都必需带上这些参数,比如账号登录,你就可以在这里看到账号和密码。

Previes 这个文件内容就是网站将会呈现给你的东西,也就是预览

Response 可以看到返回的数据文本,有时候这里可以直接看到json数据,解决动态页面时,如果你能够直接找到想要的数据,你可以很轻松的避开js文件,直接访问这个文件获取数据。

在知乎首页搜索后,你会发现没有换页,通过不停的下拉,会有新的数据产生。这里我们通过下拉时可以看到它产生了新的文件 如图 1.4:

下拉后变化 图1.4

多了一个search的请求文件,我们点开和第一个对比发现,offset字段从0变成了10。我们复制一下这里的url在新开的标签页粘贴后,发现如图1.5:

复制链接的页面 图1.5

看到返回的一个json类型的数据,这里中文都是unicode编码格式,所以我们需要自己写点代码,复制这些字符串,decode解码出中文。解码后你会发现,这些都是下拉时网页显示的数据。我们就可以通过正则表达式从这里将自己需要的数据提取出来,这里只是网页的第一层,为了进入第二层(点击一个链接,跳转的下一个页面),我们将提取这里所有的链接。

回顾我之前文章requests介绍用法,很容易写出:

#假设每个搜索项有500页,如果没有想要的内容,可以breakfor i in range(500): # key是要搜索的关键词

url = 'https://www.zhihu.com/r/search?q='+key+'&correction=1&type=content&offset='+str(i*10) try: #try用在这里,后面会解释原因

response = requests.get(url,headers=headers) except: continue

response.encoding='unicode-escape'

page = lxml.html.fromstring(response.text)

rule = re.compile('

hrefs = re.findall(rule,response.text)

好了第一层我们差不多做好了,进入网站第二层,随意点击一个我们搜索产生的内容标题,跳转至一个新的页面,我们用同样的方法,观察第二层我们与服务端交互的信息 如图 1.6:

第二层服务端交互信息 图1.6

这里有很多网络加载好的文件,我们需要找到具有关键信息的文件,如果各位有尝试在程序里直接请求你打开的url链接,会发现你得到的东西不是你在网上看到的,这是因为很多文件是通过浏览器渲染了js而得到的数据,而我们写的代码并没有这一步,所以我们很多时候用程序访问动态页面时,看不到数据。

当然你也可以添加这里面的js文件在代码中触发,但是这会变得很复杂,因为js文件作用很多,你要找到你想要的js文件并不容易。我们需要找到更快速有效的方法,这也是为什么"观察”是爬虫最重要的一环。

这里我们开始一个一个文件的去看,先看Response,你可以看到他返回的数据和内容。还有就是看它的文件名,这里的answers很容易可以猜到是评论和回答,我们点击进去Response看到数据,发现确实如我们所想

如图1.7:

回答请求参数页面 图1.7

有上次经验,可以准确知道offset是用来翻页的,limit是回答条数,我们同样复制这条链接,和第一层同样打开一个新的标签页,就能看到返回的json数据。我们要做的只需要通过解析工作,提取相关数据就行了。

二、爬虫的制作

通过观察所得到的结论,可以找到服务器的请求入口,从第一层找到翻页的链接,然后第二层获取数据。知乎第二层其实有几种版式,一种就是我们上文那种问答的形式,还有文章的形式,/question/ 和zhuanlan ,还有视频,这几种都要分开讨论,分别解析。我这里只介绍问答和文章的解析方式,方法都大同小异。

(1) 搜索关键词进入相关页面

import requestsimport reimport lxml.html

keys = ['.....'] #key 自己定义一个list

for key in keys: #假设有500页

for i in range(500):

url = 'https://www.zhihu.com/r/search?q='+key+'&correction=1&type=content&offset='+str(i*10) try:

response = requests.get(url,headers=headers) except: continue

response.encoding='unicode-escape'

page = lxml.html.fromstring(response.text)

rule = re.compile('

python爬虫菜鸟教程-python爬虫项目(新手教程)之知乎(requests方式)相关推荐

  1. fl如何保存再次打开_fl studio 20专业教程|fl studio专业新手教程教程(详细使用保存工程)...

    fl studio 20专业教程|fl studio专业新手教程教程(详细使用保存工程),也就是众所熟知的水果软件,全能音乐制作环境或数字音频工作站(DAW).FL Studio可以编曲.剪辑.录音. ...

  2. 菜鸟能学python编程,菜鸟学Python编程文章阅读记录一

    菜鸟学Python编程文章阅读记录 看的懵懵懂懂,感觉就是要把代码看懂到,这个代码块做了什么功能,了解到建了属性,定义了方法,这些方法与属性的关系 今天是js逆向专题,这个帖子,回头再好好看 回头再找 ...

  3. excel像素画教程_像素画新手教程:极简像素画角色分析

    摘要:像素画新手教程:极简像素画角色分析 关键词:像素画,新手教程,极简像素画,角色分析 撰文&编辑:三二 教你画像素画首发 | 公众号 pixelart 本文共755个字,阅读大约需要2分钟 ...

  4. linux搭建cdn教程_网站搭建新手教程:一步一步教你拥有一个属于自己WordPress网站...

    应网友要求,今天知识吧为大家分享一篇新手建站教程,本来是打算做一个视频教程的,毕竟大家看的会直观一些,但是由于我的个人电脑在并不在身边,在公司电脑录新手建站视频又不太合适,所以就为大家写一篇图文教程吧 ...

  5. 微信小程序服务器新手教程,微信小程序新手教程上手开发与使用总结

    微信小程序新手教程上手开发与使用总结,本篇默认已经成功安装微信小程序工具,来和小编一起看看吧 一.模板 WXML提供模板组件给我们使用,可以在模板定义公用的代码片段,然后在需要引用的地方进行调用. 定 ...

  6. python能写桌面程序吗_Python新手教程:40行python代码写一个桌面翻译器

    这是我做出来的粗略版本,后面的UI设计就看大家的艺术细胞了 我们进行制作软件所需要的模板库,首先要进行引用. # json requests thinter import json import re ...

  7. python怎么发送微信给自己_Python新手教程:Python微信定时自动给【女朋友】发送天气预报...

    效果图 主要思路 1.从wxpy获取好友列表 2.创建定时器 3.定时器触发函数 4.函数执行,遍历好友列表 5.好友对象执行带参函数,参数为该好友城市 6.函数中请求百度天气接口,得到该好友对应天气 ...

  8. python基础-菜鸟世界 -python基础---set

    今天介绍基础教程里最后一个数据结构set,也叫集合. 1.概念理解和基础用法 对于集合这个概念,你应该不会陌生,毕竟这玩意高中的数学课上就讲过,如果你都还给老师了,我可以帮你回忆一下.对于集合,我们只 ...

  9. Vue SEO 优化 使用 Vapper SSR 服务器渲染框架 搭建项目 新手教程

    Vapper 简介 Vapper 是一个基于 Vue 的服务端渲染(SSR)框架,它的核心目标是:简 单.灵活.强大. 简单:尽最大的努力让开发 SSR 应用与开发 SPA 应用保持一致的体验,降&g ...

  10. html5 swiper 菜鸟,前端插件swiper使用新手教程

    1.引入swiper.min.js和swiper.min.css两个文件,文件百度网盘下载地址链接:https://pan.baidu.com/s/1KwIzPfe9hFpSiMr5GqAWxw 提取 ...

最新文章

  1. 优化网站的TDK要注意哪些问题?
  2. bitcoin 在ubuntu上的安装指南
  3. 安装包安装服务,点修复出现的错误”Error 1001:指定的服务已存在“ 解决办法...
  4. mvc 一般注释_使用带有注释和JQuery的Spring MVC 3的Ajax
  5. WebService学习之三:spring+cxf整合
  6. iOS-AVCaptureStillImageOutput快门声问题
  7. 《古代汉语》王力笔记整理版
  8. Battleship!
  9. p1468 Party Lamps
  10. 不同的量化交易软件速度差距大吗?
  11. ggplot2–绘制分布图
  12. 光伏系统MPPT、恒功率控制切换MATLAB仿真
  13. 42步进电机与57步进电机
  14. Eclipse Mac OS 安装中文简体语言包
  15. java/php/net/python北信学生成绩预警平台设计
  16. 一分钟制作精美HTML邮件格式的元旦祝福邮件
  17. (软考--信息安全工程师中级)一、网络信息安全概述
  18. Win10 Python yt-dlp下载youtube视频 | 安装使用详细教程
  19. VR自行车骑行系统方案,提供沉浸式骑行体验!
  20. VIRTUALLAB FUSION中马赫曾德尔干涉仪的真实与理想分束器

热门文章

  1. Python数据结构实战——哈希表中的冲突处理(Collision Handling In Hash Table)
  2. OpenCV精进之路(二):图像处理——线性滤波和非线性滤波
  3. TensorFlow安装教程(Windows/Linux两种版本)
  4. ubuntu下的qt程序移植至ARM开发板
  5. open cv+C++错误总结(一)
  6. NetCore Get Parameter
  7. 360强力删除也无法删除的文件 的 终极删除方法
  8. poi 导出excel 中合并单元格
  9. iOS中的枚举:enum, NS_ENUM, NS_OPTIONS的使用区别
  10. 信息安全系统设计基础实验三