Python scrapy爬蟲框架 經常使用setting配置

Python scrapy爬蟲框架 經常使用setting配置

 

十分想念順店雜可。。。

 

下降log級別

當進行通用爬取時,通常您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy使用 INFO log級別來報告這些信息。爲了減小CPU使用率(及記錄log存儲的要求), 在生產環境中進行通用爬取時您不該該使用 DEBUG log級別。 不過在開發的時候使用 DEBUG 應該還能接受。

setting.py文件中設置LOG_LEVEL = 'INFO'

日誌管理

LOG_ENABLED 默認: True,啓用logging
LOG_ENCODING 默認: ‘utf-8’,logging使用的編碼
LOG_FILE 默認: None,在當前目錄裏建立logging輸出文件的文件名,例如:LOG_FILE = ‘log.txt’
配置了這個文件,就不會在控制檯輸出日誌了
LOG_LEVEL 默認: ‘DEBUG’,log的最低級別,會打印大量的日誌信息,若是咱們不想看到太多的日誌,能夠提升log等級
共五級:
CRITICAL - 嚴重錯誤
ERROR - 通常錯誤
WARNING - 警告信息
INFO - 通常信息
DEBUG - 調試信息
LOG_STDOUT 默認: False 若是爲 True,進程全部的標準輸出(及錯誤)將會被重定向到log中。
例如,執行 print(「hello」) ,其將會顯示到日誌文件中

 html

增長併發

併發是指同時處理的request的數量。其有全侷限制和局部(每一個網站)的限制。
Scrapy默認的全局併發限制對同時爬取大量網站的狀況並不適用,所以您須要增長這個值。 增長多少取決於您的爬蟲能佔用多少CPU。 通常開始能夠設置爲 100 。不過最好的方式是作一些測試,得到Scrapy進程佔取CPU與併發數的關係。 爲了優化性能,您應該選擇一個能使CPU佔用率在80%-90%的併發數
python

在setting.py文件中寫上CONCURRENT_REQUESTS = 100,scrapy中默認的併發數是32

 

禁止重試

對失敗的HTTP請求進行重試會減慢爬取的效率,尤爲是當站點響應很慢(甚至失敗)時, 訪問這樣的站點會形成超時並重試屢次。這是沒必要要的,同時也佔用了爬蟲爬取其餘站點的能力。web

RETRY_ENABLED = False

 

減小下載超時

若是您對一個很是慢的鏈接進行爬取(通常對通用爬蟲來講並不重要), 減少下載超時能讓卡住的鏈接能被快速的放棄並解放處理其餘站點的能力。chrome

DOWNLOAD_TIMEOUT = 15,其中15是設置的下載超時時間

 

禁止cookies

除非您 真的 須要,不然請禁止cookies。在進行通用爬取時cookies並不須要, (搜索引擎則忽略cookies)。禁止cookies能減小CPU使用率及Scrapy爬蟲在內存中記錄的蹤影,提升性能。數據庫

`COOKIES_ENABLED = False`

 

禁止重定向

除非您對跟進重定向感興趣,不然請考慮關閉重定向。 當進行通用爬取時,通常的作法是保存重定向的地址,並在以後的爬取進行解析。 這保證了每批爬取的request數目在必定的數量, 不然重定向循環可能會致使爬蟲在某個站點耗費過多資源。瀏覽器

REDIRECT_ENABLED = False

 

設置下載延遲

單位秒,支持小數,通常都是隨機範圍:0.5DOWNLOAD_DELAY 到 1.5DOWNLOAD_DELAY 之間緩存

DOWMLOAD_DELY=3,設置延遲下載能夠避免被發現

 

暫停和恢復爬蟲

初學者最頭疼的事情就是沒有處理好異常,當爬蟲爬到一半的時候忽然由於錯誤而中斷了,可是這時又不能從中斷的地方開始繼續爬,頓時感受內心日了狗,可是這裏有一個方法能夠暫時的存儲你爬的狀態,當爬蟲中斷的時候繼續打開後依然能夠從中斷的地方爬,不過雖然說持久化能夠有效的處理,可是要注意的是當使用cookie臨時的模擬登陸狀態的時候要注意cookie的有效期cookie

只須要在setting.py中JOB_DIR=file_name其中填的是你的文件目錄,注意這裏的目錄不容許共享,只能存儲單獨的一個spdire的運行狀態,若是你不想在從中斷的地方開始運行,只須要將這個文件夾刪除便可網絡

 
固然還有其餘的放法:scrapy crawl somespider -s JOBDIR=crawls/somespider-1,這個是在終端啓動爬蟲的時候調用的,能夠經過ctr+c中斷,恢復仍是輸入上面的命令併發

 

不遵照robots.txt

ROBOTSTXT_OBEY = Ture,是否遵照 robots.txt,通常修改成False

 

配置請求頭

在settings中取消註釋便可
DEFAULT_REQUEST_HEADERS : 設置默認的請求headers

