1. 程式人生 > >scrapy反反爬蟲策略和settings配置解析

scrapy反反爬蟲策略和settings配置解析

反反爬蟲相關機制

Some websites implement certain measures to prevent bots from crawling them, with varying degrees of sophistication. Getting around those measures can be difficult and tricky, and may sometimes require special infrastructure. Please consider contacting commercial support if in doubt.

(有些些網站使用特定的不同程度的複雜性規則防止爬蟲訪問,繞過這些規則是困難和複雜的,有時可能需要特殊的基礎設施,如果有疑問,請聯絡商業支援。)

通常防止爬蟲被反主要有以下幾個策略:

  • 動態設定User-Agent(隨機切換User-Agent,模擬不同使用者的瀏覽器資訊)

  • 新增請求頭的多種方式

    • 方法1:

    修改setting.py中的User-Agent

    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    
    USER_AGENT = 'Hello World'
    • 方法2.

    修改setting中的

    DEFAULT_REQUEST_HEADERS

    
    # Override the default request headers:
    DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent':'Hello World' }
    • 方法3.

    在程式碼中修改。

    class HeadervalidationSpider(scrapy.Spider):
        name = 'headervalidation'
        allowed_domains = ['helloacm.com']
    def start_requests(self):
        header={'User-Agent':'Hello World'}
        yield scrapy.Request(url='http://helloacm.com/api/user-agent/',headers=header,callback=self.parse)

    def parse(self, response):
        print '*'*20
        print response.body
        print '*'*20
​```
  • 禁用Cookies(也就是不啟用cookies middleware,不向Server傳送cookies,有些網站通過cookie的使用發現爬蟲行為)

    • 可以通過

    COOKIES_ENABLED

    控制 CookiesMiddleware 開啟或關閉

  • 設定延遲下載(防止訪問過於頻繁,設定為 2秒 或更高)

  • Google Cache 和 Baidu Cache:如果可能的話,使用谷歌/百度等搜尋引擎伺服器頁面快取獲取頁面資料。

  • 使用IP地址池:VPN和代理IP,現在大部分網站都是根據IP來ban的。

  • 使用Crawlera(專用於爬蟲的代理元件),正確配置和設定下載中介軟體後,專案所有的request都是通過crawlera發出。

    DOWNLOADER_MIDDLEWARES = {
        'scrapy_crawlera.CrawleraMiddleware': 600
    }

    CRAWLERA_ENABLED = True
    CRAWLERA_USER = ‘註冊/購買的UserKey’
    CRAWLERA_PASS = ‘註冊/購買的Password’
    “`

設定下載中介軟體(Downloader Middlewares)

下載中介軟體是處於引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層元件,可以有多個下載中介軟體被載入執行。

  1. 當引擎傳遞請求給下載器的過程中,下載中介軟體可以對請求進行處理 (例如增加http header資訊,增加proxy資訊等);
  2. 在下載器完成http請求,傳遞響應給引擎的過程中, 下載中介軟體可以對響應進行處理(例如進行gzip的解壓等)

要啟用下載器中介軟體元件,將其加入到 DOWNLOADER_MIDDLEWARES 設定中。 該設定是一個字典(dict),鍵為中介軟體類的路徑,值為其中介軟體的順序(order)。

這裡是一個例子:

