下午被一个问题困扰了好一阵终于使用还有一种方式解决
開始教程二关于 Scrapy 安装介绍等请移步至教程 (一)(http://blog.csdn.net/u012150179/article/details/32343635)
在開始之前如果你已经安装成功一切所需, 整怀着一腔热血想要抓取某站点
一起来 have a try
1. 前期基础准备
Oh, 不能在准备了, 直接来
(1) 创建项目
输入:
scapy startproject w3school
以上创建项目 w3school 这时会产生 w3school 目录, 目录下文件例如以下:
- scrapy.cfg
- w3school/
- __init__.py
- items.py
- pipelines.py
- settings.py
- spiders/
- __init__.py
当中 scrapy.cfg 目的配置文件主要改写的是 w3school 中的三个文件以及当中 spiders 中须要编写的爬虫
一个一个来
(2) 在 items.py 中定义 Item 容器也就是编写 items.py 内容
所谓 Item 容器就是将在网页中获取的数据结构化保存的数据结构, 类似于 python 中字典以下为 items.py 中代码
- #project: w3school
- #file : items.py
- #author : younghz
- #brief : define W3schoolItem.
- from scrapy.item import Item,Field
- class W3schoolItem(Item):
- title = Field()
- link = Field()
- desc = Field()
上面定义了自己的 W3schoolItem 类, 它继承自 scrapy 的 Item(这里没有显示定义 W3schoolItem 的__init__() 方法也正由于如此, python 也会为你自己主动调用基类的__init__(), 否则必须显式在子类的__init__() 中调用基类__init__())
之后声明 W3schoolItem 中元素并使用 Field 定义到此 items.py 就 OK 了
(3) 在 pipelines.py 中编写 W3schoolPipeline 实现对 item 的处理
在当中主要完毕数据的查重丢弃, 验证 item 中数据将得到的 item 数据保存等工作代码例如以下:
- import json
- import codecs
- class W3SchoolPipeline(object):
- def __init__(self):
- self.file = codecs.open('w3school_data_utf8.json', 'wb', encoding='utf-8')
- def process_item(self, item, spider):
- line = json.dumps(dict(item)) + '\n'
- # print line
- self.file.write(line.decode("unicode_escape"))
- return item
当中的 process_item 方法是必须调用的用来处理 item, 而且返回值必须为 Item 类的对象或者是抛出 DropItem 异常而且上述方法将得到的 item 实现解码, 以便正常显示中文终于保存到 json 文件里
注意: 在编写完 pipeline 后为了可以启动它, 必须将其增加到 ITEM_PIPLINES 配置中, 即在 settings.py 中增加以下一句:
- ITEM_PIPELINES = {
- 'w3school.pipelines.W3SchoolPipeline': 300
- }
2. 编写爬虫
爬虫编写是在 spider / 目录下编写 w3cshool_spider.py
先上整个程序在慢慢解释:
- #!/usr/bin/python
- # -*- coding:utf-8 -*-
- from scrapy.spider import Spider
- from scrapy.selector import Selector
- from scrapy import log
- from w3school.items import W3schoolItem
- class W3schoolSpider(Spider):
- """爬取 w3school 标签"""
- #log.start("log",loglevel='INFO')
- name = "w3school"
- allowed_domains = ["w3school.com.cn"]
- start_urls = [
- "http://www.w3school.com.cn/xml/xml_syntax.asp"
- ]
- def parse(self, response):
- sel = Selector(response)
- sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
- items = []
- for site in sites:
- item = W3schoolItem()
- title = site.xpath('a/text()').extract()
- link = site.xpath('a/@href').extract()
- desc = site.xpath('a/@title').extract()
- item['title'] = [t.encode('utf-8') for t in title]
- item['link'] = [l.encode('utf-8') for l in link]
- item['desc'] = [d.encode('utf-8') for d in desc]
- items.append(item)
- #记录
- log.msg("Appending item...",level='INFO')
- log.msg("Append done.",level='INFO')
- return items
(1) 须要注意的是编写的 spider 必须继承自 scrapy 的 Spider 类
属性 name 即 spider 唯一名字, start_url 能够理解为爬取入口
(2)parse 方法
parse() 是对 scrapy.Spider 类的 override
(3) 网页中的数据提取机制
scrapy 使用选择器 Selector 并通过 XPath 实现数据的提取关于 XPath 推荐 w3school 的教程
小工具:
关于网页代码中意向信息的查找能够借助几个工具:
第一个 Firefox 插件 Firebug
第二个 Firefox 插件 XPath 能够高速的在网页中对 xpath 表达式的正确性进行验证
第三个 scrapy shell. 关于其使用能够查看教程
分析:
在这里我提取的是 http://www.w3school.com.cn/xml/xml_syntax.asp 网页中下图部分
即 XML 基础下全部文件夹结构的名字链接和描写叙述
使用 Firebug 找到次部分相应的代码块后就能够使用 XPath 运行信息提取 Xpath 表达式如上面代码中所看到的
上面还涉及到了对 item 中信息的编码, 是为了中文信息在 json 文件里的正确显示
(4) 在 parse 方法中还使用到了 log 功能实现信息记录使用 log.mes() 函数就可以
3. 运行
一切就绪
进入到项目文件夹下, 运行:
scrapy crawl w3school--set LOG_FILE = log
在文件夹下生成 log 和 w3school_data_utf8.json 文件
查看生成的 json 文件:
OK 这就实现了针对 http://www.w3school.com.cn/xml/xml_syntax.asp 中导航条部分的提取
原创, 转载注明: http://blog.csdn.net/u012150179/article/details/32911511
关于 scrapy 的其他文章:
- http://blog.csdn.net/u012150179/article/details/34913315
- http://blog.csdn.net/u012150179/article/details/34486677
- http://blog.csdn.net/u012150179/article/details/34441655
- http://blog.csdn.net/u012150179/article/details/32911511
- http://blog.csdn.net/u012150179/article/details/35774323
来源: http://www.bubuko.com/infodetail-2499505.html