【原神】各角色Pixiv涩图统计(二) Python爬虫爬取Pixiv上各角色涩图...
发布网友
发布时间:2024-10-24 08:36
我来回答
共1个回答
热心网友
时间:2024-10-25 10:49
统计结果详情请参阅前一篇文章。
已将代码开源至GitHub。
诚然,此项目为我完成过的最具挑战性的爬虫任务,耗时两天半,全无进展。
Pixiv的反爬机制使我不得不面对复杂的代码编写。
为了统计各角色的涩图数量,我们需要在Pixiv搜索角色名称。对于爬虫而言,正确的链接应为:
Pixiv主要使用的语言包括简体中文、繁体中文、日文、英文和韩文。考虑到《原神》没有俄语版本,我们不统计俄语。
同时,应注意,搜索出的角色名称可能与《原神》无关,因此不能将其纳入统计。
综上,我们的统计逻辑如下:
使用的库包括:
首先,我们需要获取《原神》各角色名称,这可以从《原神》官网爬取。
在实际爬取过程中,网站的语言切换经常失败或自动根据IP地址跳转,甚至返回一半英语一半日文内容。因此,我手动保存了网站各语言的源代码。简体中文名称可直接在《原神》国内官网找到,与国际版类似,但注意,一定注意。
国内官网上刻晴和七七的顺序有误,需要在保存的源代码中调整。
之后,用正则表达式识别各角色的各语言名称,并对一些稻妻角色名称进行适当调整,以增加搜索内容。
注意,原神官网上没有荧和空,需进行特殊处理。
判断作品是否与特定《原神》角色相关的方法是:如果作品中出现其他《原神》角色名称、除本语言外的本角色名称,或包含特定元素(如列表中的元素),则认为其与该角色相关。
忽略大小写。
判断标签如下:
标签包括:原神、Genshin、Impact、米哈游、HoYoLAB、원신、HOYOVERSE、miHoYo、蒙德、璃月、须弥、稻妻、枫丹、纳塔、至冬、提瓦特、Mondstadt、Liyue、Inazuma、Sumeru、Fontaine、Natlan、Snezhnaya、爷、派蒙、Paimon、旅行者、履刑者、屑、森林书、兰纳罗、双子、愚人众、Traveller、Traveler、雷音权现、七星、水、火、岩、冰、风、雷、草、タル蛍、雷电影、雷电真、雷电影、黄金梦乡、深渊、Abyss、七圣召唤、Twins、崩坏、星穹铁道、爱莉希雅、Elysia、女仆、旅人、Travel、公子、捷德、风花节、海灯节、纠缠、Wish、Pull、海祈岛、珊瑚宫、渊下宫、尘歌、萍姥姥、龙脊雪山、苍风高地、风啸山坡、明冠山地、坠星山谷、珉林、璃沙郊、云来海、碧水原、甜甜花、层岩巨渊、Status、天理、琪亚娜、食岩之罚、仙跳墙、佛跳墙、野菇鸡肉串、珊瑚宫、心海、Pyro、Cyro、Hydro、Nature、Anemo、Geo、Dendro、Electro、Swirl、原石、Primogem、Jade、God、Fate、Intertwined、纠缠之缘、Serenitea、Artifact、圣遗物、博士、doctor、同人。
随后,便是核心环节:爬取Pixiv。
由于Pixiv不接受未登录的爬虫,但我们可以巧妙绕过登录接口。我们通过复制登录后浏览器的cookie并写入header。
(关于使用多个cookie的原因,我将在后面解释)
有了cookie,我们在爬取tags时才能获取正常内容。请注意,内容并非直接在HTML页面中返回,而是需要通过请求另一个页面才能获得有意义的信息。特定链接用于生成请求,然后请求获取内容。
链接生成方式简单,通过字符串拼接。
之后,加载JSON数据,使用正则表达式筛选出有用信息。
注意,Pixiv的响应速度较慢,短时间内的请求量过大,会返回空内容,因此需要判断内容是否为空。同时,如果某个tag下面没有内容,返回的也是空值。此外,网络不稳定也可能导致收到空内容或不完整内容。
有时网络状况良好,Pixiv正确处理响应,但返回的内容不完整或与预期不符。
最后,爬取完所有内容后,将page加1,继续爬取下一页内容。Pixiv不会返回404错误,而是返回空值。
还需注意,返回的内容可能包含重复信息,需要处理。
如需自写代码,上述问题都需要考虑。我的代码中已考虑并测试通过。
之前提到,Pixiv爬取速度慢,因此我们使用多线程。但多线程容易导致cookie失效,因此采用多个cookie,并设计算法决定使用哪个cookie。如果一次请求失败,该cookie的sleep time增加20秒。更换cookie时,需睡眠对应cookie的睡眠时间。成功处理完6个角色(所有语言名称)后,将sleep time重置,避免退化为单cookie模式。
至于main.py运行后的结果可视化,这部分内容较长且主要涉及matplotlib绘图,如有问题可至评论区询问。
代码开源地址:
前一篇文章:
封面(AI):
荧 / Lumine