当前位置:   article > 正文

python爬虫------王者荣耀英雄及技能爬取并保存信息到excel_腾讯游戏爬虫

腾讯游戏爬虫

目录


前言

这里我们不用selenium模拟人进行爬取数据,直接用requests模块获取相关信息。

整体思路:

1、获取王者荣耀官网所有英雄所在页面的网页的源代码

2、获取王者荣耀各个英雄的具体网址

3、提取其中的数据

4、把数据保存到excel中


以下是本篇文章正文内容

一、准备工作

  1. import requests
  2. import re
  3. import pandas as pd
  4. base_url = 'https://pvp.qq.com/web201605/herolist.shtml'
  5. headers = {
  6. 'referer': 'https://pvp.qq.com/',
  7. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  8. }
'
运行

首先导入requests、re、pandas模块,谷歌浏览器搜索王者荣耀官网,找到英雄资料并将网址,头信息中的referer、user-agent写入程序中。

二、具体步骤

1.获取王者荣耀官网所有英雄所在页面的网页的源代码

代码如下:

  1. base_url = 'https://pvp.qq.com/web201605/herolist.shtml'
  2. headers = {
  3. 'referer': 'https://pvp.qq.com/',
  4. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  5. }
  6. response = requests.get(base_url, headers=headers)
  7. response.encoding = 'gbk'
  8. r = response.text
  9. # print(r)输出的是网页的全部源代码

没有response.encoding = 'gbk'会导致输出结果存在乱码。

2.获取王者荣耀各个英雄的具体网址

 上图右边代码放大如下:

 由图中我们观察到 href="herodetail/155.shtml"中的herodetail/155.shtml即为个个英雄的相关网址,但是经过观察,其中的数字没有啥规律,因此我们使用re正则表达式取出数字,并保存在hero_xuhao_list中,然后利用for循环,构建每个英雄的网址,代码如下:

  1. # 由于英雄的网址为无序,故使用re
  2. wangzhi = re.compile(r'<a href="herodetail/(\d*).shtml" target="_blank"')
  3. hero_xuhao_list = re.findall(wangzhi, r)
  4. # print(hero_xuhao_list)
  5. df = []
  6. # 标题栏
  7. columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
  8. for id in hero_xuhao_list:
  9. detail_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(id)
  10. # print(detail_url)
  11. response1 = requests.get(detail_url, headers=headers)
  12. response1.encoding = 'gbk'
  13. # print(response1.text) 获得具体网址的全部源代码

response.textd的部分内容如下

 可以看到有英雄和技能的文字出现,接下来只需要用re匹配出相应内容即可

3.提取其中的数据

由于存在着缩减,我将2中的for循环内容也截取出来了,便于理解层次。

  1. for id in hero_xuhao_list:
  2. detail_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(id)
  3. # print(detail_url)
  4. response1 = requests.get(detail_url, headers=headers)
  5. response1.encoding = 'gbk'
  6. # print(response1.text) # 获得具体网址的全部源代码
  7. names = re.compile('<label>(.*?)</label>')
  8. name = names.findall(response1.text)[0]
  9. # 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]
  10. skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)
  11. skill = skills.findall(response1.text)
  12. # print(skill)
  13. beidong = skill[0]
  14. jineng1 = skill[1]
  15. jineng2 = skill[2]
  16. jineng3 = skill[3]
  17. jineng4 = skill[4]
  18. b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])

用re提取的数据主要有英雄名字、一技能、二技能、三技能、四技能

对于名字,需要在后面加个[0],否则最后的excel文件中英雄名字列中全是列表形式的输出,

如['张飞']

 如上图,有些英雄有四个技能,有些只有三个技能,按照以上方法书写,没有四技能的在excel四技能列中为空,正确。

4.把数据保存到excel中

  1. df = []
  2. # 标题栏
  3. columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
  4. for id in hero_xuhao_list:
  5. detail_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(id)
  6. # print(detail_url)
  7. response1 = requests.get(detail_url, headers=headers)
  8. response1.encoding = 'gbk'
  9. # print(response1.text) # 获得具体网址的全部源代码
  10. names = re.compile('<label>(.*?)</label>')
  11. name = names.findall(response1.text)[0]
  12. # 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]
  13. skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)
  14. skill = skills.findall(response1.text)
  15. # print(skill)
  16. beidong = skill[0]
  17. # print(beidong)
  18. jineng1 = skill[1]
  19. jineng2 = skill[2]
  20. jineng3 = skill[3]
  21. jineng4 = skill[4]
  22. b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])
  23. d = pd.DataFrame(df, columns=columns)
  24. # index=False表示输出不显示索引值
  25. d.to_excel("王者荣耀英雄与技能.xlsx", index=False)

为了连贯,我将2,3点的内容也放了进来。

存储数据到excel主要涉及到以下几行:

df = []
# 标题栏
columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
d = pd.DataFrame(df, columns=columns)
# index=False表示输出不显示索引值
d.to_excel("王者荣耀英雄与技能.xlsx", index=False)

其中dataframe是二维数组。最后数据就存到excel中了。


总结

以下是源代码:

  1. import requests
  2. import re
  3. import pandas as pd
  4. base_url = 'https://pvp.qq.com/web201605/herolist.shtml'
  5. headers = {
  6. 'referer': 'https://pvp.qq.com/',
  7. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  8. }
  9. response = requests.get(base_url, headers=headers)
  10. response.encoding = 'gbk'
  11. r = response.text
  12. # print(response.text)# 输出的是网页的全部源代码
  13. # 由于英雄的网址为无序,故使用re
  14. wangzhi = re.compile(r'<a href="herodetail/(\d*).shtml" target="_blank"')
  15. hero_xuhao_list = re.findall(wangzhi, r)
  16. # print(hero_xuhao_list)
  17. df = []
  18. # 标题栏
  19. columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
  20. for id in hero_xuhao_list:
  21. detail_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(id)
  22. # print(detail_url)
  23. response1 = requests.get(detail_url, headers=headers)
  24. response1.encoding = 'gbk'
  25. # print(response1.text) # 获得具体网址的全部源代码
  26. names = re.compile('<label>(.*?)</label>')
  27. name = names.findall(response1.text)[0]
  28. # 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]
  29. skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)
  30. skill = skills.findall(response1.text)
  31. # print(skill)
  32. beidong = skill[0]
  33. # print(beidong)
  34. jineng1 = skill[1]
  35. jineng2 = skill[2]
  36. jineng3 = skill[3]
  37. jineng4 = skill[4]
  38. b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])
  39. d = pd.DataFrame(df, columns=columns)
  40. # index=False表示输出不显示索引值
  41. d.to_excel("王者荣耀英雄与技能.xlsx", index=False)
'
运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/980897
推荐阅读
相关标签
  

闽ICP备14008679号