Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

343 阅读4分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

最新弄到一本不错的书《中国妖怪故事(全集)》,忽然想到做一个收集整理中国妖怪的网站应该挺有意思的,故得此文。 Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

写爬虫前的分析工作

对于编写爬虫,很多时候找到一个目标网站,然后对该站点进行分析,总会找到一种途径获取到你想要的数据;还有一种情况就是今天这种了,我们碰到一个想法,觉得这个想法还不错,然后尝试抓取一些基本数据,在结合一下 PHP,JAVA 这些语言编一个网站出来,没准能获得不错的流量。

今天要抓取的数据是 中国妖怪,除了自己整理以外,找到一个数据源网站就显得很重要了,所以我直接打开百度一顿搜索,果然,以橡皮擦(dream.blog.csdn.net/)的智力还是很难想到一…

虽然关于妖怪的网站不多,但还真有一个 知妖 。这个网站还真做了整理妖怪这么一个趣味性蛮强的工作,在这里为比我提前想到的 大佬,点个赞。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

既然已经找到目标站点了,接下来的工作就比较简单了,分析走起。

先看数据量是否全,我经常在博客里面写的一句话是“只要人眼能看到的数据,爬虫都能抓取到”。这个网站由于是个人维护的,所以数据展示的比较全面,当然量也不是很大,合计 130 页左右,每次看到类似最后一页这样的描述,我就知道这网站爬取肯定有戏。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

获取分页地址规律

随便点击 1~2 页,就可以获取到分页的基本规律了。

https://www.cbaigui.com/page/4
https://www.cbaigui.com/page/3
https://www.cbaigui.com/page/130

可以看到上述地址中,页码就是一个单纯的数字。

编写正则表达式

本次的目标是获取到妖怪数据,爬虫爬取过程中允许出现一定的冗余数据,所以直接分析页面元素即可,看一下哪些数据有价值。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

上图红框所示区域,为列表页面比较核心的数据,这里其实要抓取 2 个值,第一个是标题,第二个是标题点击之后的链接,抓取到链接,才可以获取到内页数据,即下面红框所示的 tag 标签区域。关于为何获取这个标签的原因,这里因人而异,我主要是为了获取标签之后进行相应的分类。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

如果为了补全数据的完整性,你可以抓取头部的一些其他信息。里面包含一些朝代和妖怪的出处。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

分析完毕,在橡皮擦看来,最难的工作就做完了,剩下的就是写代码抓取了。

爬虫编写工作

这里大家需要注意下,该网站应该属于个人开发者,所以我们在爬取的时候注意限制一下爬取速度,爬的太快对网站造成影响就不好了。

接下来编码正式开始。

首先你可以通过一些正则表达式工具,先把正则匹配写好,其实这部分写好了,代码也就编写一大部分了。

该页面中用到了 2 处正则,第一个用来匹配标题与链接,正则如下:

第一个正则表达式:

<h2 class="post-title">[.\s]*<a href="(.*?)" rel="bookmark">(.*?)</a>

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

第二个正则表达式:

<a href=".*?" rel="tag">(.*?)</a>'

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

对于正则表达式写的严谨性,在本系列专栏中不做要求,够用,好用即可。

下面展示一下部分代码,核心代码已经完成,剩下的就交给你来实现啦!~

import requests
import re
import time


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}


def get_tags(url):
    res = requests.get(url, headers=headers)
    pattern = re.compile(
        r'<a href=".*?" rel="tag">(.*?)</a>')
    all = pattern.findall(res.text)
    print(all)


def get_list(page):
    url_format = "https://www.cbaigui.com/page/{page}"
    url = url_format.format(page=page)
    res = requests.get(url, headers=headers)
    pattern = re.compile(
        r'<h2 class="post-title">[.\s]*<a href="(.*?)" rel="bookmark">(.*?)</a>')
    all = pattern.findall(res.text)
    for item in all:
        get_tags(item[0])
        time.sleep(1)


if __name__ == "__main__":
    total = int(input("请输入最大页码:"))
    for i in range(1, total):
        get_list(1)
    # get_tags("https://www.cbaigui.com/post-18153.html")


运行之后,发现结果中有个色欲?什么鬼?

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

好奇心没忍住,找到链接点击了一下,好好的翻阅了一下相关信息,很有收获。

Python 爬虫小课 2-9 中国妖怪数据库,运行中竟然发现有个色(he)欲(xie)妖怪分类

爬虫课后叨叨

完整的代码大家自行补齐即可,剩余部分都是数据存储相关内容了,你可以写到csv文件中即可。 爬虫爬取数据之后,会发现很多的趣味性,例如本案例就无形中给我补充了很多知识。

👯👯👯