1s 爬取到 1131 只数码兽,送给《数码宝贝:最后的进化》> Python 爬虫小课 4-9
发布于 2022年 01月 24日 12:17
「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
童年回忆《数码宝贝:最后的进化》10 月 30 日在中国内地上映。所有和我们同龄的人都仍然记得数码宝贝,并且印象最深的还是第一部, 那永远的第一部!
写在前面
话说你们有没有对着自家的狗喊过 “亚古兽进化”
如果说我没有遇见迪路兽的话.——嘉儿。
如果说我没有来到数码宝贝世界的话——阿助。
如果说我没有跟大家一起来冒险的话——美美。
我们就不可能变成现在这个样子了——光子郎。
没错,因为有数码宝贝随时陪着我们的缘故——阿和。
因为我们还有那么多好伙伴——阿武。
所以我们更明白团结合作的重要——素娜。
也因此我们更能活出真正的自己——太一。
我记忆中的《数码宝贝》 是 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 只数码兽。
继续分析,还需要抓取数码兽对应的具体图片,分析图片的地址为 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
网站属于国外服务器,存在响应时间问题,如果抓取不到做好出错提示。
写在后面
最终的爬取结果大家自行完善即可,数据抓取到本地,可以翻阅一张张熟悉的数码宝贝照片,满满的都是回忆。