scrapy作为一个用python编写的网络爬虫,继承了python简单易用的特点,目前已经在很多项目中所使用。
这里也是因为工作中的需要,把scrapy使用过程中的一些心得和遇到的问题记录下来以便加深记忆。
scrapy安装的过程就不在这里详述了,大家安装都会碰到各种不同的问题,主要还是因为python版本,vc++版本以及scrapy版本的兼容性引起的。
这里也附上我的安装及运行环境:windows7+python2.6+Microsoft Visual Studio 2010+scrapy 0.18
最好不要用最新scrapy版本,在一些包的依赖上会报错,导致各种各样稀奇古怪的错误。
一个简单的scrapy项目很简单,会生成4个文件和一个文件夹,scrapy爬虫就是围绕这些文件进行工作,把最主要的过程自行封装好了。(如下图)
实际的目录结构如下:
scrapy.cfg myproject/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py spider1.py spider2.py ...
scrapy.cfg:爬虫项目的注册文件,不可修改。
items.py:用于定义蜘蛛爬行的信息分类,比如标题、正文、描述等。
items.py文件很重要,类似mvc模型中的m,用于定义最终接收的数据类型,也就是需要的数据信息。
一个典型的items.py文件信息如下:
from scrapy.item import Item, Field class Website(Item): title = Field() description = Field() urls = Field()
这里就定义了一个典型的item类Website,用于接收爬虫爬下来的信息,进行第二步处理。
Pipeline.py:scrapy的管道文件,用于对抓取信息进行关键词或规则的抽取及过滤。举个例子,你现在需要抓取一类热点概念如“上海自贸区”相关的股票信息,这部分信息在个股的描述字段
里面有记录,但你抓取的页面上并没有单独将“上海自贸区”的类别独立出来,而你想要这部分的信息,那么你可以在Pipeline文件中进行定义,让蜘蛛在抓取信息后再经过一次过滤,这个过程有点类似水经过管道的过程,所以中文翻译将Pipeline.py定义为管道文件。
一个典型的Pipeline.py文件内容如下:
from scrapy.exceptions import DropItem class FilterWordsPipeline(object): """A pipeline for filtering out items which contain certain words in their description""" # put all words in lowercase words_to_filter = [‘上海自贸区‘] def process_item(self, item, spider): for word in self.words_to_filter: if word not in unicode(item[‘description‘]).lower(): raise DropItem("Contains forbidden word: %s" % word) else: return item
settings.py:scrapy项目的全局设置文件。
看名字就知道,这个文件用来设置一些全局的参数,对蜘蛛爬虫的行为进行控制,可以说是最核心的文件。
一些典型的settings参数设置如下:
SPIDER_MODULES 蜘蛛模块所在的目录,默认位于项目名/spiders DOWNLOAD_DELAY 蜘蛛爬取页面的时间间隔,这个参数很重要,一般设置为0.5-1秒,太频繁会被对方网站封IP USER_AGENT 用户代理信息,用来定义访问目标网站头部的user-agent信息 BOT_NAME 蜘蛛爬虫名,默认为"scrapybot",出现在headers头部信息中 CONCURRENT_ITEMS 爬虫一次可识别的对象信息个数,默认为100 CONCURRENT_REQUESTS 爬虫可同时响应的请求个数,默认为16 CONCURRENT_REQUESTS_PER_DOMAIN 针对单个域名爬虫一次可同时响应的请求个数,默认为8 DEFAULT_REQUEST_HEADERS 可定义爬虫的头部信息,用于伪装成用户进程 DOWNLOAD_TIMEOUT 设置蜘蛛爬行的超时时间 ITEM_PIPELINES 定义蜘蛛爬虫的管道信息 LOG_ENABLED 是否允许日志记录 LOG_ENCODING 日志编码
spiders:用于定义各种各样的蜘蛛文件,每个蜘蛛里面定义了其爬行网站获取信息的规则,也就是说从某个网站上以什么样的方式获取何种类型的数据都在这里面进行定义。
一个简单的spiders.py文件内容如下:
from scrapy.selector import HtmlXPathSelector from scrapy.spider import BaseSpider from scrapy.http import Request from myproject.items import MyItem class MySpider(BaseSpider): name = ‘example.com‘ allowed_domains = [‘example.com‘] start_urls = [ ‘http://www.example.com/1.html‘, ‘http://www.example.com/2.html‘, ‘http://www.example.com/3.html‘, ] def parse(self, response): hxs = HtmlXPathSelector(response) for h3 in hxs.select(‘//h3‘).extract(): yield MyItem(title=h3) for url in hxs.select(‘//a/@href‘).extract(): yield Request(url, callback=self.parse)
其中name为蜘蛛名词,allowed_domains为爬行的域名,start_urls为爬行的url列表,parse为解析的过程。
对于scrapy来说,一共有几大类型的蜘蛛,分别如下:
BaseSpider: 基础的爬虫类,可以说是通用的,可自行在里面重构其解析函数。
CrawlSpider:典型的爬虫蜘蛛类,可对大部分通用的网站进行爬行。
XMLFeedSpider:XML专门的爬虫类
CSVFeedSpider:适用于CSV页面的爬虫类
SitemapSpider:适用于sitemap的爬虫类