python
DOWNLOADER_MIDDLEWARES = {
'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

編寫下載器中介軟體十分簡單。每個中介軟體元件是一個定義了以下一個或多個方法的Python類:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

  • 當每個request通過下載中介軟體時,該方法被呼叫。

  • process_request() 必須返回以下其中之一:一個 None 、一個 Response 物件、一個 Request 物件或 raise IgnoreRequest:

    • 如果其返回 None ,Scrapy將繼續處理該request,執行其他的中介軟體的相應方法,直到合適的下載器處理函式(download handler)被呼叫, 該request被執行(其response被下載)。
    • 如果其返回 Response 物件,Scrapy將不會呼叫 任何 其他的 process_request() 或 process_exception() 方法,或相應地下載函式; 其將返回該response。 已安裝的中介軟體的 process_response() 方法則會在每個response返回時被呼叫。
    • 如果其返回 Request 物件,Scrapy則停止呼叫 process_request方法並重新排程返回的request。當新返回的request被執行後, 相應地中介軟體鏈將會根據下載的response被呼叫。
    • 如果其raise一個 IgnoreRequest 異常,則安裝的下載中介軟體的 process_exception() 方法會被呼叫。如果沒有任何一個方法處理該異常, 則request的errback(Request.errback)方法會被呼叫。如果沒有程式碼處理丟擲的異常, 則該異常被忽略且不記錄(不同於其他異常那樣)。
  • 引數:

    • request (Request 物件)

    – 處理的request

    • spider (Spider 物件)

    – 該request對應的spider

process_response(self, request, response, spider)

當下載器完成http請求,傳遞響應給引擎的時候呼叫

  • process_request() 必須返回以下其中之一: 返回一個 Response 物件、 返回一個 Request 物件或raise一個 IgnoreRequest 異常。

    • 如果其返回一個 Response (可以與傳入的response相同,也可以是全新的物件), 該response會被在鏈中的其他中介軟體的 process_response() 方法處理。
    • 如果其返回一個 Request 物件,則中介軟體鏈停止, 返回的request會被重新排程下載。處理類似於 process_request() 返回request所做的那樣。
    • 如果其丟擲一個 IgnoreRequest 異常,則呼叫request的errback(Request.errback)。 如果沒有程式碼處理丟擲的異常,則該異常被忽略且不記錄(不同於其他異常那樣)。
  • 引數:

    • request (Request 物件)

    – response所對應的request

    • response (Response 物件)

    – 被處理的response

    • spider (Spider 物件)

    – response所對應的spider

使用案例:

1. 建立middlewares.py檔案。

Scrapy代理IP、Uesr-Agent的切換都是通過DOWNLOADER_MIDDLEWARES進行控制,我們在settings.py同級目錄下建立middlewares.py檔案,包裝所有請求。

# middlewares.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-


import random

from settings import USER_AGENTS
from settings import PROXIES


# 隨機的User-Agent
class RandomUserAgent(object):
    def process_request(self, request, spider):
        useragent = random.choice(USER_AGENTS)
        request.headers.setdefault("User-Agent", useragent)

# 隨機代理IP
class RandomProxy(object):
    def process_request(self, request, spider):
        proxy = random.choice(PROXIES)

        request.meta['proxy'] = "http://" + proxy['ip_port']

2. 修改settings.py配置USER_AGENTS和PROXIES

  • 新增USER_AGENTS:
 USER_AGENTS = [
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
    "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
    ]
  • 新增代理IP設定PROXIES:

    免費代理IP可以網上搜索,或者付費購買一批可用的私密代理IP:

PROXIES = [
    {'ip_port': '111.8.60.9:8123'},
    {'ip_port': '101.71.27.120:80'},
    {'ip_port': '122.96.59.104:80'},
    {'ip_port': '122.224.249.122:8088'},
]
  • 除非特殊需要,禁用cookies,防止某些網站根據Cookie來封鎖爬蟲。
COOKIES_ENABLED = False
  • 設定下載延遲
DOWNLOAD_DELAY = 3
  • 最後設定setting.py裡的DOWNLOADER_MIDDLEWARES,新增自己編寫的下載中介軟體類。
DOWNLOADER_MIDDLEWARES = {
    #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,
    'mySpider.middlewares.RandomUserAgent': 81,
    'mySpider.middlewares.ProxyMiddleware': 100
}

Settings

Scrapy設定(settings)提供了定製Scrapy元件的方法。可以控制包括核心(core),外掛(extension),pipeline及spider元件。比如 設定Json Pipeliine、LOG_LEVEL等。

內建設定參考手冊

  • REACTOR_THREADPOOL_MAXSIZE = 20

    • ##### 增加執行緒池數量,預設10條
  • IMAGES_STORE = '/path':下載圖片,圖片儲存在檔案中(一個圖片一個檔案),並使用它們URL的SHA1 hash作為檔名

  • IMAGES_EXPIRES = 30:圖片失效時間(天),避免下載最近已經下載的圖片

  • 
    # 圖片縮圖
    
    IMAGES_THUMBS = {
      'samll' : (50, 50),
      'big' : (270, 270)
    }
    MEDIA_ALLOW_REDIRECTS = True # 重定向
import scrapy
from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem


class MyImagesPipeline(ImagesPipeline):


    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)


    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item




