scrapy爬虫框架学习入门教程及实例

来源:互联网 发布:淘宝网首页百色针织 编辑:程序博客网 时间:2024/06/05 06:00

Scrapy是一个基于Twisted,纯Python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便~

Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:

绿线是数据流向,首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。


在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容

1. 创建一个新的Scrapy Project

2. 定义你需要从网页中提取的元素Item

3.实现一个Spider类,通过接口完成爬取URL和提取Item的功能

4. 实现一个Item PipeLine类,完成Item的存储功能


爬取网址: 盗墓笔记小说    http://www.daomubiji.com/

                爬取盗墓笔记小说  书的大标题  小标题   章节名称  第几章  章节网址

Step1: 新建scrapy工程

    打开命令行   scrapy   startproject     工程名称

   建好工程,有以下几个文件

   

必有的文件     settings.py    items.py    pipelines.py    __init__.py  scrapy.cfg  及spider文件夹下 __init__.py   其它一些是自己后来添加的

scrapy.cfg: 项目配置文件

items.py: 需要提取的数据结构定义文件

pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等

settings.py: 爬虫配置文件

spiders: 放置spider的目录


Step2: 各个文件如何定义及其连接使用

1、settings配置

下面前三行是建工程自动配置的
BOT_NAME = 'novelspider'SPIDER_MODULES = ['novelspider.spiders']NEWSPIDER_MODULE = 'novelspider.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent##  ITEM_PIPELINES是自己添加的    novelspider工程名字    NovelspiderPipeline 为文件pipelines中的类ITEM_PIPELINES = ['novelspider.pipelines.NovelspiderPipeline']   # Obey robots.txt rules# user_agent 自动配置 可修改USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'COOKIES_ENABLED = True   # 连接接数据库MONGODB_HOST = '127.0.0.1'MONGODB_PORT = 27017MONGODB_DBNAME = 'ss'MONGODB_DOCNAME = 'daomubiji'

2、定义Item
在items.py里面定义我们要抓取的数据:
from scrapy.item import Item,Fieldclass NovelspiderItem(Item):    # define the fields for your item here like:    bookName = Field()            #书的大标题    bookTitle = Field()           #书的小标题
    chapterNum = Field()          #书的章节    chapterName = Field()         #书的章节名字    chapterURL = Field()          #各章节url    # name = scrapy.Field()    #pass

3、实现Pipelines
PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。
我这里保存到了mongodb数据库,利用可视化工具  mongoVUE

代码如下
#导入了3个模块from items import NovelspiderItem          ## 链接itemfrom scrapy.conf import settings          #from scrapy import settings         #  不出错import pymongoclass NovelspiderPipeline(object):    def __init__(self):        host = settings['MONGODB_HOST']                ## settings 赋值piplines        port = settings['MONGODB_PORT']        dbName = settings['MONGODB_DBNAME']   ## 数据库名字        client = pymongo.MongoClient(host = host,port = port)   #链接数据库        tdb = client[dbName]        self.post = tdb[settings['MONGODB_DOCNAME']]           print 'piplines'    def process_item(self, item, spider):        bookInfo = dict(item)    #item转换为字典        self.post.insert(bookInfo)    # 把数据存入到bookInfo字典里,插入数据库        return item

4、实现spider

Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员

name: 名字,这个spider的标识

start_urls:一个url列表,spider从这些网页开始抓取

parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表

所以在spiders目录下新建一个spider,novelspider.py:


实现代码如下

# -*- coding: utf-8 -*-import sysreload(sys)sys.setdefaultencoding("utf-8")# 导入3个模块  一个CrawlSpider   一个selector   一个导入item类的模块#from scrapy.spiders import CrawlSpiderfrom scrapy.contrib.spiders import CrawlSpider    # from scrapy.selector import Selector           # 出错:没有该模块  更换下面这个模块XpathSelectorfrom scrapy.selector import XPathSelector        # 导入不出错from novelspider.items import  NovelspiderItem   #导入item中的类NovelspiderItem#from scrapy.selector import HtmlXPathSelector自定义类class novSpider(CrawlSpider):    name = "novspider"           # name ,spider标识 唯一                         redis_key = 'nvospider'    start_urls = ['http://www.daomubiji.com/']      #spider从这里开始爬取网页    def parse(self,response):        selector = XPathSelector(response)         #  获取网页源代码        print '爬取源码完毕。。。'        table = selector.select('//table')    ##  查找书及其内容所在位置,获取书的名字                for each in table:            bookName = each.select('tr/td[@colspan="3"]/center/h2/text()').extract()[0]            content = each.select('tr/td/a/text()').extract()     # 章节名称             url = each.select('tr/td/a/@href').extract()          # 章节网址             # print type(bookName)            # print content      # 列表                for i in range(len(url)):                item = NovelspiderItem()        #链接item                item['bookName'] = bookName                item['chapterURL'] = url[i]    ## 赋值给item中定义的chapterurl                ###  防止报错                try:                    item['bookTitle'] = content[i].split(' ')[0]                    item['chapterNum'] = content[i].split(' ')[1]                except Exception,e:                    continue                try:                    item['chapterName'] = content[i].split(' ')[2]                except Exception,e:                    item['chapterName'] = content[i].split(' ')[1][-3:]                yield item

Step3  运行工程

上述四个文件的配置定义实现做好后就可以运行该程序了

如何运行程序

1、新建立一个.py文件 例如  main.py

#coding=utf-8from scrapy import cmdline      # 导入命令行cmdline.execute("scrapy crawl novspider".split())   #命令行运行scrapy工程
注意:crawl后的(这里novspider)是自己定义的 name (spider标识)的名字,不是工程名字

2、直接启动命令行
scrapy  crawl novspider

结果保存,我这里保存到了mongodb数据库,利用可视化工具mongoVUE显示
结果如下


还可以保存到txt文件中
f = open('daomubiji.txt','a+')
f.write()       写入

保存CSV文件,只是不知道为什么是乱码
settings.py内添加
FEED_URI = u'file///F:\daomubiji\daobi.csv'  文件路径FEED_FORMAT = 'CSV'





0 0
原创粉丝点击