首先还是先创建scrapy项目,当然这都是在你安装scrapy之后啊,这个scrapy还是在linux系统下最省事,一行指令瞬间安装,这酸爽。。。。。
言归正传啊,创建scrapy文件。
<span style="font-size:14px;">scrapy startproject w3school</span>
<span style="font-size:14px;">tree w3school</span>
现在我们开始编写爬虫中的文件,其实需要编写的只有4个文件,items.py pipelines.py setting.py spider.py。现在只是最初级啊,因为现在我还只是一个菜鸟,哇咔咔。
items文件是一个容器,所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于python中字典。按我的理解就是你需要提取什么就写一个Field()。当然这个理解还是很初步的啊,但我坚信在实践中成长才是最快速的,刚开始的时候就是要不求甚解,用的次数多了,随着深入的学习自然就明白了。
import scrapy class W3SchoolItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
process_item函数参数的含义:
item (Item object) – 由parse方法返回的Item对象
spider (BaseSpider object) – 抓取到这个Item对象对应的爬虫对象
# -*- coding: utf-8 -*- import json import codecs # 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 W3SchoolPipeline(object): def __init__(self): self.file = codecs.open('W3School_data.json','wb',encoding = 'utf-8')#初始化创建一个W3School_data.json的文件 def process_item(self, item, spider): line = json.dumps(dict(item)) + '\n'#对数据类型进行编码 print line self.file.write(line.decode("unicode_escape")) return item写完pipelines文件之后就一定要在setting文件中添加一行代码。从Spider的parse返回的Item数据将依次被ITEM_PIPELINES列表中的Pipeline类处理。
ITEM_PIPELINES = {'w3school.pipelines.W3SchoolPipeline':300}
scrapy还提供了log功能,具体我也不知道它有什么功能,应该是可以捕捉scrapy的日志。里面的msg()函数可以记录信息,然后会将信息显示在终端窗口中,有点C++里messagebox的意思。
Scrapy提供5层logging级别:
:data:`~scrapy.log.CRITICAL` - 严重错误(critical)
:data:`~scrapy.log.ERROR` - 一般错误(regular errors)
:data:`~scrapy.log.WARNING` - 警告信息(warning messages)
:data:`~scrapy.log.INFO` - 一般信息(informational messages)
:data:`~scrapy.log.DEBUG` - 调试信息(debugging messages)
from scrapy.spider import Spider from scrapy.selector import Selector from scrapy import log from w3school.items import W3SchoolItem class W3schoolSpider(Spider): name = 'w3school' allowed_domains = ["w3school.com.cn"] start_urls = ['http://www.w3school.com.cn/'] def parse(self,response): sel = Selector(response) sites = sel.xpath('//div[@id="navfirst"]/ul[1]/li')#找到id=navfirst的div,找到其中ul里面li里的信息。 items = [] for site in sites: item = W3SchoolItem()#每个item都相当于一个字典 title = site.xpath('a/text()').extract()#提取<a></a>中间的内容 link = site.xpath('a/@href').extract()#提取<a>中href的内容 desc = site.xpath('a/@title').extract()#提取<a>中title的内容 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
scrapy crawl w3school
{"title": ["HTML 系列教程"], "link": ["/h.asp"], "desc": ["HTML 系列教程"]} {"title": ["浏览器脚本"], "link": ["/b.asp"], "desc": ["浏览器脚本教程"]} {"title": ["服务器脚本"], "link": ["/s.asp"], "desc": ["服务器脚本教程"]} {"title": ["ASP.NET 教程"], "link": ["/d.asp"], "desc": ["ASP.NET 教程"]} {"title": ["XML 系列教程"], "link": ["/x.asp"], "desc": ["XML 系列教程"]} {"title": ["Web Services 系列教程"], "link": ["/ws.asp"], "desc": ["Web Services 系列教程"]} {"title": ["建站手册"], "link": ["/w.asp"], "desc": ["建站手册"]}
原文地址:http://blog.csdn.net/djd1234567/article/details/45673643