class MzituScrapyPipeline(ImagesPipeline):


    def file_path(self, request, response=None, info=None):
        """
        :param request: 每一個圖片下載管道請求
        :param response:
        :param info:
        :param strip :清洗Windows系統的資料夾非法字元,避免無法建立目錄
        :return: 每套圖的分類目錄
        """
        item = request.meta['item']
        folder = item['name']
        folder_strip = strip(folder)
        image_guid = request.url.split('/')[-1]
        filename = u'full/{0}/{1}'.format(folder_strip, image_guid)
        return filename


    def get_media_requests(self, item, info):
        """
        :param item: spider.py中返回的item
        :param info:
        :return:
        """
        for img_url in item['image_urls']:
            referer = item['url']
            yield Request(img_url, meta={'item': item})




    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        return item

BOT_NAME

預設: 'scrapybot'

Scrapy專案實現的bot的名字(也未專案名稱)。 這將用來構造預設 User-Agent,同時也用來log。

當您使用 startproject 命令建立專案時其也被自動賦值。

CONCURRENT_ITEMS

預設: 100

Item Processor(即 Item Pipeline) 同時處理(每個response的)item的最大值。

CONCURRENT_REQUESTS

預設: 16

Scrapy downloader 併發請求(concurrent requests)的最大值。

CONCURRENT_REQUESTS_PER_DOMAIN

預設: 8

對單個網站進行併發請求的最大值。

CONCURRENT_REQUESTS_PER_IP

預設: 0

對單個IP進行併發請求的最大值。如果非0,則忽略 CONCURRENT_REQUESTS_PER_DOMAIN 設定, 使用該設定。 也就是說,併發限制將針對IP,而不是網站。

DEFAULT_ITEM_CLASS

預設: 'scrapy.item.Item'

DEFAULT_REQUEST_HEADERS

預設:

{
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
}

DEPTH_LIMIT

預設: 0

爬取網站最大允許的深度(depth)值。如果為0,則沒有限制。

DEPTH_PRIORITY

預設: 0

整數值。用於根據深度調整request優先順序。

如果為0,則不根據深度進行優先順序調整。

DEPTH_STATS

預設: True

是否收集最大深度資料。

DEPTH_STATS_VERBOSE

預設: False

是否收集詳細的深度資料。如果啟用,每個深度的請求數將會被收集在資料中。

DNSCACHE_ENABLED

預設: True

是否啟用DNS記憶體快取(DNS in-memory cache)。

DOWNLOADER

預設: 'scrapy.core.downloader.Downloader'

用於crawl的downloader.

DOWNLOADER_MIDDLEWARES

預設:: {}

儲存專案中啟用的下載中介軟體及其順序的字典。 更多內容請檢視 啟用下載器中介軟體

DOWNLOADER_MIDDLEWARES_BASE

預設:

{
    'scrapy.contrib.downloadermiddleware.robotstxt.RobotsTxtMiddleware': 100,
    'scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware': 300,
    'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,
    'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500,
    'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': 550,
    'scrapy.contrib.downloadermiddleware.redirect.MetaRefreshMiddleware': 580,
    'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': 600,
    'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700,
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,
    'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
    'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
}

包含Scrapy預設啟用的下載中介軟體的字典。 永遠不要在專案中修改該設定,而是修改DOWNLOADER_MIDDLEWARES 。更多內容請參考 啟用下載器中介軟體.

DOWNLOADER_STATS

預設: True

是否收集下載器資料。

DOWNLOAD_DELAY

預設: 0

