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”) ,其將會顯示到日志文件中
增加並發
並發是指同時處理的request的數量。其有全局限制和局部(每個網站)的限制。
Scrapy默認的全局並發限制對同時爬取大量網站的情況並不適用,因此您需要增加這個值。 增加多少取決於您的爬蟲能占用多少CPU。 一般開始可以設置為 100 。不過最好的方式是做一些測試,獲得Scrapy進程占取CPU與並發數的關系。 為了優化性能,您應該選擇一個能使CPU占用率在80%-90%的並發數
在setting.py文件中寫上CONCURRENT_REQUESTS = 100,scrapy中默認的並發數是32
禁止重試
對失敗的HTTP請求進行重試會減慢爬取的效率,尤其是當站點響應很慢(甚至失敗)時, 訪問這樣的站點會造成超時並重試多次。這是不必要的,同時也占用了爬蟲爬取其他站點的能力。
RETRY_ENABLED = False
減少下載超時
如果您對一個非常慢的連接進行爬取(一般對通用爬蟲來說並不重要), 減小下載超時能讓卡住的連接能被快速的放棄並解放處理其他站點的能力。
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的有效期
只需要在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
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