scrapy框架回顾

Posted Felix Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

 

以上是关于scrapy框架回顾的主要内容,如果未能解决你的问题,请参考以下文章

scrapy框架回顾

01_爬虫基础知识回顾

01_爬虫基础知识回顾

第三章:爬虫基础知识回顾

python利用scrapy框架爬取起点

爬虫2.2-scrapy框架-文件写入