下載器在下載同一個網站下一個頁面前需要等待的時間。該選項可以用來限制爬取速度, 減輕伺服器壓力。同時也支援小數:

DOWNLOAD_DELAY = 0.25    # 250 ms of delay

該設定影響(預設啟用的) RANDOMIZE_DOWNLOAD_DELAY 設定。 預設情況下,Scrapy在兩個請求間不等待一個固定的值, 而是使用0.5到1.5之間的一個隨機值 * DOWNLOAD_DELAY 的結果作為等待間隔。

另外您可以通過spider的 download_delay 屬性為每個spider設定該設定。

DOWNLOAD_HANDLERS

預設: {}

儲存專案中啟用的下載處理器(request downloader handler)的字典。 例子請檢視 DOWNLOAD_HANDLERS_BASE 。

DOWNLOAD_HANDLERS_BASE

預設:

{
    'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler',
    'http': 'scrapy.core.downloader.handlers.http.HttpDownloadHandler',
    'https': 'scrapy.core.downloader.handlers.http.HttpDownloadHandler',
    's3': 'scrapy.core.downloader.handlers.s3.S3DownloadHandler',
}

儲存專案中預設啟用的下載處理器(request downloader handler)的字典。 永遠不要在專案中修改該設定,而是修改 DOWNLOADER_HANDLERS

如果需要關閉上面的下載處理器,您必須在專案中的 DOWNLOAD_HANDLERS 設定中設定該處理器,併為其賦值為 None 。 例如,關閉檔案下載處理器:

DOWNLOAD_HANDLERS = {
    'file': None,
}

DOWNLOAD_TIMEOUT

預設: 180

下載器超時時間(單位: 秒)。

DUPEFILTER_CLASS

預設: 'scrapy.dupefilter.RFPDupeFilter'

用於檢測過濾重複請求的類。

預設的 (RFPDupeFilter) 過濾器基於 scrapy.utils.request.request_fingerprint 函式生成的請求fingerprint(指紋)。 如果您需要修改檢測的方式,您可以繼承 RFPDupeFilter 並覆蓋其 request_fingerprint 方法。 該方法接收 Request 物件並返回其fingerprint(一個字串)。

DUPEFILTER_DEBUG

預設: False

預設情況下, RFPDupeFilter 只記錄第一次重複的請求。 設定 DUPEFILTER_DEBUGTrue 將會使其記錄所有重複的requests。

EDITOR

預設: depends on the environment

執行 edit 命令編輯spider時使用的編輯器。 其預設為 EDITOR 環境變數。如果該變數未設定,其預設為 vi (Unix系統) 或者 IDLE編輯器(Windows)。

EXTENSIONS

預設:: {}

儲存專案中啟用的外掛及其順序的字典。

EXTENSIONS_BASE

預設:

{
    'scrapy.contrib.corestats.CoreStats': 0,
    'scrapy.webservice.WebService': 0,
    'scrapy.telnet.TelnetConsole': 0,
    'scrapy.contrib.memusage.MemoryUsage': 0,
    'scrapy.contrib.memdebug.MemoryDebugger': 0,
    'scrapy.contrib.closespider.CloseSpider': 0,
    'scrapy.contrib.feedexport.FeedExporter': 0,
    'scrapy.contrib.logstats.LogStats': 0,
    'scrapy.contrib.spiderstate.SpiderState': 0,
    'scrapy.contrib.throttle.AutoThrottle': 0,
}

可用的外掛列表。需要注意,有些外掛需要通過設定來啟用。預設情況下, 該設定包含所有穩定(stable)的內建外掛。

ITEM_PIPELINES

預設: {}

儲存專案中啟用的pipeline及其順序的字典。該字典預設為空,值(value)任意。 不過值(value)習慣設定在0-1000範圍內。

樣例:

ITEM_PIPELINES = {
    'mybot.pipelines.validate.ValidateMyItem': 300,
    'mybot.pipelines.validate.StoreMyItem': 800,
}

ITEM_PIPELINES_BASE

預設: {}

