代码部分主要分为四大块"""这是要用到的库frombs4importBeautifulSoup#网页分析,获取数据importre#正则表达式importurllib.requestimporturllib.error#指定URL获取网络数据importxlwt#执行excel操作importsqlite3#执行SQLite数据库操作importjson#json类型解码importrequestimportos1.抓取网页defask_url(url):"""AccessURL:return:data"""#Pretendchromerequestheaderheader={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/84.0.4147.89Safari/537.36"}req=urllib.request.Request(url=url,headers=header)html=""try:response=urllib.request.urlopen(req)html=response.read().decode()excepturllib.error.URLErrorase:ifhasattr(e,"code"):print(e.code)ifhasattr(e,"reason"):print(e.reason)returnhtml2.解析数据只是最开始,正则表达式匹配的英雄中文名,打印出来的都是字节类型数据的字符串,无法直接显示中文。后来发现匹配的bytes数据前有一个空数据,打印没有显示出来。现在暂时想起来唯一的办法就是去掉最前面的数据,然后把剩下的转成十六进制,一个一个去chr()他们。如果您有更好的想法,请发表评论。#正则表达式匹配找到所有英雄idfind_hero_id=re.compile(r'{"heroId":"(\d*)",')#heroidfind_name=re.compile(r'"name":"(.*)","alias')#英雄名字find_title=re.compile(r'"title":"(.*)","roles')#titlefind_alias=re.compile(r'"alias":"(.*)","title')#英雄别名find_roles=re.compile(r'"roles":(.*),"shortBio')#rolesfind_skin_id=re.compile(r'"skinId":"(\d*)",')#skinidfind_chromas_BelongId=re.compile(r'"chromasBelongId":"(\d*)",')defget_data(base_url):"""获取数据分析智汇代理应用https://www.kaifx.cn/broker/t...:return:"""data_list=[]list_url="https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"hero_list=ask_url(list_url)#解析网页获取heroidjs=json.dumps(hero_list,sort_keys=True,ensure_ascii=False,indent=3)js=json.loads(js,encoding="utf-8")#打印(js)hero_id=re.findall(find_hero_id,js)#print(hero_id)#foriinrange(100,101):foriinrange(len(hero_id)):data=[]data.append(hero_id[i])#添加英雄idurl=base_url+hero_id[i]+".js"html=ask_url(url)#heronamename=re.findall(find_name,html)[0]#strip()方法用于去除字符串开头和结尾指定的字符(默认为空格或换行符)或一系列人物#split()方法可以根据指定的分隔符将一个字符串拆分成多个子串,这些子串会保存在列表中(不包括分隔符),作为方法的返回值反馈回来#print(name.strip().split(r'\u'))#print(name.encode('unicode_escape').decode('utf8'))temp_name=name.split(r'\u')[1:]#print(''.join([chr(int(s,16))forsintemp_name]))hero_name=''.join([chr(int(s,16))forsintemp_name])data.append(hero_name)#添加英雄名字#print(hero_name)#herotitletitle=re.findall(find_title,html)[0]temp_title=title.split(r'\u')[1:]hero_title=''.join([chr(int(s,16))forsintemp_title])data.append(hero_title)#print(hero_title)#heroaliasalias=re.findall(find_alias,html)[0]data.append(alias)#print(alias)#英雄角色roles=re.findall(find_roles,html)[0]data.append(roles)#print(roles)#skinidskin_id=re.findall(find_skin_id,html)chromas_belongid=re.findall(find_chromas_BelongId,html)对于范围内的n(len(色度s_belongid)):ifchromas_belongid[n]=='0':base_skin_url='https://game.gtimg.cn/images/...'skin_url=base_skin_url+skin_id[n]+'.jpg'data.append(skin_url)#print(skin_url)#print(chromas_belongid)#print(skin_id)#print(data)#print(html)data_list.append(data)返回data_list3。保存数据将采集到的数据以excel格式保存这里使用xlwt库。数据只得到这些。如果想获取一些英雄属性(红条、蓝条等),可以使用正则表达式进行匹配。defsave_data(data_list,save_path):"""保存数据:return:"""#创建工作簿对象workbook=xlwt.Workbook(encoding='utf-8',style_compression=0)sheet=workbook.add_sheet('LOLheroData',cell_overwrite_ok=True)#创建工作表col=('英雄ID','英雄名字','别名','英文名','角色','皮肤链接')foriinrange(len(col)):sheet.write(0,i,col[i])forminrange(len(data_list)):print("write%ditem"%m)data=data_list[m]forninrange(len(data)):sheet.write(m+1,n,data[n])workbook.save(save_path)4.下载图片此功能是下载所有英雄皮肤,每个英雄一个文件夹。defsave_image(data_list):"""保存英雄皮肤图片:return:"""save_path='.\\heroskin'foriinrange(len(data_list)):data=data_list[i]print('下载%d英雄的第一张图片%(i+1))save_path_temp=save_path+'\\'+data[2]forjinrange(5,len(data)):r=requests.get(data[j])#保存路径是否存在,如果不存在,则创建文件夹#下载图片并用open(save_path_temp_image,'wb')asf:f.write(r.content)f.close()保存
