当前位置: 华闻网 - 金融

世界杯到了,写个爬虫获取球员数据吧

时间:2022-11-25 17:32    作者:沐瑶   来源:IT之家    阅读量:8502   

标题:世界杯开始了,大家重新燃起了看球的热情对于游戏制作来说,往往需要开发一些角色数据,尤其是体育游戏自己设置工作量太大,主观性太强这时候你就需要去一些权威网站查数据做参考了我根据自己的实践经验,教你做一个简单的爬虫

一期准备

我们单击其中一个玩家进行分析:

发现所需的所有数据都在上面两张图的位置下面是转账记录和用户评论,现在没有

最后一个数字230006应该是某种参数移除url后,播放器页面仍会打开

移除玩家姓名后,您仍然可以打开页面。

所以我们明白了—每个人的只是一个数字。

在这里,前期的重要准备工作已经完成我们找到了规则,我们需要在下一步中应用它

开始做吧。

首先,编写用于获取玩家数据的最重要的函数:

获取页面上的值

按F12查看页面元素并获取所需的值每个项目都不一样,下面的展示就是我们需要的

元数据

有一段元数据没有显示在页面上,其中记录了玩家的描述我把这个记了下来,以便与同名的球员进行快速比较

过滤年份

因为想得到最新的FIFA23数据,所以过滤了左上角的年份如果不是23年,将返回空值

代码到当前位置:

获取位置 生日 身高 体重等信息我们可以看到,这是一个字符串

这里用的是整篇文章,省脑的办法是换选择器右键单击要爬网的部件,并选择复制选择器将其复制到剪贴板

#获取小字信息raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdiv ")

仅供参考:您也可以使用XPath进行选择,但是您需要学习一点XPath的语法Chrome有一个XPath Helper插件,可以轻松测试XPath的语法写得是否正确

因为球员可能有多个位置,我见过最多的人有四个位置所以我在下面的代码里做了一个偏移量,确保截取的字符串部分是正确的

#如果有多个位置,则进行翻译,否则截取的字符串将是错误的offset = raw data . find _ all( " span ")offset =(len(offset))—1 temp = raw data . text temp = re . split( ' s+ ',temp)ifoffsetgt,0:foriinrange(offset):temp . pop(I)生日信息和转换

获取生日信息,转换成我们需要的格式日前,用excel打开后会自动转换成日期格式,麻烦死了我的做法是:要么用wps,要么用fly book打开,然后再贴回去如果你有更好的想法,请留言

这是身高和体重截取字符串非常简单

#获取玩家的生日并转换成所需格式Month = ( "Jan ", "Feb ", "Mar ", "Apr ", "May ", "Jun ", "Jul ", '+temp(4)(:—1)+ '— '+temp(5)(:—1)mon = temp(3)(1:)mon = Month . index(mon)+1 day = temp(4)(:—1)year = temp(5)(:—1)生日=(1

我们需要获取页面左侧的简介信息,包括正反脚,技能等级,攻防参与度等等。

左脚定义为1,右脚定义为2。这个神奇的数字存在于大量的项目中...而且只能微笑面对:)

# Get profile raw data = soup . select( " # body gt,div:n—child(5)gt,divgtdiv . col . col—12gt,div:n—child(2)gt,divgtul")temp=rawdata(0)find_all('li ',class_= "省略号")preferred_foot=temp(0)contents(1)preferred _ foot = 1if(preferred _ foot ' Left ')else 2 my list . end(preferred _ foot)skill _ move _ level = temp(2)contents(0)my list . end(int(skill _ move _ level))信誉=temp(3)contents(0)my list . end(int(reputation))to dostr = temp(4)

可以看到,大部分代码只是用来拆分 拼接字符串。

头像

#头像rawdata=soup.selectgt,divgt,div.col.col—12gt,div.bp3—card.playergt,img")img_url=rawdata(0).get("data—src")img_r=requests.get(img_url,stream=True)#print(img_r.status_code)img_name=f"id_playerName.png"withopen(f"X:/这里是路径,每个人不一样,我的不能给你们看/img_name","wb")asfi:forchunkinimg_r.iter_content(chunk_size=120):fi.write(chunk)# avatar raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,img")img_url=rawdata(0)get( " data—src ")img _ r = requests . get(img _ URL,stream = True)# print(img _ r . status _ code)img _ name = f " id _ playername . png " with open(f " X:/以下是路径每个人都不一样我不能给你看我的

其他信息:

其他位置信息,俱乐部信息和国籍信息都使用相同的方法——在不能单击的地方,只需右键单击并复制一个选择器。