儲存專案中預設啟用的pipeline的字典。 永遠不要在專案中修改該設定,而是修改 ITEM_PIPELINES

LOG_ENABLED

預設: True

是否啟用logging。

LOG_ENCODING

預設: 'utf-8'

logging使用的編碼。

LOG_FILE

預設: None

logging輸出的檔名。如果為None,則使用標準錯誤輸出(standard error)。

LOG_LEVEL

預設: 'DEBUG'

log的最低級別。可選的級別有: CRITICAL、 ERROR、WARNING、INFO、DEBUG。更多內容請檢視 Logging

LOG_STDOUT

預設: False

如果為 True ,程序所有的標準輸出(及錯誤)將會被重定向到log中。例如, 執行 print 'hello' ,其將會在Scrapy log中顯示。

MEMDEBUG_ENABLED

預設: False

是否啟用記憶體除錯(memory debugging)。

MEMDEBUG_NOTIFY

預設: []

如果該設定不為空,當啟用記憶體除錯時將會發送一份記憶體報告到指定的地址;否則該報告將寫到log中。

樣例:

MEMDEBUG_NOTIFY = ['user@example.com']

MEMUSAGE_ENABLED

預設: False

Scope: scrapy.contrib.memusage

是否啟用記憶體使用外掛。當Scrapy程序佔用的記憶體超出限制時,該外掛將會關閉Scrapy程序, 同時傳送email進行通知。

MEMUSAGE_LIMIT_MB

預設: 0

Scope: scrapy.contrib.memusage

在關閉Scrapy之前所允許的最大記憶體數(單位: MB)(如果 MEMUSAGE_ENABLED為True)。 如果為0,將不做限制。

MEMUSAGE_NOTIFY_MAIL

預設: False

Scope: scrapy.contrib.memusage

達到記憶體限制時通知的email列表。

Example:

MEMUSAGE_NOTIFY_MAIL = ['user@example.com']

MEMUSAGE_REPORT

預設: False

Scope: scrapy.contrib.memusage

每個spider被關閉時是否傳送記憶體使用報告。

MEMUSAGE_WARNING_MB

預設: 0

Scope: scrapy.contrib.memusage

在傳送警告email前所允許的最大記憶體數(單位: MB)(如果 MEMUSAGE_ENABLED為True)。 如果為0,將不傳送警告。

NEWSPIDER_MODULE

預設: ''

使用 genspider 命令建立新spider的模組。

樣例:

NEWSPIDER_MODULE = 'mybot.spiders_dev'

RANDOMIZE_DOWNLOAD_DELAY

預設: True

如果啟用,當從相同的網站獲取資料時,Scrapy將會等待一個隨機的值 (0.5到1.5之間的一個隨機值 * DOWNLOAD_DELAY)。

該隨機值降低了crawler被檢測到(接著被block)的機會。某些網站會分析請求, 查詢請求之間時間的相似性。

隨機的策略與 wget --random-wait 選項的策略相同。

REDIRECT_MAX_TIMES

預設: 20

定義request允許重定向的最大次數。超過該限制後該request直接返回獲取到的結果。 對某些任務我們使用Firefox預設值。

REDIRECT_MAX_METAREFRESH_DELAY

預設: 100

有些網站使用 meta-refresh 重定向到session超時頁面, 因此我們限制自動重定向到最大延遲(秒)。 =>有點不肯定:

REDIRECT_PRIORITY_ADJUST

預設: +2

修改重定向請求相對於原始請求的優先順序。 負數意味著更多優先順序。

ROBOTSTXT_OBEY

預設: False

Scope: scrapy.contrib.downloadermiddleware.robotstxt

如果啟用,Scrapy將會尊重 robots.txt策略。更多內容請檢視 RobotsTxtMiddleware

SCHEDULER

預設: 'scrapy.core.scheduler.Scheduler'

用於爬取的排程器。

SPIDER_CONTRACTS

預設:: {}

儲存專案中啟用用於測試spider的scrapy contract及其順序的字典。 更多內容請參考 Spiders Contracts

SPIDER_CONTRACTS_BASE

預設:

