ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#章节八:爬取知乎文章

2022-06-25 23:32:10  阅读:267  来源: 互联网

标签:章节 10 知乎 res 爬取 headers print requests data


章节八:爬取知乎文章

目录

你造吗,今天是个大喜的日子!来到这儿,就意味着你爬虫已经入门啦!

在这个重要又喜悦的日子里,我们就干三件事:回顾前路、项目实操、展望未来。

回顾前路,是为了复习1-7关所学的知识。项目实操,是通过写一个爬虫程序把所学的知识用起来。展望未来,是预告一下我们之后会遇到的风景。

马上开始吧~

1. 回顾前路

在前面,我们按关卡学了好多好多知识。而这么多的内容,我们用【项目实现】和【知识地图】两张图就能说清。

【项目实现】: 任何完成项目的过程,都是由以下三步构成的。

image.png-24.7kB

先需要明确自己的目标是什么,然后分析一下如何实现这个目标,最后就可以去写代码了。

当然,这不是一个线性的过程,而可能出现“代码实现”碰壁后然后折返“分析过程”,再“代码实现”的情形。

接下来是【知识地图】:前面6关所讲的爬虫原理,在本质上,是一个我们所操作的对象在不断转换的过程。

image.png-106.9kB

总体上来说,从Response对象开始,我们就分成了两条路径,一条路径是数据放在HTML里,所以我们用BeautifulSoup库去解析数据和提取数据;另一条,数据作为Json存储起来,所以我们用response.json()方法去解析,然后提取、存储数据。

你需要根据具体的情况,来确定自己应该选择哪一条路径。

也可以参考图片上的注释,帮助自己去回忆不同对象的方法和属性。不过,老师还是希望你能把这个图记在心里。

好啦,1-7关的内容就梳理完成啦~

接下来是项目实操,这是今天的重头戏。

2. 项目实操

我们会按照刚刚提过的项目三步骤来,首先是明确目标。

2.1 明确目标

为了让大家能把前面所学全都复习一遍,老师为大家准备了一个项目:爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件。

之所以选这个项目,是为了让大家能把前面所学全都复习一遍。

知道目标后,就可以【分析过程】了。

2.2 分析过程

张佳玮的知乎文章URL在这里:https://www.zhihu.com/people/zhang-jia-wei/posts?page=1。

image.png-422.9kB

这是我做这个项目时,网站显示的内容。

点击右键——检查——Network,选All(而非XHR),然后刷新网页,点进去第0个请求:post?page=1,点Preview

image.png-571.5kB

发现有文章标题,看来数据是放在HTML里。

那么,走的应该是【知识地图】里上面那条路径:

image.png-106.9kB

那好,就可以去观察一下网页源代码了,我们点回Elements

image.png-471kB

上图左边的文章标题对应的就是上图右边的a元素里面的文本“大概,他们就是世上活得最明白的人吧。”还可以看到在<a>标签里面,还有属性target="_blank",和data-za-detail-view-element_name="Title"

对于target="_blank"属性,我们按下ctrl+f去搜索属性名target属性值"_blank"

image.png-408.7kB

用上下箭头翻看一下搜索结果,发现这个target属性并不能帮我们精准地定位到文章标题,所以排除使用这个属性。

事实上超链接标签<a>target属性指示的是在哪里打开跳转的目标网页,"_blank"表示每点击一次(超链接)打开一个新窗口。从搜索结果看,显然需要这个指示的不止文章标题。

而对于另一个属性data-za-detail-view-element_name="Title",属性值"Title"倒是在疯狂明示自己是个“标题”,但属性名如此freestyle,应该是由知乎的开发人员自定义命名,并不是html语法里标准的属性名,BeautifulSoup可能不识别。所以,我们不推荐使用。

有没有更好的选择呢?我们把视野稍微放宽(一点点):

image.png-476.1kB

你会发现,这个<a>标签的上一个层级是<h2>标签,并且有属性class="ContentItem-title"。仍然用ctrl+f搜索属性值“ContentItem-title”,发现这个属性可以帮我们精准定位目标数据,可以用。

到这里,我们的思路也差不多清晰起来。

获取数据——用requests库;解析数据——用BeautifulSoup库;提取数据——用BeautifulSoup里的find_all()方法,翻页则要观察第一页,到最后一页的网址特征,写循环;存储数据——用csvopenpyxl模块都可以。基本思路就应该是这样。

好,这就结束了分析过程,接下来就是敲代码啦。

2.3 代码实现

别一上来就整个大的,我们先试着拿一页的文章标题,看看能不能成功。

请阅读下面的代码,然后点击运行:

image.png-240.3kB

# 引入requests和bs
import requests
from bs4 import BeautifulSoup

# 使用headers是一种默认的习惯,默认你已经掌握啦~
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'}
# 用resquest模块发起请求,将响应的结果赋值给变量res。
url='https://www.zhihu.com/people/zhang-jia-wei/posts?page=1'
res=requests.get(url,headers=headers)
# 检查状态码
print(res.status_code) 

发现状态码显示200,表示请求成功,放心了,可以继续往下。

请阅读下面的代码,然后点击运行:

image.png-521.9kB

# 引入request和bs
import requests
from bs4 import BeautifulSoup

# 使用headers是一种默认的习惯,默认你已经掌握啦~
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'}
# 发起请求,将响应的结果赋值给变量res。
url='https://www.zhihu.com/people/zhang-jia-wei/posts?page=1'
res=requests.get(url,headers=headers)
# 检查状态码 
print(res.status_code)
# 用bs进行解析
bstitle=BeautifulSoup(res.text,'html.parser')
# 提取我们想要的标签和里面的内容
title=bstitle.find_all(class_='ContentItem-title')
# 打印title
print(title)

见鬼了,为啥只有两个文章标题?

看起来是碰壁了,但遇上问题别慌,先来做个排查,使用 res.text 打印一下网页源代码。请阅读下面的代码,然后点击运行。

image.png-1671.1kB

# 引入request和bs
import requests
from bs4 import BeautifulSoup

# 使用headers是一种默认的习惯,默认你已经掌握啦~
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'}
# 发起请求,将响应的结果赋值给变量res。
url='https://www.zhihu.com/people/zhang-jia-wei/posts?page=1'
res=requests.get(url,headers=headers)
# 检查状态码 
print(res.status_code)
# 打印网页源代码
print(res.text) 

打出来之后,我们把第一页的最后一篇文章的标题“出走半生,关山万里,归来仍是少女心气”在这个网页源代码里面搜索,呵呵,是搜不到的。

标签:章节,10,知乎,res,爬取,headers,print,requests,data
来源: https://www.cnblogs.com/ywb123/p/16412694.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有