scrapy入门爬取w3school

首先推荐一个系列教程http://blog.csdn.net/u012150179/article/category/2345511

此篇文章就是根据上边系列中的scrapy研究探索(二)——爬w3school.com.cn学习总结更改而来

1.前期准备

  scapy的安装请自行百度,我最开始安装的时候遇到颇多的问题,但大多都是缺少库引起的,所以安装中遇到问题时的中心思想就是看错误提示,缺少什么库就去安装什么库。
  在开始之前假设你已经安装好了环境,我们今天要利用scrapy爬取的是w3school的XPath教程中的导航栏如下图:

  • 创建项目
1
2
3
4
5
6
7
8
9
10
tenshine@tenshine:~$ scrapy startproject w3school
2015-09-07 16:26:12 [scrapy] INFO: Scrapy 1.0.2 started (bot: scrapybot)
2015-09-07 16:26:12 [scrapy] INFO: Optional features available: ssl, http11
2015-09-07 16:26:12 [scrapy] INFO: Overridden settings: {}
New Scrapy project 'w3school' created in:
/home/tenshine/w3school
You can start your first spider with:
cd w3school
scrapy genspider example example.com

这样就在当前目录中新建了这个项目的目录:

1
2
3
4
5
6
7
8
9
10
tenshine@tenshine:~$ tree w3school/
w3school/
├── scrapy.cfg
└── w3school
├── __init__.py
├── items.py
├── pipelines.py
├── settings.py
└── spiders
└── __init__.py

其中scrapy.cfg是项目的配置文件。主要改写的是w3school中的三个文件以及其中spiders需要新建爬虫文件并编写。

  • 在item.py中定义item容器

所谓item容器,就是给将要爬取的项定义一个数据结构,它工作方式像python里面的字典,比如我要爬取文章标题,我要定义一个title=scrapy.Field()
所以item.py中的内容如下:

1
2
3
4
5
6
7
import scrapy
class W3SchoolItem(scrapy.Item):
title = scrapy.Field()#标题
link = scrapy.Field()#链接地址
desc = scrapy.Field()#描述
pass
  • 在pipelines.py中编写W3schoolPipeline实现对item的处理

在其中主要完成数据的查重、丢弃,验证item中数据,将得到的item数据保存等工作。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
import json
import codecs
class W3SchoolPipeline(object):
def __init__(self):
self.file = codecs.open('w3school_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文件中。
这里利用到了codecs库,详情可参考http://blog.csdn.net/suofiya2008/article/details/5579413

在编写完pipeline后,为了能够启动它,必须将其加入到ITEM_PIPLINES配置中,即在settings.py中加入下面一句:

1
2
3
ITEM_PIPELINES = {
'w3school.pipelines.W3SchoolPipeline': 300,
}

其实上面这个配置在settings.py中已经有了,只不过是注释起来了,你可以将其打开然后将其原来的SomePipiline改成自己定义的就行了。

2.编写爬虫

接下来是编写我们的爬虫文件,在spider文件夹下创建一个新的py文件,我们这里起名为w3school_spider.py
然后下面是这个文件的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from scrapy.spiders import Spider
from scrapy.selector import Selector
import logging
from w3school.items import W3SchoolItem
class W3schoolSpider(Spider):
name = "w3school"
allowed_domains = ["w3school.com.cn"]
start_urls = [
"http://www.w3school.com.cn/xpath/index.asp"
]
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//div[@id="course"]/ul[1]/li')
items = []
for site in sites:
item = W3SchoolItem()
title = site.xpath('a/text()').extract()[0]
item['title'] = title
link = site.xpath('a/@href').extract()[0]
item['link'] = link
#这是输出文字的两种方法
desc = site.xpath('a/@title').extract()
item['desc'] = [d.encode('utf-8') for d in desc]
items.append(item)
return items
  • 此文件的名称可以自己定,但是有一点需要注意就是此文件不能和工程名一样,否则在from 工程.items import item是会提示错误无法找到工程.items,就是上面的from w3school.items import W3SchoolItem
  • 属性name即spider唯一名字:开始爬虫时需要用到这个名字;start_url可以理解为爬取入口:从哪个url开始。
  • parse()是对Spider类中parse的重写,在它里面定义了爬虫的规则。
  • 像我代码中注释所说的,从网上找的很多例子的log功能都是用from scrapy import log,由于版本问题它已经deprecated了并提示使用python的内建函数logging。其中的格式化输出请自行搜索。
  • scrapy使用选择器Selector并通过XPath实现数据的提取。我这里爬取的就是w3school的xpaht教程的界面,不懂的可以直接在这学习了。
  • allowed_domains中规定爬虫只允许分析的url,如果不在这个列表中就不考虑

3.运行

我们的爬虫已经编写完成了,下面开始爬取,进入到项目的目录中,然后如下:

1
tenshine@tenshine:~/w3school$ scrapy crawl w3school

这是屏幕打印出了很多的log信息,在工程目录下同时产生了两个文件:w3school.log和w3school_utf8.json,结果都在json文件中,如下:

1
2
3
4
5
6
7
8
{"title": "XPath 教程", "link": "http://www.w3school.com.cn/xpath/index.asp", "desc": ["XPath 教程"]}
{"title": "XPath 简介", "link": "http://www.w3school.com.cn/xpath/xpath_intro.asp", "desc": ["XPath 简介"]}
{"title": "XPath 节点", "link": "http://www.w3school.com.cn/xpath/xpath_nodes.asp", "desc": ["XPath 节点"]}
{"title": "XPath 语法", "link": "http://www.w3school.com.cn/xpath/xpath_syntax.asp", "desc": ["XPath 语法"]}
{"title": "XPath 轴", "link": "http://www.w3school.com.cn/xpath/xpath_axes.asp", "desc": ["XPath Axes(轴)"]}
{"title": "XPath 运算符", "link": "http://www.w3school.com.cn/xpath/xpath_operators.asp", "desc": ["XPath 运算符"]}
{"title": "XPath 实例", "link": "http://www.w3school.com.cn/xpath/xpath_examples.asp", "desc": ["XPath 实例"]}
{"title": "XPath 总结", "link": "http://www.w3school.com.cn/xpath/xpath_summary.asp", "desc": ["您已经学习了 XPath,下一步呢?"]}

以上算是scrapy的最简单程序,可以看到什么不懂的就去查什么。

#####此工程的github地址:https://github.com/lowkeynic4/crawl/tree/master/w3school