利用Python的scrapy框架爬取手游排行前几名的手游信息

初学scrapy框架

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

有关于scrapy的教学与基础知识这里不做解释,感兴趣的同学可以去访问

http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html(此为中文教程,版本有点过时,但语法基本相同)

接下来进入正题:

所用的版本为Python3.6.1  scrapy为1.4.0

次篇实例会用到xpath(可在此网站学习http://www.runoob.com/xpath/xpath-syntax.html)与正则表达式,如果对其不了解的同学,建议先学

1、建立一个scrapy工程(此命令在dos下输入)

scrapy startproject AppGame

然后cd AppGame

2、在\AppGame\AppGame\spiders的目录下建立一个文件Appgame.py,此为spider文件,也就是定义爬虫的爬取规则的文件

代码如下:

'''
please in here defined yours spider
define crawler rules


'''
import scrapy

#下为导入的item类,后面会讲到
from  AppGame.items import  AppgameItem


class Myfilm(scrapy.Spider):
    name="game"
    allowed_domains=["anfensi.com"]#域名
    start_urls = ['http://www.anfensi.com/top/wangyou/',
    'http://www.anfensi.com/top/wangyou/2.html']




    def parse(self,response):
#response是一个html响应对象可以用xpath规则进行解析

#这里我们需要分析一下http://www.anfensi.com/top/wangyou/这个网页的html,用Google的开发者工具查看

利用Python的scrapy框架爬取手游排行前几名的手游信息_第1张图片
从上面可以看出游戏名称都是位于div元素id="tp5"的ul下的li元素下i下的a元素中

但是我们发现游戏的类型和标签都是位于u元素下的a元素中,那么我们就需要用到正则表达式来匹配,类型的都为/game/开头

而标签的为/tag/开头,所以用不同的正则表达式来完成

        Topgame=response.xpath('//div[@id="tp5"]/ul/li')
        for each_game in Topgame:
            item= AppgameItem()

#存储游戏名字在item的name属性下
           item['name']=each_game.xpath('./i/a/text()').extract()[0]


           item['type']=each_game.xpath('./i/u/a[re:test(@href,"/game/.+")]/text()').extract()[0]

#因为后面没有[0],所以返回的是一个列表,不是字符串,所以下面将其转换为字符串
           listlabel=each_game.xpath('./i/u/a[re:test(@href,"/tag/.+")]//text()').extract()
           item['label']=str(listlabel)
        yield item


3、接下来就是定义一个item文件,在AppGame\AppGame目录下编写item.py文件,也可以自己建立一个item文件

代码如下:

import scrapy


#item类似于字典

class AppgameItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

#游戏名字
    name = scrapy.Field()

#游戏的类型
    type
=scrapy.Field()

#游戏的标签
    label=scrapy.Field()


4、定义pipeline,AppGame\AppGame目录下编写pipeline.py文件,也可以自己建立一个pipeline文件

# -*- coding: utf-8 -*-


# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html




class AppgamePipeline(object):
    def process_item(self, item, spider):
        with open ("my_games.txt",'a',encoding="utf-8") as f:
        f.write(item['name']+ '\n')
        f.write(item['type']+ '\n')
        f.write(item['label']+ '\n')

5、定义setting文件,AppGame\AppGame目录下编写setting.py文件

加入下面代码:

ITEM_PIPELINES = {'AppGame.pipelines.AppgamePipeline':100}

后面的100为优先级,越小优先级越高


6、然后直接运行

scrapy crawl game

这里的‘game’,就是 Appgame.py文件中定义的name的值,运行如下

利用Python的scrapy框架爬取手游排行前几名的手游信息_第2张图片

当然没有全部截取

最后找到在pipeline中我们写入的文件my_games.txt,打开可以看到下面

利用Python的scrapy框架爬取手游排行前几名的手游信息_第3张图片

我们可以发现RPG(角色扮演)类型的游戏占多数。

完成。

希望这篇博文对你有所帮助

你可能感兴趣的:(Python,python,网络爬虫,框架)