爬虫精进(六) ------ 项目实操
一.项目分析
爬取知乎大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)
爬虫精进(六) ------ 项目实操相关推荐
- python 爬虫(项目实操)
用BeautifulSoup库解析数据和提取数据,解析数据的方法是: 提取数据的方法是用find() 与find_all() 最后,我们把事情串起来,就变成下图中的模样.它所对应的,正是爬虫四步中的前 ...
- 爬虫项目实操二、爬取“下厨房”网站的菜名、所需材料、和菜名所对应的详情页URL
项目-爬取"下厨房"网站的菜名.所需材料.和菜名所对应的详情页URL. 它有一个固定栏目,叫做"本周最受欢迎",收集了当周最招人喜欢的菜谱.地址如下: http ...
- Python17_项目实操关卡-人机PK
项目实操关卡-人机PK 通过实战去成长,这体现在:能在学习初期就知道什么是关键知识,了解专业程序员一般是怎么思考和解决问题的,在一遍遍分析问题.拆解问题及解决问题的过程中真正地理解知识,并用这些知识来 ...
- 新项目实操分析,用付费视频进行流量变现
我们知道,互联网的发展,使得网民越来越多,不仅上网的用户在增多,上网的时间也逐年增加. 所以很多人都想做互联网的生意,因为互联网有足够的关注度和巨大的流量.而且,互联网项目属于网上创业,硬件门槛相对较 ...
- 章节十五:项目实操:PK小游戏(3)
章节十五:项目实操:PK小游戏(3) 目录 章节十五:项目实操:PK小游戏(3) 1. 明确项目目标 2. 分析过程,拆解项目 3. 代码实现,逐步执行 3.1 定义Book类 3.2 类BookMa ...
- 【Python自查手册】之项目实操
项目实操步骤 分析:明确项目目标 拆解(将一个问题拆解为多个步骤或者多种不同的层次,逐步解决和执行并最终达到效果)–分析过程拆到无法拆解为止 解决:代码实现,逐步执行 三局两胜制小游戏 # 敌我两PK ...
- 本地房产公众号项目实操分享
本地房产公众号项目实操分享 房地产公众号,可以每天更新最新楼盘资讯.楼市预判.土拍信息等,文章可以不用全部原创,那我们可以从哪些地方寻找素材呢? 1.安居客;2.本地土拍网;3.本地规划网;4.房天 ...
- SpringBoot集成Mybatis项目实操
本文为<从零打造项目>系列第三篇文章,首发于个人网站. <从零打造项目>系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 ...
- 爬虫项目实操三、用scrapy框架爬取豆瓣读书Top250的书名,出版信息和评分
安装方法:Windows:在终端输入命令:pip install scrapy:mac:在终端输入命令:pip3 install scrapy,按下enter键,再输入cd Python,就能跳转到P ...
- 拳王虚拟项目公社:闲鱼知乎引流售卖虚拟资源的虚拟副业项目实操
我们知道,虚拟资源的优势就在于成本低,一部手机都可以储存,就拿影视资源来说,每个月都会有一些全新的电影电视剧上映,所以每一部影视剧上映都是自带流量的,那么我们如何借助这一些影视资源来进行一个引流呢? ...
最新文章
- 细节详解 | Bert,GPT,RNN及LSTM模型
- logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
- python绘图实例-Python使用matplotlib简单绘图示例
- 恒安嘉新面试题java_面了三个大厂,终于拿到offer,数年Java最经典的面试题总结...
- 浦银行面试总结(信息科技部)
- CF1251F-Red-White Fence【NTT】
- 【译】怎样处理 Safari 移动端对图片资源的限制
- Android背景透明的 Dialog
- 软件测试用例设计方法-判定表法
- resultJP在Java中_java result是如何直接变为对象的
- jetbrain rider 逐渐完美了,微软要哭了么?
- 如何找一个程序员做男朋友?
- spark python编程 林子雨_林子雨-Spark编程基础Python版-厦门大学数据库室.ppt
- 【模电】0007 有源滤波器2(二阶有源滤低通波器)
- Unity的读表,存档,读档
- Qt基于FFmpeg读取摄像头并进行H264编码
- 数据科学家也良莠不齐 蹩脚数据科学家的10个迹象
- neural networks logistic regression 神经网络逻辑回归
- puppet插件fact和hiera(puppet自动化系列3)
- 数据还原(recover)