用Python爬虫爬取炉石原画卡牌图片
前段时间看了点Python的语法以及制作爬虫常用的类库,于是动手制作了一个爬虫尝试爬取一些炉石原画图片。本文仅记录对特定目标网站的分析过程和爬虫代码的编写过程。代码功能很局限,无通用性,仅作为一个一般爬虫程序提供参考。
要爬取的网站入口页面是:https://hearthstone.gamepedia.com/Full_art。网页上半部分的<li>标记了每个炉石资料片图片的名称(其实是锚点连接),通过这些名称就可以获得各个资料片的专题链接,比如,冠军的试炼的专题资料片对应的网址为:https://hearthstone.gamepedia.com/The_Grand_Tournament_full_art
进入专题页面后,可以看到该资料片的图片列表,其中也有各个图片的缩略图连接,但是我想找到每个图片的原图。单个图片介绍的页面连接在每个class="image"的<a>标签中。比如连接:https://hearthstone.gamepedia.com/File:Argent_Horserider_full.png
进入单个图片的介绍页面后,可以找到class='internal'的<a>标签,它的href属性值就是该图片的原图连接。(嗯,判断的依据是从这个连接下载得到的图是最大的。。)
目标网站的情况大致分析完了,好像也不复杂。下面按照分析过程给出一些代码。
题外话:利用Python制作爬虫,我引用了两个类库。分别是BeautifulSoup和requests。Python版本是3.6.1。
首先是根据入口页面获取各个资料片的连接:
def get_links(url): r = requests.get(url) r.encoding = "utf-8" only_li = SoupStrainer(class_=re.compile("toclevel-1")) lis = BeautifulSoup(r.text, "html.parser", parse_only=only_li) links = [] for li in lis: link = li.a["href"] links.append(link) return links
参数url就是入口连接的字符串值:"https://hearthstone.gamepedia.com/Full_art"。通过requests.get(str)方法获得响应对象并设置其编码格式为"UTF-8"。然后创建了一个SoupStrainer对象,这个对象的作用是在解析(HTML)文档时进行过滤和筛选。class_=re.compile("toclevel-1")表示标签的类中含有值"toclevel-1"。然后就是进行文档解析,解析出来后得到的lis对象,就是包含资料片名称的各个<li>的集合。循环获取其中的<a>标签的href属性值即可。
第二步,根据关键字集合拼接连接。这个很简单。
def get_real_links(basic_url, keywords):real_links = []for keyword in keywords:keyword = keyword[1:]real_links.append(basic_url+"/"+keyword)return real_links
basic_url是指:https://hearthstone.gamepedia.com,keywords就是前一步操作得到的links集合。keyword = keyword[1:]是截取去掉锚点"#"号。
第三步就是根据资料片专题画面获取该资料片下的所有图片的图片介绍页面的链接。
def get_img_page_links(basic_url, real_link): all_img_page_link = [] r = requests.get(real_link) r.encoding = "utf-8" ss = SoupStrainer(class_="image") only_img_a = BeautifulSoup(r.text, "html.parser", parse_only=ss) for img_a in only_img_a: all_img_page_link.append(basic_url+img_a["href"]) print(all_img_page_link) return all_img_page_link
参数real_link是单个资料片的连接。主要代码和第一步是类似的,不再赘述了。
第四步,根据图片介绍页面的链接集合,获取原图片的资源链接。
def get_all_img_link(all_img_page_link):all_img_link = []for link in all_img_page_link:img_name = link[link.index("File:") + len("File:"):]path = "D://python/heartstoneimg/Knights_of_the_Frozen_Throne_full_art/"+img_nameif os.path.exists(path):print(img_name+" exists")continueelse:print("requesting:%s"%(link))r = requests.get(link)r.encoding = "utf-8"ss = SoupStrainer(class_="internal")img_a = BeautifulSoup(r.text, "html.parser", parse_only=ss)print("imag_a:%s" % (img_a))print(img_a.a["href"])img_link = img_a.a["href"]all_img_link.append((img_link, img_name))time.sleep(10)if len(all_img_link) > 20:breakprint(all_img_link)return all_img_link
这里的代码有偷懒的痕迹,在实际下载过程中,如果将所有资料片的所有图片一起循环下载,如果中间有报连接错误(公司网络不行),文档解析的工作就会从头开始。所以我是按照每个资料片,单独下载的。所以,在本地硬盘中创建对应资料片文件夹这项的工作是手动完成的,更换一次资料片的下载也要再手工修改一次代码,这部分可以再完善。这部分程序首先是取得文件名字,然后判断是否已经下载过了,接着获取原图链接,并把图片名称和原图链接做成一个tuple存储在集合中。这里我每次运行只解析二十张图片的信息(还是网络原因)。
最后一步就是图片下载了。
def do_get_img(all_image_link):for img_link in all_image_link:path = "D://python/heartstoneimg/Knights_of_the_Frozen_Throne_full_art/"+img_link[1];if os.path.exists(path):print(img_link[1]+" exists.")continueelse:print("downloading:%s" % (img_link[0]))try:pic = requests.get(img_link[0], timeout=60)except requests.exceptions.ConnectionError:print("fail or timeout!!")continue# path = "D://python/heartstoneimg/basic_full_art/"+img_link[1]print("writing:%s" % (path))file = open(path, 'wb')file.write(pic.content)file.close()time.sleep(10)
好像也很简单,每张图片下载的超时时间是六十秒,每次下载完一张图片后延迟十秒再下载,不然有时网站会因为你访问太过频繁而拒绝访问。
main部分的代码。
from bs4 import BeautifulSoup import requests import re from bs4 import SoupStrainer import time import os import socketdef start_get_img():url = "http://hearthstone.gamepedia.com/Full_art"keywords = get_links(url)basic_url = "http://hearthstone.gamepedia.com"real_links = get_real_links(basic_url, keywords)all_img_page_link = get_img_page_links(basic_url, real_links[11])all_img_link = get_all_img_link(all_img_page_link)do_get_img(all_img_link)if __name__ == "__main__":start_get_img()
get_img_page_links(str,str)方法的第二个参数是当前的资料片链接。更完善的做法是循环real_links集合进行下载。
如果网络正常,每个资料片一百多张图片可以在一个小时内下载完。
我把下载到的原画图片作为资源制作了一个网站。
http://www.blz-art.com
有兴趣的可以去看下。
转载于:https://www.cnblogs.com/derry9005/p/7405151.html
用Python爬虫爬取炉石原画卡牌图片相关推荐
- Python爬虫爬取Twitter视频、文章、图片
Python爬虫爬取Twitter视频.文章.图片 Twitter的Python爬虫 https://github.com/bisguzar/twitter-scraper 2.2k星标 (2020. ...
- 初始python爬虫-爬取彼岸图单张到全部图片
初始python爬虫-爬取彼岸图单张到全部图片 1.单张图片爬取 2.一页图片 3.多页图片 彼岸图链接: https://pic.netbian.com/new/ 用到的库: import requ ...
- 手动爬取炉石传说所有卡牌
笔者还记得是从大学开始的时候玩的炉石传说,还记得当时的版本只有黑石山,纳克萨玛斯,地精大战侏儒这些卡包,转眼间到了现在,炉石传说早已和之前的那个炉石传说不再一样了,还记得以前的卡牌套路冰法,奴隶战,机 ...
- python爬虫吧-python爬虫-爬取百度贴吧帖子加图片
1.[代码][Python]代码 # -*- coding: utf-8 -*- """ 百度贴吧帖子抓取 """ import urlli ...
- 四小时学python爬虫爬取信息系列(第一天)
四小时学python爬虫爬取信息系列(第一天)(全是干货) 1.安装requests库(可以在电脑python,我是进入anaconda我建的虚拟环境) anaconda虚拟环境法流程: conda ...
- Python爬虫---爬取腾讯动漫全站漫画
Python爬虫---爬取腾讯动漫全站漫画 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源 ...
- Python爬虫---爬取数据(上)
又是女票,拿了3万多条的13年某地区的公司信息,但是三年过去了,工商局的注册信息发生了巨大变化,有的注册资本增加了,有的公司老板变多了,更有不少公司不存在了,因此,需要一份最新的信息以便于她进行使用. ...
- python爬虫爬取《斗破苍穹》小说全文
网络爬虫的入门学习:python爬虫爬取小说全文 python爬虫首先导入基本爬虫库requests:import requests,安装命令pip install requests,使用pychar ...
- python爬虫——爬取马蜂窝景点翻页文字评论
python爬虫--爬取马蜂窝景点翻页文字评论 使用Chrome.python3.7.requests库和VSCode进行爬取马蜂窝黄鹤楼的文字评论(http://www.mafengwo.cn/po ...
最新文章
- javascript设计模式-组合模式
- Java基于FTPClient上传文件到FTP服务器
- IT从业者都应关注的软件行业的变化
- ITK:创建一个RGB图像
- python3爬虫入门实例_10个python爬虫入门实例(小结)
- 基于VMware vSphere的虚拟化平台,内存分配是如何实现的?
- 数据:BTC全网算力为134.40 EH/s,新增地址数54.03万
- oracle服务器端怎么打开监听_Oracle11g监听器(Listener)的一些基础知识
- 计算机错误 引用无效名称,有关无效的引用的疑难解答
- Redis下载安装-Windows版本
- 安卓抖音怎么切换国际版Tiktok自带无水印下载
- Assimp 裁剪编译 Android 库
- 一个脚本教你快速去除桌面图标烦人的小箭头
- 算法:狐狸吃兔子问题(约瑟环)
- html选择器的定义和使用,CSS选择器用法大全
- 2022暑期牛客多校训练第5场 A.Don‘t Starve
- 计算机考试190,计算机考试题库:计算机考试模拟练习题(190)
- 隐藏高德地图左下角LOGO
- WOS(五)——字段标识
- 复习步骤12- 16 BPMN事件(3)结束事件