scrapy爬虫框架的详细用法

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
Scrapy框架的安装,详见博客http://blog.csdn.net/qq_29186489/article/details/78736945,本文不再赘述。
本文以scrapy抓取一个网站为例子,来详细演示scrapy框架的详细用法。
目标网站:Quotes to Scrape,网址为:http://quotes.toscrape.com/

流程框架

抓取第一个页面
请求第一页的URL并得到源代码,进行下一分析
获取内容和下一页的链接
分析源代码,提取翻页内容,获取下一页链接等待进一步爬取
翻页爬取
请求下一页的信息,分析内容并请求下一页的链接
保存运行结果
将爬取文件存为特定的格式的文件或者存入数据库

具体代码实现及命令

相关命令
1:生成scrapy工程,工程的名称为quotetutorial
scrapy startproject quotetutorial
2:进入生成的工程目录
cd quotetutorial
3:生成爬虫,名称为quotes ,爬取的网址为:quotes.toscrape.com
scrapy genspider quotes quotes.toscrape.com
4:运行命令:scrapy crawl quotes,运行结果如下:
scrapy爬虫框架的详细用法_第1张图片
具体代码实现
1:定义item,具体代码实现如下:

import scrapy


class QuotetutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    text=scrapy.Field()
    author=scrapy.Field()
    tags=scrapy.Field()

2:编写spider,对返回的网页代码进行处理和遍历

# -*- coding: utf-8 -*-
import scrapy
from quotetutorial.items import QuotetutorialItem


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    #对请求返回的网页HTML代码进行处理
    def parse(self, response):
        quotes=response.css(".quote")
        for quote in quotes:
            item=QuotetutorialItem()
            text=quote.css(".text::text").extract_first()
            author = quote.css(".author::text").extract_first()
            tags = quote.css(".tags .tag::text").extract()
            item["text"]=text
            item["author"]=author
            item["tags"]=tags
            yield item
        next=response.css(".pager .next a::attr(href)").extract_first()
        url=response.urljoin(next)
        yield scrapy.Request(url=url,callback=self.parse)

3:实现pipline,对返回的ITEM进行处理

# -*- coding: utf-8 -*-

# 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
from scrapy.exceptions import DropItem
import pymongo


class QuotetutorialPipeline(object):
    def __init__(self):
        self.limit=50

    def process_item(self, item, spider):
        if item['text']:
            if len(item["text"])>self.limit:
                item["text"]=item["text"][0:self.limit].rstrip()+"..."
            return item
        else:
            return DropItem("Missing Text")

class MongoPipeline(object):
    def __init__(self,mongo_uri,mongo_db):
        self.mongo_uri=mongo_uri
        self.mongo_db=mongo_db

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            mongo_uri=crawler.settings.get("MONGO_URI"),
            mongo_db=crawler.settings.get("MONGO_DB")
        )
    def open_spider(self,spider):
        self.client=pymongo.MongoClient(self.mongo_uri)
        self.db=self.client[self.mongo_db]

    def process_item(self,item,spider):
        name=item.__class__.__name__
        self.db[name].insert(dict(item))
        return item

    def close_spider(self,spider):
        self.client.close()

4:在settings文件中,启用pipline

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'quotetutorial.pipelines.QuotetutorialPipeline': 300,
    'quotetutorial.pipelines.MongoPipeline': 301
}

完整代码的下载地址如下:https://gitee.com/TianYaBenXiong/scrapy_code/tree/master

你可能感兴趣的:(Python爬虫实例)