python,python已知数据绘制饼图

  python,python已知数据绘制饼图

  最近刚开始学Python。在网上逛了逛,涉猎了Python爬虫,就想爬点东西练练手。况且我之前也是魔方玩家,所以想到了把中国魔方玩家的成绩全部爬上来保存,然后分析。

  Python版本:3.7.0

  用法:resquests beautifulsoup

  网站:https://cubingchina.com/results/rankings

  分析页面

  打开成绩页面,发现所有球员的信息都在一个表格里。打开开发者工具,发现一个有趣的事情:每个玩家的线的类都不一样,奇数是奇数,偶数是偶数,所以你后面要稍微注意一下数据的位置。

  然后转到底部,看到带有下一页和最后一页的按钮,都在李标签下的A标签下。分别是下一节课和最后一节课。

  然后看后面几页都是一样的。最后再看最后一页,发现虽然下一页和最后一页的链接都点不到,但是html文件里有链接,所以很难判断最后一页怎么样。我处理这件事的方式有点愚蠢。我抓取第一页的时候提取了最后一页的地址,然后循环条件是下一页链接和上一页链接不一样。最后,我独自处理了最后一页。爬取数据

  首先打开cookie页面。

  导入请求URL= https://cubingchina.com/results/rankings response=requests . get(URL)response . encoding= utf-8 print(response)然后发现是403,不允许访问。

  问了学长,说可以试试模拟头,然后加了这句话。

  headers={ User-Agent : Mozilla/5.0(X11;Linux x86 _ 64)Apple WebKit/537.36(Khtml,像Gecko)Chrome/70 . 0 . 3538 . 77 Safari/537.36 }在请求中添加了头,而且有效。

  然后将这部分封装到一个函数中

  Get _ html (url): 返回相应的html对象 headers={ user-agent : Mozilla/5.0(X11;Linux x86 _ 64)apple WebKit/537.36(KHTML,像Gecko一样)Chrome/70 . 0 . 3538 . 77 Safari/537.36 } response=requests . get(URL,Headers=Headers)response . encoding= utf-8 HTML=response . text # print(response)返回html然后用beautifulsoup解析,用lxml方法(其实我还是不明白这个是怎么用的)

  从BS4导入beautifulsoup get _ soup (HTML): 根据HTML返回beautifulsoup对象 soup=beautiful soup (HTML, LXML )返回soup然后得到每页100个玩家的信息。

  我们需要的是选手的排名,名字,成绩,比赛,日期。

  DEF _ RANK _ LIST (SOUP): 使用beautifulsoup解析网页,获取球员信息并返回给球员信息列表 #之前已经分析过了,所以球员信息在一个表中。检查html代码获取表格的信息,提取信息rank _ text _ list=soup . find( table ),{ class : table table-bordered table-condensed table-hover table-boxed })#第一个tr是表头信息,因此,rank _ text _ list=rank _ text _ list . find _ All( tr )[1:]rank _ text _ list中rank _ text的rank _ list=[]:#所有信息都在td标签rank _ text=rank _ text . find _ All( TD )# rank rank提取()。text # name name=rank _ text [2]。提取()。text # Result=rank _ text [4]。提取()。text # competition competitive=rank _ text[5]。提取()。text # date date=rank _ text [6]。提取()。text #将所有数据封装到一个tuple中,然后添加到球员得分列表中item=(排名,姓名,结果,竞技,日期)rank _ list。append (item)返回rank _ list,然后将爬取的数据写入csv文件。

  Writer _ file (rank _ list,flag= ): Write to CSV file header=( rank , name , result , competition , date )with open( 333 _ single _ China . CSV , a ,)Newline= )as file:writer=CSV . writer(file)if flag== first :writer . writerow(header)for rank _ list中的rank:writer . writerow(rank)爬完一页的信息后还要继续爬下一页,

  def get_next_url(soup): 获取下一页地址 url_text=soup.find(li ,{ class : next })URL _ text=URL _ text。查找( a )#因为是相对地址,所以还需要拼接一下网站的主地址,直接用字符串拼接是不是有点低的啊(小声BB)中国。 com URL=main _ URL URL _ text。get( href )返回统一资源定位器大体需要写好了,最后组合到主要的函数里

  def main():start _ URL= https://cubing China。com/结果/排名 #先处理第一页,获取末页地址html=get _ html(start _ URL)soup=get _ soup(html)# print(soup)#排名写入文件rank _ list=get _ rank _ list(soup)# print(rank _ list)writer _ file(rank _ list, first) print(第一页下载完成) # 获取下一页URL next _ URL=get _ next _ URL(soup)#获取最后一页url last_text=soup.find(li ,{ class : last })last _ text=last _ text。find( a )last _ URL=main _ URL last _ text。get( href )#当下一页链接不等于末页链接是,接着运行i=2 while next_url!=last _ URL:html=get _ html(next _ URL)soup=get _ soup(html)rank _ list=get _ rank _ list(soup)writer _ file(rank _ list)next _ URL=get _ next _ URL(soup)print(第{}页下载完成。格式(i)) i=1 #下载获取最后一页html=get _ html(next _ URL)soup=get _ soup(html)rank _ list=get _ rank _ list(soup)writer _ file(rank _ list)print(第{}页下载完成。格式(一))大概就是这样,爬出的数据如下,用超过处理了下,看着舒服点

  最后把源码完整贴出来

   功能:爬取粗饼网所有人三阶单次成绩作者:戴维安版本:1.0版日期:2018/03/12 bs4导入美汤导入CSV main _ URL= https://cubing China。com def get _ html(URL): 根据全球资源定位器(统一资源定位器)返回相应的超文本标记语言对象 headers={ User-Agent : Mozilla/5.0(X11;Linux x86 _ 64)苹果WebKit/537.36(KHTML,像壁虎)铬/70。0 .3538 .77 Safari/537.36 }响应=请求。get(URL,headers=headers)响应。encoding= utf-8 html=response。text # print(response)return html def get _ soup(html): 根据超文本标记语言返回美丽的声音对象 soup=BeautifulSoup(html, lxml )返回soupdef get_rank_list(soup): 使用美丽的声音解析网页,取得选手信息返回选手信息列表 rank _ text _ list=soup。find( table ,{ class : table table-bordered table-condensed table-hover table-boxed })rank _ text _ list=rank _ text _ list。find _ all( tr )[1:]rank _ list=[]for rank _ text in rank _ text _ list:rank _ text=rank _ text。find _ all( TD )rank=rank _ text[1].提取()。text name=rank_text[2].提取()。文本结果=rank_text[4].提取()。文本竞技=rank_text[5].提取()。text date=rank_text[6].提取()。text item=(排名,名称,结果,竞争,日期)rank _ list。append(item)返回rank _ listdef writer _ file(rank _ list,flag= ): 写入战斗支援车文件 header=(排名, 姓名, 成绩, 比赛, 日期)用open(333_single_China.csv , a ,encoding=utf-8 ,newline= )作为文件:writer=CSV。writer(file)if flag== first :writer。rank _ list:writer的writerow(header)。writerow(rank)def get _ next _ URL(soup): 获取下一页地址 url_text=soup.find(li ,{ class : next })URL _ text=URL _ text。find( a )URL=main _ URL URL _ text。get( href )返回URL def main():start _ URL= https://cubing China。com/results/rankings html=get _ html(start _ URL)soup=get _ soup(html)# print(soup)#排名写入文件等级列表=获取等级列表(汤)# print(rank _ list)writer _ file(rank _ list,第一个)打印(第一页下载完成) # 获取下一页URL next _ URL=get _ next _ URL(soup)#获取最后一页url last_text=soup.find(li ,{ class : last })last _ text=last _ text。find( a )last _ URL=main _ URL last _ text。get( href )I=2 while next _ URL!=last _ URL:html=get _ html(next _ URL)soup=get _ soup(html)rank _ list=get _ rank _ list(soup)writer _ file(rank _ list)next _ URL=get _ next _ URL(soup)print(第{}页下载完成。格式(i)) i=1 #下载获取最后一页html=get _ html(next _ URL)soup=get _ soup(html)rank _ list=get _ rank _ list(soup)writer _ file(rank _ list)print(第{}页下载完成。格式(I))如果__name__==__main__: main()新手上路,很多不成熟和错误的地方请各位谅解

  感谢观看!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: