python爬虫 互动版

scrapy实战

本节主要讲述w3c项目的实际编码。

首先编辑items.py设置要抓取的数据,本项目是抓取页面中的名称,链接和描述三中数据。具体实现如下:

import scrapy
class W3CItem(scrapy.Item):
    # define the fields for your item here like:
    title =scrapy.Field()
    link=scrapy.Field()
    desc=scrapy.Field()

然后编写w3cSpider.py,设置爬取页面的地址及爬取规则

import scrapy
from scrapy.selector import  Selector
from w3c.items import W3CItem
class w3cSpider(scrapy.Spider):
    name='w3c_spider'#爬虫名称,命令行运行时要用到
    allowed_domains=['w3school.com.cn']
    start_urls=[
        "http://www.w3school.com.cn/xml/xml_syntax.asp" #爬取的页面地址
    ]
    def parse(self, response):#scrapy根据爬取地址发送请求后调用parse进行数据提取
        sel=Selector(response)
        sites=sel.xpath('//div[@id="course"]/ul/li')#使用xpath提取页面信息
        for site in sites:
            item = W3CItem()
            title = site.xpath('a/@title').extract()#提取title
            link = site.xpath('a/@href').extract()#提取链接
            desc=site.xpath('a/text()').extract()#提取描述
            item['title']=title[0]#组织item数据
            item['link']=link[0]
            item['desc']=desc[0]
            yield  item #返回item数据给pipeline使用

本项目只需要将抓取的数据存储起来即可所以在pipelines.py中实现settings.py设置的W3CPipeline类即可。首先在settings.py中配置ItemPipeLine,代码如下

ITEM_PIPELINES = {
   'w3c.pipelines.W3CPipeline': 300,
}

最后编写pipelines.py文件,对爬取的item进行处理

import json
import codecs
class W3CPipeline(object):
    def __init__(self):
        self.file=codecs.open('w3c.json','wb',encoding='utf-8')#打开文件
    def process_item(self, item, spider):
        line=json.dumps(item['title'],ensure_ascii=False)+'\t'
        line = line+json.dumps(item['link'],ensure_ascii=False)+'\t'
        line = line+json.dumps(item['desc'],ensure_ascii=False)+'\n'
        self.file.write(line)#写入文件

编写完成后就可以运行了,在w3c项目的根目录中使用命令 scrapy crawl w3c_spider 就可以进行数据爬取啦。完整程序请参考文件夹中的w3c项目