象棋机器人 1 数据分析收集-爬虫编写

这一篇主要做数据准备工作。解决象棋机器人的训练数据问题。

用scrapy编写个简单爬虫,爬取网上的数据,开始设计时比较简单,单线程抓取,爬了几天才爬了6万盘棋的数据。

棋谱收集站(http://game.onegreen.net/chess/Index.html)数据分析得取如下抓取的数据格式:

{'desc': '1999年全国象棋个人赛',
 'init': '',
 'move_list': '774770627967807089796364797310222625121646452042736330416362003062637275192730366748362617181666635366654746754529477077476577276547271748671718394823245355454425242624093918160605838439334454333554525545161367555254352524254525545246262201254501224525220125450122452522012545525426460122452554524626220125450122452522012545012245252210556352562646131625451022638440304535304035454030483916365948565484725414464336384323141923292234725130405143342645152618153538354335182635162618',
 'name_black': '河北 阎文清',
 'name_red': '浙江 陈寒峰',
 'result': '和棋',
 'title': '浙江 陈寒峰 和 河北 阎文清',
 'url': 'http://game.onegreen.net/chess/HTML/27883.html'}

对残局的数据例子如下:

{'desc': '象棋实用残局第二集',
 'init': '9999299949999999249999869999999958999999519999999999999999997699',
 'move_list': '8685766685846667847458552444676874645559494868584838592964542925383725155453151737381713534313183837184844485848',
 'name_black': '',
 'name_red': '',
 'result': '和棋',
 'title': '第177局 车兵相和车卒',
 'url': 'http://game.onegreen.net/chess/HTML/21806.html'}

字段说明

name_black:拿黑色棋的人
name_red: 拿红色棋的人
result:对局结果
url:数据收集对应的网页
desc: 棋局说明
title: 棋局标题
init: 初始棋局状态,残局时列出条个子的状态。每2伴数字代表一个棋子,值代码棋子对应的位置。(后面后说明)
move_list:下棋顺序列表, 每步棋用4个数字来表示。每两位代码位置信息,表示从哪个位置移到了哪个位置。如例子的第一步:“7747” 表示右炮移中线(当头炮)


棋盘位置说明

以左上角为中心点:坐标如下图,列代表第一位数字,行用第二位数字来表示, 如右上角的黑车的坐标为“80”,右下角的红车的坐标为“89”



棋子位置说明: init对应的值,长度64,每两半代码一个棋子。一共32个棋子。位置“99” 表示无效位置。

以例子中的init("9999299949999999249999869999999958999999519999999999999999997699")为例:

位置说明:

1  99 红车
2  99 红马
3  29 红相
4  99 红仕
5  49 红帅
6  99 红仕
7  99 红相
8  99 红马
9  24 红车
10 99 红炮
11 99 红炮
12 86 红兵
13 99 红兵
14 99 红兵
15 99 红兵
16 99 红兵
17 58 黑车
18 99 黑马
19 99 黑相
20 99 黑士
21 51 黑将
22 99 黑士
23 99 黑相
24 99 黑马
25 99 黑车
26 99 黑炮
27 99 黑炮
28 99 黑卒
29 99 黑卒
30 99 黑卒
31 76 黑卒
32 99 黑卒
对应的图为:


移动步数说明(move_list)
以残局例子为例(" 8685766685846667847458552444676874645559494868584838592964542925383725155453151737381713534313183837184844485848")
8685 兵一进一(兵开始位置为 "86", 改变到位置"85")
7666 卒8平7 (卒从位置“76” 移到位置“66”)
 ...

scrapy 开始操作

具体安装scrapy操作网上有好多说明,这里就不说了。

爬虫代码

建立爬虫工程chessspider

scrapy startproject chessspider
修改items.py

import scrapy

class ChessDataItem(scrapy.Item):
    url = scrapy.Field()
    init = scrapy.Field()
    name_black = scrapy.Field()
    name_red = scrapy.Field()
    title = scrapy.Field()
    time = scrapy.Field()
    move_list = scrapy.Field()
    desc = scrapy.Field()
    result = scrapy.Field()
    pass

添加spiders/chessdataspider.py 添加自己的爬虫。

代码如下

__author__ = 'jerome'

import scrapy
from scrapy.selector import Selector
from scrapy.crawler import CrawlerRunner
from twisted.internet import reactor
from scrapy.settings import Settings
from scrapy.http import Request
import sys
sys.path.append("../..")
from chessspider.items import ChessDataItem

class ChessDataSpider(scrapy.Spider):
    name = "chessdataspider"
    #设置下载延时
    download_delay = 2
    allowed_domains = ["game.onegreen.net"]
    start_urls = [
        "http://game.onegreen.net/chess/Index.html",
        # "http://game.onegreen.net/chess/HTML/21806.html"
    ]
    def parse(self, response):
        hxs = Selector(response)
        title = hxs.xpath("//title/text()")[0].extract()
        iframes = hxs.xpath("//iframe/@name").extract()

        is_item = False
        for iframe in iframes:
            item = self.parse_item(title, iframe)
            if len(item["move_list"]) > 0:
                is_item = True
                item["url"] = response.url
                yield item

        if not is_item and response.url.find("/chess/HTML/") < 0:
            for url in hxs.xpath("//a/@href").extract():
                if url.find("chess") >= 0:
                    print("ok url:", url)
                    if url.find("http://game.onegreen.net") >= 0:
                        yield Request(url, callback=self.parse)
                    else:
                        yield Request("http://game.onegreen.net" + url, callback=self.parse)
                else:
                    print("error url:", url)


    def get_Data(self, data, pattern):
        result = []
        start_index = 0
        for _ in range(10):
            start = data.find("[{}]".format(pattern), start_index, len(data))

            if start < 0:
                break
            start += len("[{}]".format(pattern))
            end = data.find("[/{}]".format(pattern), start_index, len(data))
            if start < end:
                result.append(data[start:end])
            start_index = end + len("[/{}]".format(pattern))
        if len(result) == 0:
            return ""
        return max(result, key=lambda k: len(result))

    def parse_item(self, title, data):
        item = ChessDataItem()
        item["move_list"] = self.get_Data(data, "DhtmlXQ_movelist")
        item["title"] = self.get_Data(data, "DhtmlXQ_title")
        item["name_black"] = self.get_Data(data, "DhtmlXQ_black")
        item["name_red"] = self.get_Data(data, "DhtmlXQ_red")
        item["desc"] = self.get_Data(data, "DhtmlXQ_event")
        item["result"] = self.get_Data(data, "DhtmlXQ_result")
        item["init"] = self.get_Data(data, "DhtmlXQ_binit")
        if len(item["title"]) == 0:
            item["title"] = title
        return item

if __name__ == '__main__':
    print("*************************** \n\nmain function")
    settings = Settings({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'})
    runner = CrawlerRunner(settings)

    d = runner.crawl(ChessDataSpider)
    reactor.run() # the script will block here until the crawling is finished

其中 main函数是为了测试爬取分析数据结果。 可直接使用"python chessdataspider.py" 进行运行测试

为防止被ban, 使用了两秒钟运行一次请求

download_delay = 2

最后运行爬虫

把结果值输出到当前录下的"item_new.json"文件中

scrapy crawl chessdataspider -o item_new.json

注: scrapy命令要在目录chessspider下才能正常运行。

正常命令运行顺序为:

scrapy startproject chessspider
cd chessspider/
。。。
scrapy crawl chessdataspider -o item_new.json















  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
课程名称: JAVA课程设计 题 目: "网络象棋"游戏的设计与开发 系 名: 信息工程系 专业班级: 软件工程 姓 名: 学 号: 指导教师: 2012年 6 月 18 日 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 信息工程系 设计题目:"网络象棋"游戏的设计与开发 初始条件: 《网络象棋》,网络版的棋类游戏。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 使用JAVA开发一个网络版的象棋游戏。该游戏包括网络功能,棋盘功能和辅助功能。 本系统使用JAVA SWING技术和事件处理机制进行棋盘界面的设计,开发和功能实现, 使用Socket网络编程和多线程技术进行多客户端之间的对战。 系统总体架构如下: 系统功能点说明如下: "编号 "功能名 "功能描述 " "1 "网络功能 "通过网络通信,实现多客户端对战 " "2 "棋盘功能 "绘制棋盘 "绘制棋盘与棋子 " " " "下棋功能 "点击棋子,可以走动 " " " "下棋规则 "设计相应算法,控制不同棋子的走法 " "3 "辅助功能 "悔棋 "通过记录走棋步骤,实现悔棋 " " " "截屏 "关键步骤,实现截屏 " " " "录制 "可以录制每一步下棋的视频 " "4 "系统打包 "系统打包,制作安装程序 " 设计报告撰写格式要求: 一、课程设计说明书(或报告书)正文内容 【设计题目】例如:"即时通"网络通信系统的设计与开发 【开发环境】硬件环境:微机系列,内存在1G以上,软件环境:Microsoft Windows XP 【开发工具】 NetBeans IDE 【完成时间】 2012.6 .4-----2012.6.15 【需求分析】分析阐述要实现的系统应具有什么样的功能。 【系统总体设计方案】 在明确了所要解决的问题后,很自然地就要提出自己解决问题的思路和方案。让读者了 解方案的总体设计和关键技术。 要阐述自己的设计方案,说明为什么要选择或设计这样的方案。 具体包括:系统总的设计思路,体系结构, 总体架构, 功能模块图; 各功能模块所要达到的设计目标的简单介绍; 设计的数据字典(数据库、表的结构); 使用的设计软硬件环境和开发技术和平台等。 【系统详细设计】 在这部分中,要将整个开发工作的内容进行详细的介绍。 一般按照功能模块分成几部分来介绍。每部分应包括文字叙述、界面图片、关键实现技 术(操作或代码)等几个方面综合说明问题。 【系统调试和测试】 调试:介绍设计过程中遇到的问题和解决方法。 测试:介绍如何测试系统,测试中发现的问题和解决方案。 【结束语】 这部分篇幅不大,对整个设计中做的工作、获得的成果、心得体会等做一个简单小结。 【参考文献】罗列在设计过程中查阅的文献名称 注意:参考文献罗列的格式为 资料编号 作者姓名 文献或期刊名称 出版社名称,文献的出版时间或期刊的期号 例如:文献 [1] 吕凤翥,马皓. Java语言程序设计(第2版)[M].北京:清华大学出版社,2010 期刊 [2] 石振国. 用JSP实现对Web数据库的访问[J]. 计算机应用,2010(05):5-8. 二、课程设计说明书(或报告书)正文的书写格式简介 1. 正文标题层次 正文题序层次是文章结构的框架,一般采用社会通用的论文书写形式。即章条序码 统一用阿拉伯数字表示,题序层次可以分为若干级,各级号码之间加小圆点,末尾 一级的后面不加小圆点,层次分级一般不超过四级为宜,示例如下: "第一级(章)" 1 " 2 " 3 " …… " "第二级(条)"1.1 "2.1 "3.1 " …… " " "1.2… "2.2 … "3.2 … " " "第三级(条)"1.1.1 "2.1.1 "3.1.1 " …… " " "1.1.2 … "2.1.2 … "3.1.2 … " " " "1.2.1 "2.2.1 "3.2.1 " " " "1.2.2… "2.2.2… "3.2.2… " " 二、表格 每个表格应有自己的表序与表题,表序与表题间空一格。 例如:表1.1 XXXX ,且表题与表序应写在表格的上方正中处。 三、插图 插图图面要整齐、美观,插图应与正文呼应,不能脱节。每幅插图应有图序与图题, 图序编号要连续,图序与图题间空一格且要放在插图下方居中处。 四、公式 公式应另起一行写在稿纸的中央。 时间安排: "日期 "任务 "课程内容 " "6.18-19 "棋盘界面的绘制 "Eclipse/NetBeans使用 " " " "Swing技术 " "6.19-20 "实现棋子的走动 "事件代理 " "6.20-21 "棋子规则实现 " Socket,Thread,JavaOO " " " " JAVA数据结构 " "6.25 "辅助功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值