DEFAULT_REQUEST_HEADERS={{
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'User-Agent':'......'   #在這裏配置你的請求頭
}}

 

setting文件別的字段介紹

 

SPIDER_MIDDLEWARES:爬蟲中間層
DOWNLOADER_MIDDLEWARES:下載中間層

# pipeline裏面能夠配置多個,每個spider都會調用全部配置的pipeline,後面配置的數字表示調用的優先級,數字越小,調用越早
ITEM_PIPELINES = {'項目名.pipelines.PipeLine類名': 300,}

# 開發模式時,啓用緩存,能夠提升調試效率。一樣的請求,若是緩存當中有保存內容的話,不會去進行網絡請求,直接從緩存中返回。**部署時必定要註釋掉!!!**
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'


# 併發(下面都是默認值)
CONCURRENT_ITEMS = 100 #  併發處理 items 的最大數量
CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 併發下載任何單域的最大數量
CONCURRENT_REQUESTS_PER_IP = 0 # 併發每一個IP請求的最大數量
CONCURRENT_REQUESTS_PER_IP 不爲0時,這個延時是針對每一個IP,而不是每一個域

 

pipelines的使用

 
必須在settings中,添加

ITEM_PIPELINES = {
    'first_scrapy.pipelines.FirstScrapyPipeline': 300, # 優先級,數字越小,
                                                    優先級越高,越早調用範圍 0-1000
}

 
對象以下:

class FirstScrapyPipeline(object):
    def process_item(self, item, spider):
        return item

 
process_item

process_item(self, item, spider): 處理item的方法, 必須有的!!!

參數:
item (Item object or a dict) : 獲取到的item
spider (Spider object) : 獲取到item的spider
返回    一個dict或者item

 
open_spider

open_spider(self, spider) : 當spider啓動時,調用這個方法
參數:
spider (Spider object) – 啓動的spider

 
close_spider

close_spider(self, spider): 當spider關閉時,調用這個方法
參數:
spider (Spider object) – 關閉的spider

 
from_crawler

@classmethod
from_crawler(cls, crawler)
參數:
crawler (Crawler object) – 使用這個pipe的爬蟲crawler`

 

如下爲pipelines文件,根據須要添加方法

 
pipelines.py

# pipelines.py
from pymongo import MongoClient


class FirstScrapyPipeline(object):
    @classmethod
    def from_crawler(cls, crawler):
        crawler()

    def open_spider(self, spider):
        self.client = MongoClient("***.***.***.**", 27017)
        # 數據庫名admin
        self.db = self.client.test
        self.db.authenticate('user', password')
        self.my_set = self.db.my_set

    def process_item(self, item, spider):
        try:
            self.my_set.save(item["info"])
        except Exception as e:
            print(e)
        return item

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

 

運行爬蟲文件

運行單個爬蟲
# -*- coding: utf-8 -*-
# @Time    : 2019/4/22 18:07
# @Author  : 甄超鋒
# @Email   : 4535@sohu.com
# @File    : run.py
# @Software: PyCharm

from scrapy import cmdline

cmdline.execute("scrapy crawl lvdunspider".split())
運行多個爬蟲
# -*- coding: utf-8 -*-
# @Time    : 2019/4/22 18:07
# @Author  : 甄超鋒
# @Email   : 4535@sohu.com
# @File    : run.py
# @Software: PyCharm

from LvdunSpider.spiders.lvdunspider import LvdunspiderSpider
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

# 獲取settings.py模塊的設置
settings = get_project_settings()
process = CrawlerProcess(settings=settings)

# 能夠添加多個spider
process.crawl(LvdunspiderSpider)

# 啓動爬蟲,會阻塞,直到爬取完成
process.start()

 

scrapy使用隨機User-Agent

 
使用python模塊 fake-useragent 生成user-agent

安裝:

pip install fake-useragent

簡單使用:

from fake_useragent import UserAgent
ua = UserAgent()
#ie瀏覽器的user agent
print(ua.ie)

#opera瀏覽器
print(ua.opera)

#chrome瀏覽器
print(ua.chrome)

#firefox瀏覽器
print(ua.firefox)

#safri瀏覽器
print(ua.safari)

#最經常使用的方式
#寫爬蟲最實用的是能夠隨意變換user-agent,
print(ua.random)

 

在middleware中使用
 

import random
from scrapy import signals
from fake_useragent import UserAgent

class RandomUserAgentMiddleware(object):

    def __init__(self):
        self.agent = UserAgent()

    @classmethod
    def from_crawler(cls, crawler):
        return cls()

    def process_request(self, request, spider):
        request.headers.setdefault('User-Agent', self.agent.random)

在settings.py中啓用

在 ‘DOWNLOADER_MIDDLEWARES’ 項中啓用中間件

DOWNLOADER_MIDDLEWARES = {
   'LvdunSpider.middlewares.RandomUserAgentMiddleware': 543,
}

 

以上只是一部分,請勿噴我,謝謝!喜歡請點贊,收藏!

 

pythonQQ交流羣:785239887
相關文章
相關標籤/搜索