python爬虫入门(3)----- scrapy

scrapy

简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

spiders

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。
import scrapy

class FaiscoSpider(scrapy.Spider):
name = 'faisco'#spider的名称
allowed_domains = ['www.faisco.cn']#允许爬取的域名
start_urls = ['https://www.faisco.cn']#开始爬取的url

编写你的爬取代码

def parse(self, response):
pass

items

Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。

import scrapy

class template(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
img = scrapy.Field()

pipelines

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

class FaiscoPipeline(object):
#spider启动时调用
def open_spider(self, spider):
pass

spider关闭时调用

def close_spider(self, spider):
pass

每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。

def process_item(self, item, spider):
return item

middlewares

middleware分为download middleware和spider middleware

  1. download middleware

    class scrapy.downloadermiddlewares.DownloaderMiddleware

    def process_request(request, spider)
    当每个request通过下载中间件时,该方法被调用。
    process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest 。

    def process_response(request, response, spider)
    process_response() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。

    def process_exception(request, exception, spider)
    当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception() 。
    process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。

  2. spider middleware

    class scrapy.contrib.spidermiddleware.SpiderMiddleware
    def process_spider_input(response, spider)
    当response通过spider中间件时,该方法被调用,处理该response。
    process_spider_input() 应该返回 None 或者抛出一个异常。

    def process_spider_output(response, result, spider)
    当Spider处理response返回result时,该方法被调用。

    def process_spider_exception(response, exception, spider)
    当spider或(其他spider中间件的) process_spider_input() 跑出异常时, 该方法被调用。

settings

项目属性

BOT_NAME = 'faisco'
SPIDER_MODULES = ['faisco.spiders']
NEWSPIDER_MODULE = 'faisco.spiders'

是否遵守robots协议

ROBOTSTXT_OBEY = True

最大并发数

CONCURRENT_REQUESTS = 32

延迟,防止封号

DOWNLOAD_DELAY = 3

是否使用cookie

COOKIES_ENABLED = False

默认请求头,可以加上ua,防止识别为爬虫

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',

'Accept-Language': 'en',

}

配置spider middlewares

SPIDER_MIDDLEWARES = {

'faisco.middlewares.FaiscoSpiderMiddleware': 543,

}

配置download middlerwares

DOWNLOADER_MIDDLEWARES = {

'faisco.middlewares.FaiscoDownloaderMiddleware': 543,

}

配置pipeline

ITEM_PIPELINES = {

'faisco.pipelines.FaiscoPipeline': 300,

}

配置日志

LOG_LEVEL = 'INFO'
LOG_FILE = log_file_path

参考文献

https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/settings.html

posted @ 2019-03-27 11:08  wuweishuo  阅读(261)  评论(0)    收藏  举报