# #获取位置raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdivgtspan")allPos=' 'join(f " p . text " for pinrawdata)my list . end(all pos)raw data = soup . select( " # body gt,div:n—child(6)gt,divgtdiv . col . col—4gt,ulgt李:第n子(1)gt,Span ") bestpos = rawdata (0)text my list . end(bestpos)# Get Club raw data = soup . select gt,divgtdiv . col . col—12gt,div:n—child(4)gt,divgth5gta")club=rawdata(0)text iflen(rawdata)gt,0else "没有俱乐部"myList.end(club)#获得国籍raw data = soup . select gt,divgtdiv . col . col—12gt,div . bp3—card . player gt,divgtdivgta")nation=rawdata(0)

精彩来了这七八十个属性手动复制最麻烦所以我写了这个爬虫

发现每个属性的值也写在类名里,比如这个class=bp3—tag p p—73共性是bp3—tag p的部分,所以需要使用正则表达式

只是,最后把属性以列表的形式返回,爬虫的主要功能就完成了。

在开始下一步之前,完成编写的函数否则来之不易的数据只存在内存中,很容易丢失很多非程序员可能不理解,这个过程叫做坚持俗话说不争长短,只争坚持,就是代码的意思

建议写Csv,其他格式也一样如果想写excel,推荐openpyxl库下面是代码部分,最长的是表格的表头

#编写文件DefDealwithData:header _ list =( ' id ',' name ',' birthday ',' height ',' preferred _ foot ', "skill _ ","wr_def ','Positions ','BestPosition ','Club ', ' nation ','Crossing ','Finishing ','HeadingAccuracy ','ShortPassing ','Volleys ', '/中文名。csv ',' a+ ',encoding = ' UTF—8—SIG ',newline = ' ')ASF:writer = CSV . writer(f)writer . writerow(header _ list)

另外,请搜索一下w,a和+几种书写方式的用法。

搜索id

怎么调用上面的函数所需玩家id从何而来

增量ID

第一次用id递增的方式穿越,属于广撒网多聚鱼的方式这个方法非常简洁通过这个搜索,很多球员的数据,比如女足球员的数据,就不会显示在网站页面上了

#不再使用实际代码。我这里写个例子:so data = forsinrange (20000,40000): l = fetchdata (s) ifl!= None:so data . end(l)deallowithdata(so data)

如果用这种方式去搜索和写一个条目,效率是很差的可以批量搜索,比如一次100条,然后整体写写CSV的时候可以注释掉header_list,这样就不需要写那么多次头了

Id列表

我们用一个csv文件,加上要搜索的id,然后读取列表进行针对性搜索!

# Search List Search List = with open( '/目录自己看/IDCSV ', "R ",编码= ' UTF—8—SIG ') ASF: F _ CSV = CSV

就是这样我们需要得到玩家索非亚网站的id在这里,我按名字搜索过,按ovr搜索过,按俱乐部搜索过,下面列出来

按玩家姓名搜索

在我们的网站上,通过名字搜索,会出现一个球员名单。例如,搜索华伦天奴会显示以下玩家:

话不多说,直接上码:

这个函数将得到所有的搜索结果如果没有,它将返回未找到需要注意的是,会搜索到很多名字相似的玩家至于你真正需要的是哪一个,需要你自己去筛选

同样,把要搜索的名字放在csv中,方便使用。

#读列表搜索Search list = with open( ' to Search by name . CSV ', "r ",encoding = ' UTF—8—SIG ')ASF:F _ CSV = CSV . reader(F,dial = ' excel ',分隔符)Search list . extend(ITER(F _ CSV))# Search,注意会搜索出所有同名球员。idata = ForpinSearchlist:keyword = str(p)(2:len(p)—3)L = get playerid(keyword)IFL!= none:idata . end(l)deallowithdata(idata)由OVR搜索

按玩家总属性值搜索。

代码如下:

如果你搜索一个团队,你需要知道俱乐部的id如果我们选择球队,你可以看到它独特的俱乐部id和首发阵容

以下是通过俱乐部id获取首发阵容的方法:

至于如何获取俱乐部id,和前面的球员一样,或者用递增id记录,或者搜索队名,这里就不赘述了。

摘要

俗话说,人生苦短我用python作为一种脚本语言,速度和简单是python最大的特点可以根据自己的需求定制这种爬虫对于更高级的爬虫框架,可以使用scappy等对于常用的工具功能,比如写csv,写 读excel等,你可以根据自己的需要把它们写在一个misc.py里其实因为总有新的要求,所以写的很随便,很多评论都没写这样没有美感新的需求接踵而至,根本没时间重构我感谢它能跑跑完之后看到用秒退出这句话就再也不想打开了希望大家以此为戒,写出通俗易懂的代码

世界杯到了,写个爬虫获取球员数据吧

相关内容