欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)

程序员文章站 2022-04-25 15:58:38
简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率。Python爬虫可以批量获取网页上的数据。 Python的环境配置 1. 代码编辑器 Pychar ......
如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)

 

 

简介:

python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率。python爬虫可以批量获取网页上的数据。

python的环境配置

1. 代码编辑器 pycharm community

2. 代码解释器 python 3.7.6

3. 在pycharm中创建项目并配置python环境

4. 安装工具包的两种方式

 

4399小游戏爬虫实战

1、爬虫的基本步骤

  • 使用requests下载网页
  • 使用beautifulsoup将requests下载的内容解析为dom (文档对象模型)
  • 通过dom获取所需要的数据

 

2、4399小游戏的本地运行

  • 支持下载到本地的游戏 : 以 .swf 为扩展名的游戏
  • 游戏主体页的<embed>的src属性可以得到绝对地址
游戏绝对地址示例: http://sxiao.4399.com/4399swf/upload_swf/ftp29/liuxinyu/20190731/7/main.swf
  1. 游戏信息页可以获取相对地址: 在<script>标签中 , ctrl+f 搜索关键字 _strgamepath可以得到
游戏相对地址示例: /upload_swf/ftp29/liuxinyu/20190731/7/main.swf
  1. 所需文件: 爱奇艺万能播放器 ( 已更名为万能联播 ) ( geeplayer.exe )万能联播pc版

 

如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)

 

 

3、4399小游戏爬虫实现思路

  • 爬取4399好玩的小游戏页面(http://www.4399.com/flash/gamehw.htm), 通过解析得到dom来获取所有的游戏链接
  • 遍历所有的游戏链接, 开启线程下载该链接的网页并判断该游戏是否支持下载到本地, 如果支持则拼接下载地址, 并开启游戏下载线程
  • 游戏下载线程: 根据下载地址来下载 .swf 文件并保存到本地

完整代码

1import os
 2import re
 3import threading
 4
 5from bs4 import beautifulsoup as bs
 6import requests
 7
 8
 9def getallgameurl():
10    """
11    获取所有游戏的名称和游戏信息页的链接
12    :return:
13    """
14    gameurllist = []
15    response = requests.get('http://www.4399.com/flash/gamehw.htm')
16    dom = bs(response.content, 'html.parser')
17    gamelilist = dom.select('#skinbody > div:nth-child(6) > ul > li')
18    for i in gamelilist:
19        # 获取游戏的名称
20        gamename = i.select_one('a > b').get_text()
21        # 获取游戏信息页的链接
22        # 'http://www.4399.com/flash/212103.htm'
23        gameinfourl = indexurl + i.select_one('a')['href']
24        gameurllist.append({'gamename': gamename, 'gameinfourl': gameinfourl})
25    return gameurllist
26
27
28def downloadifavailable(game):
29    """
30    判断一个游戏是否支持本地下载
31    :return:
32    """
33    response = requests.get(game['gameinfourl'])
34    plaintext = response.text
35    relativeurllist = re.findall(r'(?<=_strgamepath=").+?\.swf', plaintext)
36    if len(relativeurllist) != 0:
37        gameurl = gamebaseurl + relativeurllist[0]
38        game['gameurl'] = gameurl
39        threading.thread(target=downloadagame, args=(game,)).start()
40
41
42def downloadagame(game):
43    """
44    根据下载链接下载游戏,并保存到.swf文件
45    :param game:
46    :return:
47    """
48    downloadpath = 'games/'
49    if not os.path.exists(downloadpath):
50        try:
51            os.mkdir(downloadpath)
52        except fileexistserror as e:
53            print(e)
54    with open(downloadpath + game['gamename'] + '.swf', 'wb') as file:
55        file.write(requests.get(game['gameurl']).content)
56        print(game['gamename'] + '下载完成')
57
58
59if __name__ == '__main__':
60    indexurl = 'http://www.4399.com'
61    gamebaseurl = 'http://sxiao.4399.com/4399swf'
62    gameurllist = getallgameurl()
63    for i in gameurllist:
64        threading.thread(target=downloadifavailable, args=(i,)).start()