知识地图

一.项目分析

爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件。

1.查看爬取信息是否存在HTML页面里面

张佳玮的知乎文章URL在这里:https://www.zhihu.com/people/zhang-jia-wei/posts?page=1
点击右键——检查——Network,选All(而非XHR),然后刷新网页,点进去第0个请求:posts_by_votes,点Preview

发现有文章标题,看来数据是放在HTML里。那么,走的应该是【知识地图】里上面那条路径

2.编写代码

那好,就可以去观察一下网页源代码了,点回Elements。分析根据哪个标签获取
获取标题文章 :

import requests
from bs4 import BeautifulSoup
#引入request和bs
url='https://www.zhihu.com/people/zhang-jia-wei/posts/posts_by_votes?page=1'
headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
#使用headers是一种默认的习惯,默认你已经掌握啦~
res=requests.get(url,headers=headers)
#发起请求,将响应的结果赋值给变量res。
print(res.status_code)
#检查状态码
bstitle=BeautifulSoup(res.text,'html.parser')
#用bs进行解析
title=bstitle.findAll(class_='ContentItem-title')
#提取我们想要的标签和里面的内容
print(title)
#打印title

会发现只有两个标题,先来做个排查,使用 res.text 打印一下网页源代码。会发现第一页的最后一篇文章的标题“出走半生,关山万里,归来仍是少女心气”在这个网页源代码里面搜索是搜不到的,那么重新开始分析

3.重新分析XHR

打开Network,点开XHR,同时刷新页面,看到出现了很多个请求。
浏览一下,看到两个带articles的请求,感觉有戏。点开首个articles看看preview,一层层点开,看到“title:记住就是一切”,猜测这是一个文章标题。
在网页里面用command+f(windows电脑用ctrl+f)搜索一下“记住就是一切”,发现搜不到,奇怪。
那就看看跟首个articles请求长得很像的另一个articles的请求好啦,仍然看preview,看到title: "国产航母下水……让我想到李鸿章和北洋舰队",仍然在网页里搜一下:

果然在这里。看来这个articles的请求里面存的是第一页的文章标题。这下妥了,我们知道向哪个url获取数据了。
那首个带articles的请求是什么?其实这是知乎的网站设计,当你刷新第一页的时候,默认你也请求了第二页的文章数据,这样你加载就会比较流畅。
现在,理论上我们可以拿到第一页的文章数据了,那如果要拿到之后所有页面的数据,还不够吧。
好,我们去观察第1页对第2页的请求,和第2页里对第3页请求的参数区别,是在headers里面的query string parameters里面。

然后发现除了offset都一样,offset代表起始值,limit表示加载的限制数,通过循环我们是可以爬到所有页数的内容了。

我们的大致思路也就出来了:

