python爬虫 爬取pokemon图鉴图片,图片到手了,感觉就像是抓着了pokemon

前言:这是我的第一篇博客,同时也希望不是最后一篇。我学习编程有一段时间了,也真心喜欢编程,但始终无法学到点子上,总是这个看一点,那个学一点,算是学废了。前段时间工作不顺,心灰意冷,一度怀疑自己是否适合走这条路,差点放弃继续学习编程。老师傅不抛弃,再加上无意间看了梦想橡皮擦大佬的爬虫教学,回忆起当初掌机上彻夜奋战抓精灵的日子,重新燃起了学习热情。或许我该继续下去吧!

可能有相同处境的朋友,或是有一起学习的兄弟,加个微信吧,互勉。python爬虫 爬取pokemon图鉴图片,图片到手了,感觉就像是抓着了pokemon_第1张图片

爬取网址如下:http://likexia.gitee.io/piddb/#

右键查看网页源代码,发现没有页面对应的宝可梦信息,同时拉伸浏览器边框,数据动态加载。

数据为js直接渲染。

在源代码中找到相应的.js链接

http://likexia.gitee.io/pokemon/db.js

http://likexia.gitee.io/piddb/zh.js

通过解析js文件得到宝可梦名称和图片链接

"Pokemon": "Bulbasaur"
"front": "https://img.pokemondb.net/sprites/black-white/normal/bulbasaur.png"

宝可梦中文名称可通过对应英文名称从zh.js链接解析获取。

通过循环实现批量保存,整体代码如下:

import requests
import json
import execjs
import time

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}
requests.DEFAULT_RETRIES = 5    #设置重连次数

#通过解析url获取中英文对应名称的字典
def get_namedict():
    url = r'http://likexia.gitee.io/piddb/zh.js'
    res = requests.get(url=url,headers=headers)
    res.encoding = "utf-8"
    name_db = execjs.compile(res.text)
    name_dict = name_db.eval('obj')
    return name_dict

def get_data():
    url = r'http://likexia.gitee.io/pokemon/db.js'
    res = requests.get(url=url,headers=headers)    #requests.get 请求url数据
    res.encoding = 'utf-8'                        #设置编码为utf-8
    res_db = execjs.compile(res.text)            #通过execjs模块解析文件,可能需要安装
    res_data = res_db.eval('POKEDEX')            #获取POKEDEX变量
    poke_dict = {}
    name_dict = get_namedict()
    index = 0
    for item in res_data:
        index += 1
        en_name = item["pokemon"][0]["Pokemon"]    #获取英文名
        print(en_name)
        try:                    #通过英文名获取字典中对应的中文名,shiny为闪光
            zh_name = str(index) + "-" + name_dict.get(en_name)
            zh_name_shiny = str(index) + "-" + name_dict.get(en_name) + "-s"
        except:
            continue
        normal_image = item["images"]["normal"]["front"]    #获取图片链接
        shiny_image = item["images"]["shiny"]["front"]
        poke_dict[zh_name] = normal_image            #字典添加key:中文名,value:图片链接
        poke_dict[zh_name_shiny] = shiny_image

    return poke_dict

def get_image(dict):
    for key,value in dict.items():
        url = value
        if url.find('sprites') == 0: #测试发现图片链接有两种形式,一种为不完整链接需要加上网址
            url = 'http://likexia.gitee.io/pokemon/' + url
        res = requests.get(url=url,headers=headers)
        data = res.content                            #图片为content
        image_name = key.replace('\t','') + ".png"    #发现有名字中带\t,保存图片文件会报错
        image_path = f'.\\poke_img\\{image_name}'    #格式化宝可梦图片名、保存路径
        with open(image_path,'wb') as f:        #保存图片
            f.write(data)
        print(url)
        time.sleep(0.02)

if __name__ == "__main__":
    poke_dict = get_data()
    get_image(poke_dict)

 

你可能感兴趣的:(python,爬虫,数据分析)