下载英雄联盟所有英雄的皮肤
import os
import requests
# 1.获取所有英雄的ID
def get_all_hero_id():
response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js')
result = response.json()
return [x['heroId'] for x in result['hero']]
# 下载皮肤对应的图片
def download(hero_name, skin_name, skin_url):
# 创建英雄对应的文件夹
if not os.path.exists(f'files/{hero_name}'):
os.mkdir(f'files/{hero_name}')
# 下载图片
response = requests.get(skin_url)
with open(f'files/{hero_name}/{skin_name}.jpg', 'wb') as f:
f.write(response.content)
print(f'--------------{skin_name}下载完成----------------')
# 2.获取每个英雄的皮肤地址
def get_hero_skin_url(hero_id):
url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
response = requests.get(url)
for x in response.json()['skins']:
hero_name = x['heroTitle']
skin_name = x['name'].replace('/', '')
skin_url = x['mainImg'] if x['mainImg'] else x['chromaImg']
download(hero_name, skin_name, skin_url)
if __name__ == '__main__':
for x in get_all_hero_id():
get_hero_skin_url(x)
OS
import os
# os.mkdir(文件路径) - 在指定的位置创建指定文件夹
os.mkdir('files/test')
# os.path.exists(文件夹路径/文件路径) - 判断文件夹或者文件是否存在
if not os.path.exists('files/test'):
os.mkdir('files/test')
regular
import re
from re import *
# 1.正则的作用
# 正则表达式是一种可以让复杂的字符串变得简单的工具
# 写正则表达式的时候就是用正则符号来描述字符串规则
# 案例:判断输入的电话号码是否合法
tel = '189034430'
result = re.fullmatch(r'1[3-9]\d{9}',tel)
if result:
print('合法')
else:
print('不合法')
# 案例:
str1 = 'jdxnh24反对腐败w12发到你家3.23'
result = re.findall(r'\d+\.?\d*',str1)
print(sum([float(x) for x in result])) # 39.23
正则语法
import re
from re import fullmatch,findall,search
1.re模块 - 提供了python中所有和正则相关的函数
fullmatch(正则表达式,字符串) - 判断整个字符串是否满足正则表达式所描述的规则
findall(正则表达式,字符串) - 提取字符串中所有满足正则表达式的字符串
search(正则表达式,字符串) - 匹配字符串中第一个满足正则表达式的子串
注意:python中表达一个正则表达式一般使用r字符串
2.正则符号
第一类符号:匹配类符号
1)普通符号 - 在正则表达式中表示符号本身的符号
2). - 匹配任意一个字符
3)\d - 匹配任意一个数字字符
4)\s - 匹配任意一个空白字符
空白字符:空格(’ ‘)、换行(’\n’)、水平制表符(‘\t’)
5)\w - 匹配任意一个字母、数字、下划线或者中文
6)\D、\S、\W - 分别和\d、\s、\w的功能相反
7)[字符集] - 匹配在字符集中的任意一个字符
[abc] - 匹配a或者b或者c
[abc\d] - 匹配a或者b或者c或者任意数字:[abc0123456789]
[1-5] - 匹配字符1到字符5中的任意一个字符
[a-z] - 匹配任意一个小写字母
[A-Z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d] - 匹配任意一个字母或者数字
[a-z=%] - 匹配任意一个小写字母或者 = 或者 %
[\u4e00-\u9fa5] - 匹配任意一个中文
8)[ ^ 字符集 ]- 匹配不在字符集中的任意一个字符
第二类符号:匹配次数符号
1) * - 任意次数(0次或者1次或者次数)
a* - a出现任意次数
\d* - 任意多个任意数字
[abc]* - 任意多个abc
2)+ - 一次或者多次(至少一次)
3)? - 0次或者1次(最多一次)
4){}
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23
print(fullmatch(r'[-+]?[1-9]\d*','2.23'))
5)贪婪和非贪婪模式
在匹配次数不确定的时候,如果有多种次数都可以匹配成功(前提条件),贪婪取最多的那个次数,非贪婪取最少的那个次数。(默认是贪婪模式)
贪婪模式:+、?、*、{M,N}、{M,}、{,N}
非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?
# 练习:获取豆瓣top250详情页
import requests
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250?start=0&filter=',headers=headers)
# print(response.text)
result = findall(r'<a href=("https://movie.douban.com/subject/\d*?/")>',response.text)
print(result)
第三类符号:分组和分支
1)分组 - ()
正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组。
a.整体操作的时候需要分组
b.重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果
c.捕获 - 提取分组匹配到的结果(捕获分为自动捕获(只有findall有)和手动捕获两种)
findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
匹配对象.group(N) - 获取匹配结果中指定分组匹配到的内容
print(fullmatch(r'(\d\d[A-Z])+','23F34H56X78G'))
# print(fullmatch(r'(\d{3})([a-z]{2})=\2\1{2}',))
# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
# 匹配对象.group(N) - 获取匹配结果中指定分组匹配到的内容
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d+)厘米,体重(\d+)kg',message)
print(result) # <re.Match object; span=(11, 25), match='身高180厘米,体重70kg'>
print(result.group()) # 身高180厘米,体重70kg
print(result.group(1),result.group(2)) # 180 70
2)分支 - |
正则1|正则2|正则3|… - 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,…
# 'abc12','abcHF','abc34'
result = fullmatch(r'abc\d\d|abc[A-Z]{2}','abcHG')
print(result)
result = fullmatch(r'abc(\d\d|[A-Z]{2})','abc89')
print(result)
转义符号
转义符号:在本身具有特殊功能或者特殊意义的符号前加 \ ,让特殊符号变成普通符号
# 匹配整数部分和小数部分都是两位数的小数
result = fullmatch(r'\d\d\.\d\d','34.43')
print(result)
注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失
re模块
from re import fullmatch,findall,search,match,finditer,split,sub
1)fullmatch(正则,字符串) - 用整个字符串和正则,匹配成功返回匹配对象,匹配失败返回None
2)findall(正则,字符串) - 获取字符串中所有满足正则的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
3)search(正则,字符串) - 匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
4)splite(正则,字符串) - 将字符串中所有满足正则的子串作为切割点进行切割
5)splite(正则,字符串,[N]) - 将字符串中前N个满足正则的子串作为切割点进行切割
6)sub(正则,字符串1,字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1
7)sub(正则,字符串1,字符串2,N)
8)finditer(正则,字符串) - 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配元素
9)match(正则,字符串) - 匹配字符串开头
str1 = '的确很好1我的54吧VG办公房顶上'
result = split(r'\d+',str1)
print(result) # ['的确很好', '我的', '吧VG办公房顶上']
str1 = '得分为此额风格23dvfvfdweqf擦擦234防晒霜双宿双飞'
print(sub(r'\d+','+',str1)) # 得分为此额风格+dvfvfdweqf擦擦+防晒霜双宿双飞
# *,*,都打起来了你还在打野!*!*
message = '妈的,SB,都打起来了你还在打野!草!F u c k'
print(sub(r'(?i)妈的|sb|草|cao|操|艹|f\s*u\s*c\s*k','*',message))
1)忽略大小写:在前面加(?i)
2)单行匹配:(?s)
多行匹配(默认):. 不能和换行符(\n)进行匹配
单行匹配:. 可以和换行符进行匹配