4.拿到前3页的数据
import requests
from bs4 import BeautifulSoup
import  csvarticleInfo = []
url = 'https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles'
for i in range(3):params = {'include' : 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topic','offset' : str(i*20),'limit' : '20','sort_by' : 'voteups'}header = {'referer' : 'https://www.zhihu.com/people/zhang-jia-wei/posts/posts_by_votes?page=' + str(i),'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}res = requests.get(url,params=params,headers = header)article = res.json()for oneArticle in article['data']:articleInfo.append([oneArticle['title'],oneArticle['excerpt'],oneArticle['url']])print(articleInfo)

那么如何能判断是否是最后一页了呢
第一页和最后一页请求的参数区别:

对比一下,你会发第一页的is_end是显示false,最后一页的is_end是显示true,这个元素可以帮我们结束循环。
至于那个totals: 919元素,我算了一下页码和每页的文章数,判断这是文章的总数,也同样可以作为结束循环的条件。两个元素都可以用,在这里我们用is_end元素。
所以最终代码为 :

import requests
from bs4 import BeautifulSoup
import  csvarticleInfo = []
url = 'https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles'
i = 0
file=open("article.csv",'w',newline='')
writer = csv.writer(file)
while True:params = {'include' : 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topic','offset' : str(i*20),'limit' : '20','sort_by' : 'voteups'}header = {'referer' : 'https://www.zhihu.com/people/zhang-jia-wei/posts/posts_by_votes?page=' + str(i),'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}res = requests.get(url,params=params,headers = header)article = res.json()for oneArticle in article['data']:articleInfo.append([oneArticle['title'],oneArticle['excerpt'],oneArticle['url']])writer.writerow([oneArticle['title'],oneArticle['excerpt'],oneArticle['url']])print(str(i) + " " + str(article['paging']['is_end']))if article['paging']['is_end']:break;i += 1
file.close()
print(articleInfo)

爬虫精进(六) ------ 项目实操相关推荐

  1. python 爬虫(项目实操)

    用BeautifulSoup库解析数据和提取数据,解析数据的方法是: 提取数据的方法是用find() 与find_all() 最后,我们把事情串起来,就变成下图中的模样.它所对应的,正是爬虫四步中的前 ...

  2. 爬虫项目实操二、爬取“下厨房”网站的菜名、所需材料、和菜名所对应的详情页URL

    项目-爬取"下厨房"网站的菜名.所需材料.和菜名所对应的详情页URL. 它有一个固定栏目,叫做"本周最受欢迎",收集了当周最招人喜欢的菜谱.地址如下: http ...

  3. Python17_项目实操关卡-人机PK

    项目实操关卡-人机PK 通过实战去成长,这体现在:能在学习初期就知道什么是关键知识,了解专业程序员一般是怎么思考和解决问题的,在一遍遍分析问题.拆解问题及解决问题的过程中真正地理解知识,并用这些知识来 ...

  4. 新项目实操分析,用付费视频进行流量变现

    我们知道,互联网的发展,使得网民越来越多,不仅上网的用户在增多,上网的时间也逐年增加. 所以很多人都想做互联网的生意,因为互联网有足够的关注度和巨大的流量.而且,互联网项目属于网上创业,硬件门槛相对较 ...

  5. 章节十五:项目实操:PK小游戏(3)

    章节十五:项目实操:PK小游戏(3) 目录 章节十五:项目实操:PK小游戏(3) 1. 明确项目目标 2. 分析过程,拆解项目 3. 代码实现,逐步执行 3.1 定义Book类 3.2 类BookMa ...

  6. 【Python自查手册】之项目实操

    项目实操步骤 分析:明确项目目标 拆解(将一个问题拆解为多个步骤或者多种不同的层次,逐步解决和执行并最终达到效果)–分析过程拆到无法拆解为止 解决:代码实现,逐步执行 三局两胜制小游戏 # 敌我两PK ...

  7. 本地房产公众号项目实操分享

    ​本地房产公众号项目实操分享 房地产公众号,可以每天更新最新楼盘资讯.楼市预判.土拍信息等,文章可以不用全部原创,那我们可以从哪些地方寻找素材呢? 1.安居客;2.本地土拍网;3.本地规划网;4.房天 ...

  8. SpringBoot集成Mybatis项目实操

    本文为<从零打造项目>系列第三篇文章,首发于个人网站. <从零打造项目>系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 ...

  9. 爬虫项目实操三、用scrapy框架爬取豆瓣读书Top250的书名,出版信息和评分

    安装方法:Windows:在终端输入命令:pip install scrapy:mac:在终端输入命令:pip3 install scrapy,按下enter键,再输入cd Python,就能跳转到P ...

  10. 拳王虚拟项目公社:闲鱼知乎引流售卖虚拟资源的虚拟副业项目实操

    我们知道,虚拟资源的优势就在于成本低,一部手机都可以储存,就拿影视资源来说,每个月都会有一些全新的电影电视剧上映,所以每一部影视剧上映都是自带流量的,那么我们如何借助这一些影视资源来进行一个引流呢? ...

最新文章

  1. 细节详解 | Bert,GPT,RNN及LSTM模型
  2. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
  3. python绘图实例-Python使用matplotlib简单绘图示例
  4. 恒安嘉新面试题java_面了三个大厂,终于拿到offer,数年Java最经典的面试题总结...
  5. 浦银行面试总结(信息科技部)
  6. CF1251F-Red-White Fence【NTT】
  7. 【译】怎样处理 Safari 移动端对图片资源的限制
  8. Android背景透明的 Dialog
  9. 软件测试用例设计方法-判定表法
  10. resultJP在Java中_java result是如何直接变为对象的
  11. jetbrain rider 逐渐完美了,微软要哭了么?
  12. 如何找一个程序员做男朋友?
  13. spark python编程 林子雨_林子雨-Spark编程基础Python版-厦门大学数据库室.ppt
  14. 【模电】0007 有源滤波器2(二阶有源滤低通波器)
  15. Unity的读表,存档,读档
  16. Qt基于FFmpeg读取摄像头并进行H264编码
  17. 数据科学家也良莠不齐 蹩脚数据科学家的10个迹象
  18. neural networks logistic regression 神经网络逻辑回归
  19. puppet插件fact和hiera(puppet自动化系列3)
  20. 数据还原(recover)

热门文章

  1. Python实现求众数的三种方法
  2. od反汇编linux,新手学习反汇编之OD寻找功能call
  3. Unity—背包系统(思路总括)
  4. 合肥Android两天十面总结
  5. 计算方法--解线性方程组的直接法
  6. SwiftUI 面试问题大全
  7. 梦工厂将在红帽峰会畅谈云计算心得
  8. Linux下简单的木马查杀
  9. python爬取微信公众号network_python如何爬取搜狗微信公众号文章永久链接的思路解析...
  10. 小米手机 root权限 获取