初识python爬虫:5分钟爬取博客的全部信息

爬取网站的步骤:

  1. 设定爬取目标
    目标网站:我自己的博客, https://blog.csdn.net/csyifanZhang/article/list/1
    目标数据:所有博客文章的 - 链接、标题、标签
  2. 分析目标网站
    待爬取页面:https://blog.csdn.net/csyifanZhang/article/list/1 ~ https://blog.csdn.net/csyifanZhang/article/list/5
    待爬取数据:HTML元素中的h2 class=entry-title下的超链接的标题和链接,标签列表
  3. 批量下载HTML
    使用requests库实现下载,官网:https://2.python-requests.org//zh_CN/latest/user/quickstart.html
  4. 实现HTML解析,得到目标数据
    使用BeautifulSoup库解析,官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  5. 将结果数据存储
    可以使用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解释器,为用户灵活地提供不同的解析策略或强劲的速度。

Beautiful Soup基础用法

下载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")

在这里插入图片描述

发布了186 篇原创文章 · 获赞 13 · 访问量 9282

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105276795