1s 爬取到 1131 只数码兽,送给《数码宝贝:最后的进化》> Python 爬虫小课 4-9

475 阅读4分钟

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

童年回忆《数码宝贝:最后的进化》10 月 30 日在中国内地上映。所有和我们同龄的人都仍然记得数码宝贝,并且印象最深的还是第一部, 那永远的第一部!

写在前面

话说你们有没有对着自家的狗喊过 “亚古兽进化”

1s 爬取到 1131 只数码兽,送给《数码宝贝:最后的进化》> Python 爬虫小课 4-9

如果说我没有遇见迪路兽的话.——嘉儿
如果说我没有来到数码宝贝世界的话——阿助
如果说我没有跟大家一起来冒险的话——美美
我们就不可能变成现在这个样子了——光子郎
没错,因为有数码宝贝随时陪着我们的缘故——阿和
因为我们还有那么多好伙伴——阿武
所以我们更明白团结合作的重要——素娜
也因此我们更能活出真正的自己——太一

我记忆中的《数码宝贝》 是 99 年版本的,你呢?

上篇博客结尾说道要爬取一下数码宝贝动画里面的所有数码兽,最近也赶上了《数码宝贝:最后的进化》上映,献给我们的童年。

爬取前的分析

本次爬取的网址为:www.digimons.net/digimon/chn… ,对于最终的目标需要定义一下。

等待我们要爬取的信息有,数码兽的名字类型首次登场图片(图片已数码兽名字命名)。

对于这些信息通过 requests 模块即可实现。

爬取代码编写时间

页面中默认展示的只有一部分数据,但是查看源码之后发现所有数据已经全部返回给了前台,所以直接写好正则表达式匹配即可。

具体的数据正则为:

<li class="(.*?)"><span class="date">(?P<date>.*?)</span><span class="(.*?)">(?P<level>.*?)</span><span class="name"><a href="(?P<link>.*?)" target="_blank">(?P<name>.*?)</a></span><span class="debut">(?P<show>.*?)</span></li>

注意上述正则表达式中 (?P<date>.*?) 为获取的组数据建造一个别名,后续可以在使用 group 方法的时候,通过设置的名字即可进行获取。

不过使用别名需要配合 re.search 方法使用,在re.findall 方法中并没有实际效果。

接下来将 Python 代码进行补齐操作:

import requests
import re

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_all():
    r = requests.get(
        "http://www.digimons.net/digimon/chn.html", headers=headers)
    r.encoding = "utf-8"
    if r.status_code == requests.codes.ok:
        pattern = re.compile(
            r'<li class="(.*?)"><span class="date">(?P<date>.*?)</span><span class="(.*?)">(?P<level>.*?)</span><span class="name"><a href="(?P<link>.*?)" target="_blank">(?P<name>.*?)</a></span><span class="debut">(?P<show>.*?)</span></li>')
        items = pattern.findall(r.text)
        print(items)

上述代码运行完毕,将获取到如下图所示效果,1s 中就获取到 1131 只数码兽。

1s 爬取到 1131 只数码兽,送给《数码宝贝:最后的进化》> Python 爬虫小课 4-9

继续分析,还需要抓取数码兽对应的具体图片,分析图片的地址为 www.digimons.net/digimon/mam…

格式命名为: http://www.digimons.net/digimon/{数码兽英文名称}/数码兽英文名称.jpg 对于编码来说先看一下获取到数据的单条数据具体格式:

('c_6', '2018年03月', 'level mark6', '究极体', 'bryweludramon/index.html', '布利维路德龙兽', '液晶玩具 数码兽摇摆机 20周年纪念版')

其中重要的数据为 'bryweludramon/index.html' 里面包含 数码兽的英文名称,需要对其进行字符串截取操作

item = ('c_5', '2020年11月', 'level mark5', '完全体',
	'were_garurumon_sagittarius/index.html', '狼人加鲁鲁兽:射手形态', '动画 数码兽大冒险:')

en_name = item[4][0: item[4].find('/')]

注意使用 find 方法,不要使用 index ,使用 index 如果没有查找到子字符串,会提示错误。

获取到英文数码兽名称之后就可以对图片进行抓取操作了,具体代码如下:

import requests
import re

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_img(name, en_name):
    img_url = f"http://www.digimons.net/digimon/{en_name}/{en_name}.jpg"
    r = requests.get(img_url, headers=headers, timeout=5)
    content = r.content
    with open(f"{en_name}.jpg", "wb") as f:
        f.write(content)

if __name__ == "__main__":
    item = ('c_5', '2020年11月', 'level mark5', '完全体',
            'were_garurumon_sagittarius/index.html', '狼人加鲁鲁兽:射手形态', '动画 数码兽大冒险:')

    en_name = item[4][0: item[4].find('/')]
    get_img("狼人加鲁鲁兽:射手形态", en_name)

以上代码在运行的时候,注意控制一下图片响应的时间,因为 digimons.net 网站属于国外服务器,存在响应时间问题,如果抓取不到做好出错提示。

写在后面

最终的爬取结果大家自行完善即可,数据抓取到本地,可以翻阅一张张熟悉的数码宝贝照片,满满的都是回忆。

1s 爬取到 1131 只数码兽,送给《数码宝贝:最后的进化》> Python 爬虫小课 4-9