{
    'scrapy.contracts.default.UrlContract' : 1,
    'scrapy.contracts.default.ReturnsContract': 2,
    'scrapy.contracts.default.ScrapesContract': 3,
}

儲存專案中預設啟用的scrapy contract的字典。 永遠不要在專案中修改該設定,而是修改SPIDER_CONTRACTS 。更多內容請參考 Spiders Contracts

SPIDER_MIDDLEWARES

預設:: {}

儲存專案中啟用的下載中介軟體及其順序的字典。 更多內容請參考 啟用spider中介軟體

SPIDER_MIDDLEWARES_BASE

預設:

{
    'scrapy.contrib.spidermiddleware.httperror.HttpErrorMiddleware': 50,
    'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': 500,
    'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': 700,
    'scrapy.contrib.spidermiddleware.urllength.UrlLengthMiddleware': 800,
    'scrapy.contrib.spidermiddleware.depth.DepthMiddleware': 900,
}

儲存專案中預設啟用的spider中介軟體的字典。 永遠不要在專案中修改該設定,而是修改SPIDER_MIDDLEWARES 。更多內容請參考 啟用spider中介軟體.

SPIDER_MODULES

預設: []

Scrapy搜尋spider的模組列表。

樣例:

SPIDER_MODULES = ['mybot.spiders_prod', 'mybot.spiders_dev']

STATS_CLASS

預設: 'scrapy.statscol.MemoryStatsCollector'

STATS_DUMP

預設: True

當spider結束時dump Scrapy狀態資料 (到Scrapy log中)。

STATSMAILER_RCPTS

預設: [] (空list)

spider完成爬取後傳送Scrapy資料。更多內容請檢視 StatsMailer

TELNETCONSOLE_ENABLED

預設: True

表明 telnet 終端 (及其外掛)是否啟用的布林值。

TELNETCONSOLE_PORT

預設: [6023, 6073]

telnet終端使用的埠範圍。如果設定為 None0 , 則使用動態分配的埠。更多內容請檢視Telnet終端(Telnet Console)

TEMPLATES_DIR

預設: scrapy模組內部的 templates

URLLENGTH_LIMIT

預設: 2083

Scope: contrib.spidermiddleware.urllength

USER_AGENT

預設: "Scrapy/VERSION (+http://scrapy.org)"

爬取的預設User-Agent,除非被覆蓋。

Logging

Scrapy提供了log功能,可以通過 logging 模組使用。

可以修改配置檔案settings.py,任意位置新增下面兩行,效果會清爽很多。

LOG_ENABLED = True  # 開啟
LOG_FILE = "TencentSpider.log" #日誌檔名
LOG_LEVEL = "INFO" #日誌級別

Log levels

  • Scrapy提供5層logging級別:
  • CRITICAL - 嚴重錯誤(critical)
  • ERROR - 一般錯誤(regular errors)
  • WARNING - 警告資訊(warning messages)
  • INFO - 一般資訊(informational messages)
  • DEBUG - 除錯資訊(debugging messages)

logging設定

通過在setting.py中進行以下設定可以被用來配置logging:

  1. LOG_ENABLED

    預設: True,啟用logging

  2. LOG_ENCODING

    預設: ‘utf-8’,logging使用的編碼

  3. LOG_FILE

    預設: None,在當前目錄裡建立logging輸出檔案的檔名

  4. LOG_LEVEL

    預設: ‘DEBUG’,log的最低級別

  5. LOG_STDOUT

    預設: False 如果為 True,程序所有的標準輸出(及錯誤)將會被重定向到log中。例如,執行 print “hello” ,其將會在Scrapy log中顯示。

  6. 日誌模組已經被scrapy棄用,改用python自帶日誌模組

import logging

LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"  # 設定輸出格式
DATE_FORMAT = "%Y/%m/%d %H:%M:%S"  # 設定時間格式
logging.basicConfig(filename='tianya.log', filemode='a+', format=LOG_FORMAT, datefmt=DATE_FORMAT)

logging.warning('錯誤')

爬取筆趣閣按層級儲存