欢迎来到Felix的博客

Do the right things! And talk is cheap,show me your code!

爬虫(九):scrapy框架回顾

scrapy文档

一:安装scrapy

a. pip3 install wheel

b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

 c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

 d. pip3 install scrapy

 e. 下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/

   

二:基本操作

(1)新建工程:在创建工程之前先进入想用来保存代码的目录,然后执行

scrapy startproject xxx #创建项目

Microsoft Windows [版本 10.0.16299.309]
(c) 2017 Microsoft Corporation。保留所有权利。

C:\Users\felix>cd C:\Users\felix\PycharmProjects\scrapy_quotes

C:\Users\felix\PycharmProjects\scrapy_quotes>scrapy startproject quotes
New Scrapy project 'quotes', using template directory 'c:\\users\\felix\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\scrapy\\templates\\project', created in:
    C:\Users\felix\PycharmProjects\scrapy_quotes\quotes

You can start your first spider with:
    cd quotes
    scrapy genspider example example.com

执行这条命令将创建一个新目录:包括的文件如下:

scrapy.cfg:项目配置文件

quotes/:项目python模块,待会代码将从这里导入

quotes/items:项目items文件

quotes/pipelines.py:项目管道文件

quotes/settings.py:项目配置文件

quotes/spiders:放置spider的目录

(2):创建爬虫

cd quotes # 先进入项目目录

scrapy genspider name name.com  # 创建爬虫  

scrapy crawl name # 运行爬虫

 

(3):创建的爬虫类解析

import scrapy
from quotes.items import QuotesItem


class QuotespiderSpider(scrapy.Spider):
    name = 'quotespider'  # 爬虫名称
    allowed_domains = ['quotes.toscrape.com']  # 允许爬虫访问的域名,可以多个
    start_urls = ['http://quotes.toscrape.com/'] # 爬虫开始的url地址

    def parse(self, response):  # 爬虫返回的数据解析函数
        quotes = response.css('.quote')  # 通过css选择器选择相应的内容
        for quote in quotes:
            item = QuotesItem()  # item做数据持久化的
            text = quote.css('.text::text').extract_first()  # ::text 表示输出文本内容
            author = quote.css('.author::text').extract_first()  # ::text 表示输出文本内容
            tags = quote.css('.tags .tag::text').extract()  # extract_first() 表示找第一个,extract()表示找到所有,并返回一个列表
            item['text'] = text  # 赋值  首先要在items类中创建
            item['tags'] = tags
            item['author'] = author
            yield item  # 生成item 做数据存储
        next = response.css('.pager .next a::attr(href)').extract_first()  # 得到相对的url
        url = response.urljoin(next)  # 获取一个绝对的url,获取下一页的url
        yield scrapy.Request(url=url, callback=self.parse)  # 处理链接,将返回的response交给callback的回调函数

# scrapy shell quotes.toscrape.com  # 进入命令行调试
# scrapy crawl quotes -o quotes.json(.csv  .xml)     # 数据保存,可以保存多个类型

(4):items类解析

Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。

它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpy.item.Field对象,就像是一个对象关系映射(ORM). 
我们通过将需要的item模型化,来控制获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在quotes目录下的items.py文件,我们的Item类将会是这样

import scrapy


class QuotesItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    text=scrapy.Field()  #创建文本字段
    author=scrapy.Field() # 创建作者字段
    tags=scrapy.Field()  # 创建标签字段

(5):pipeline类解析

import pymongo
from scrapy.exceptions import DropItem



# 要使用pipline一定要在设置中指定
class QuotesPipeline(object):
    def process_item(self, item, spider):
        return item


# 一个pipeline要么返回item 要么返回dropitem
class TextPipeline(object):
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
     # 这里的item为item类中的item
     # 大于50字的文本进行处理
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_url, mongo_db):
     # 初始化数据库 self.mongo_url
= mongo_url self.mongo_db = mongo_db
   # 该类方法可以从设置中读取数据 @classmethod
def from_crawler(cls, crawler): return cls( # 从设置里面获取数据库的设置信息 mongo_url=crawler.settings.get('MONGO_URL'), mongo_db=crawler.settings.get('MONGO_DB') ) def open_spider(self, spider): # 启动爬虫时做的操作
     # 初始化数据库 self.client = pymongo.MongoClient(self.mongo_url) self.db = self.client[self.mongo_db]
   # 处理item的方法,必须实现返回item或者dropitem
def process_item(self, item, spider): name = item.__class__.__name__ # item的名称 self.db[name].insert(dict(item)) return item def close_spider(self, spider): self.client.close() # 结束爬虫时关闭数据库

(6):运行

scrapy crawl quotespider。

 

posted @ 2018-04-11 11:33  寂静的天空  阅读(258)  评论(0编辑  收藏  举报
个人感悟: 一个人最好的镜子就是自己,你眼中的你和别人眼中的你,不是一回事。有人夸你,别信;有人骂你,别听。一根稻草,扔街上就是垃圾;捆上白菜就是白菜价;捆上大闸蟹就是大闸蟹的价。 一个人,不狂是没有出息的,但一直狂,肯定是没有出息的。雨打残花风卷流云,剑影刀光闪过后,你满脸冷酷的站在珠峰顶端,傲视苍生无比英武,此时我问你:你怎么下去? 改变自己就是改变自己的心态,该沉的时候沉下去,该浮的时候浮上来;不争名夺利,不投机取巧,不尔虞我诈;少说、多听、多行动。人每所谓穷通寿夭为命所系,岂不知造物之报施,全视人之自取。 座佑铭:每一个不曾起舞的日子,都是对生命的辜负。