爬取网站的步骤:
- 设定爬取目标
目标网站:我自己的博客, https://blog.csdn.net/csyifanZhang/article/list/1
目标数据:所有博客文章的 - 链接、标题、标签 - 分析目标网站
待爬取页面:https://blog.csdn.net/csyifanZhang/article/list/1 ~ https://blog.csdn.net/csyifanZhang/article/list/5
待爬取数据:HTML元素中的h2 class=entry-title下的超链接的标题和链接,标签列表 - 批量下载HTML
使用requests库实现下载,官网:https://2.python-requests.org//zh_CN/latest/user/quickstart.html - 实现HTML解析,得到目标数据
使用BeautifulSoup库解析,官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ - 将结果数据存储
可以使用json.dumps把这个数据序列化存储
一、引入python库
1:request库
Requests库提供了7种方法,说明如下:
requests.request():构造一个请求,支撑以下各种方法的基础方法
requests.get():获取HTML网页的主要方法,对应于HTTP的GET
requests.head():获取HTML网页头信息的方法,对应HTTP的HEAD
requests.post():向HTML网页提交POST请求的方法,对应HTTP的POST
requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete():向HTML页面提交删除请求,对应于HTTP的DELETE
2:BeautifulSoup
BeautifulSoup: We called him Tortoise because he taught us
意思是我们叫他乌龟因为他教了我们,当然这里Tortoise是Taught us的谐音。BeautifulSoup这个词来自于《爱丽丝漫游仙境》,意思是“甲鱼汤”。上面那个官方配图也是来自于《爱丽丝漫游仙境》,看来是没跑了,估计是作者可能很喜欢这部小说吧,因而由此起了这个名字。
好,让我们看看真正的BeautifulSoup是什么?
BeautifulSoup是Python语言中的模块,专门用于解析html/xml,非常适合像爬虫这样的项目。它有如下几个使其强大的特点:
- Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
- Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
- Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
下载Html用于后续分析
def downLoadHtmls():
#下载所有列表页面的HTML,用于后续分析
htmls = []
for idx in range(2):#我的博客一共只有5页
#设置初始页面
url = f"https://blog.csdn.net/csyifanZhang/article/list/{idx+1}"
print("crawl html: ",url)
#request 相应的html
r = req.get(url)
if r.status_code!=200: #请求成功状态吗就是200
raise Exception("error")
#加入结果集合
htmls.append(r.text)
return htmls
解析单个HTML
#解析单个html
def parseHtml(html):
"""
解析单个HTML,得到数据
@return list({"link", "title", [label]})
"""
#使用 html.parser 来解析
soup = BeautifulSoup(html, 'html.parser')
#我们的标题处于head的title标签中
title = soup.find("head").find("title").get_text()
#我们的所有文章标题都在一个h4标签内部
articles = soup.find_all("h4")
datas = []
for article in articles:
# 查找超链接
title_node = (
article
.find("a")
)
#拿出href元素
link = title_node["href"]
# 查找标签列表,我们的小标题统一在h4的a标签内部
tag_nodes = (
article
.find("a")
)
tags = [tag_nodes.get_text()]
datas.append(
{"title":title, "link":link, "tags":tags}
)
return datas
部分结果展示:
保存文件
htmls = downLoadHtmls()
datas = parseHtml(htmls[0])
with open("data.text", "w") as fout:
for data in datas:
fout.write(json.dumps(data, ensure_ascii=False)+"\n")