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)与正则表达式,如果对其不了解的同学,建议先学
scrapy startproject AppGame
然后cd AppGame
代码如下:
'''
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的开发者工具查看
从上面可以看出游戏名称都是位于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
代码如下:
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()
# -*- 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')
加入下面代码:
ITEM_PIPELINES = {'AppGame.pipelines.AppgamePipeline':100}
后面的100为优先级,越小优先级越高
scrapy crawl game
这里的‘game’,就是 Appgame.py文件中定义的name的值,运行如下
当然没有全部截取
最后找到在pipeline中我们写入的文件my_games.txt,打开可以看到下面
我们可以发现RPG(角色扮演)类型的游戏占多数。
完成。
希望这篇博文对你有所帮助