scrapy框架詳解四 管道 及 settings文件使用

Item Pipeline簡介

Item管道的主要責(zé)任是負(fù)責(zé)處理有蜘蛛從網(wǎng)頁中抽取的Item,他的主要任務(wù)是清晰灯荧、驗證和存儲數(shù)據(jù)。

當(dāng)頁面被蜘蛛解析后,將被發(fā)送到Item管道载庭,并經(jīng)過幾個特定的次序處理數(shù)據(jù)。

每個Item管道的組件都是有一個簡單的方法組成的Python類廊佩。

他們獲取了Item并執(zhí)行他們的方法囚聚,同時他們還需要確定的是是否需要在Item管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處

執(zhí)行的過程:

清理HTML數(shù)據(jù)驗證解析到的數(shù)據(jù)(檢查Item是否包含必要的字段)檢查是否是重復(fù)數(shù)據(jù)(如果重復(fù)就刪除)將解析到的數(shù)據(jù)存儲到數(shù)據(jù)庫中

process_item(item, spider)

每一個item管道組件都會調(diào)用該方法,并且必須返回一個item對象實例或raise DropItem異常标锄。

被丟掉的item將不會在管道組件進(jìn)行執(zhí)行

此外顽铸,我們也可以在類中實現(xiàn)以下方法

open_spider(spider)

當(dāng)spider執(zhí)行的時候?qū)⒄{(diào)用該方法

close_spider(spider)

當(dāng)spider關(guān)閉的時候?qū)⒄{(diào)用該方法

在settings.py文件中,往ITEM_PIPELINES中添加項目管道的類名料皇,就可以激活項目管道組件

如:

ITEM_PIPELINES = {

'myproject.pipeline.PricePipeline':300,

'myproject.pipeline.JsonWriterPipeline':800,

}

在此設(shè)置中分配給類的整數(shù)值決定了它們在其中運行的順序——項通過管道從訂單號低到高

整數(shù)值通常設(shè)置在0-1000之間


setting文件詳解:


# 1. 爬蟲名稱BOT_NAME = 'step8_king'#?

2. 爬蟲應(yīng)用路徑SPIDER_MODULES = ['step8_king.spiders']NEWSPIDER_MODULE = 'step8_king.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent#?

3. 客戶端 user-agent請求頭# USER_AGENT = 'step8_king (+http://www.yourdomain.com)'# Obey robots.txt rules#?

4. 禁止爬蟲配置# ROBOTSTXT_OBEY = False# Configure maximum concurrent requests performed by Scrapy (default: 16)#?

5. 并發(fā)請求數(shù)# CONCURRENT_REQUESTS = 4# Configure a delay for requests for the same website (default: 0)# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay# See also autothrottle settings and docs

#6. 延遲下載秒數(shù)# DOWNLOAD_DELAY = 2# The download delay setting will honor only one of:

# 7. 單域名訪問并發(fā)數(shù)谓松,并且延遲下次秒數(shù)也應(yīng)用在每個域名# CONCURRENT_REQUESTS_PER_DOMAIN = 2# 單IP訪問并發(fā)數(shù),如果有值則忽略:CONCURRENT_REQUESTS_PER_DOMAIN践剂,并且延遲下次秒數(shù)也應(yīng)用在每個IP# CONCURRENT_REQUESTS_PER_IP = 3# Disable cookies (enabled by default)

# 8. 是否支持cookie鬼譬,cookiejar進(jìn)行操作cookie# COOKIES_ENABLED = True# COOKIES_DEBUG = True# Disable Telnet Console (enabled by default)

# 9. Telnet用于查看當(dāng)前爬蟲的信息,操作爬蟲等...# ? ?使用telnet ip port 逊脯,然后通過命令操作# TELNETCONSOLE_ENABLED = True# TELNETCONSOLE_HOST = '127.0.0.1'# TELNETCONSOLE_PORT = [6023,]

# 10. 默認(rèn)請求頭# 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',# }# Configure item pipelines# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html

# 11. 定義pipeline處理請求# ITEM_PIPELINES = {# ? ?'step8_king.pipelines.JsonPipeline': 700,# ? ?'step8_king.pipelines.FilePipeline': 500,# }

# 12. 自定義擴(kuò)展优质,基于信號進(jìn)行調(diào)用# Enable or disable extensions# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html# EXTENSIONS = {# ? ? # 'step8_king.extensions.MyExtension': 500,# }

# 13. 爬蟲允許的最大深度,可以通過meta查看當(dāng)前深度;0表示無深度# DEPTH_LIMIT = 3

# 14. 爬取時巩螃,0表示深度優(yōu)先Lifo(默認(rèn))演怎;1表示廣度優(yōu)先FiFo# 后進(jìn)先出,深度優(yōu)先# DEPTH_PRIORITY = 0# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleLifoDiskQueue'# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.LifoMemoryQueue'# 先進(jìn)先出避乏,廣度優(yōu)先# DEPTH_PRIORITY = 1# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

# 15. 調(diào)度器隊列# SCHEDULER = 'scrapy.core.scheduler.Scheduler'# from scrapy.core.scheduler import Scheduler

# 16. 訪問URL去重# DUPEFILTER_CLASS = 'step8_king.duplication.RepeatUrl'# Enable and configure the AutoThrottle extension (disabled by default)# See http://doc.scrapy.org/en/latest/topics/autothrottle.html"""

17. 自動限速算法? ?

?from scrapy.contrib.throttle import AutoThrottle? ??

自動限速設(shè)置? ??

1. 獲取最小延遲 DOWNLOAD_DELAY? ?

?2. 獲取最大延遲 AUTOTHROTTLE_MAX_DELAY? ?3. 設(shè)置初始下載延遲AUTOTHROTTLE_START_DELAY? ?

?4. 當(dāng)請求下載完成后爷耀,獲取其"連接"時間 latency,即:請求連接到接受到響應(yīng)頭之間的時間? ??

5. 用于計算的... AUTOTHROTTLE_TARGET_CONCURRENCY? ??

target_delay = latency /self.target_concurrency? ??

new_delay = (slot.delay + target_delay) / 2.0 # 表示上一次的延遲時間? ??

new_delay = max(target_delay, new_delay)? ??

new_delay = min(max(self.mindelay, new_delay), self.maxdelay)? ??

slot.delay = new_delay

"""# 開始自動限速# AUTOTHROTTLE_ENABLED = True

# The initial download delay

# 初始下載延遲# AUTOTHROTTLE_START_DELAY = 5

# The maximum download delay to be set in case of high latencies

# 最大下載延遲#?

AUTOTHROTTLE_MAX_DELAY = 10

# The average number of requests Scrapy should be sending in parallel to each remote server

# 平均每秒并發(fā)數(shù)# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

# Enable showing throttling stats for every response received:# 是否顯示

# AUTOTHROTTLE_DEBUG = True# Enable and configure HTTP caching (disabled by default)

#Seehttp://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings"""

18. 啟用緩存? ??

目的用于將已經(jīng)發(fā)送的請求或相應(yīng)緩存下來淑际,以便以后使用? ? ? ? fromscrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware? ?

from scrapy.extensions.httpcache import DummyPolicy? ??

from scrapy.extensions.httpcache import FilesystemCacheStorage"""

# 是否啟用緩存策略#?

HTTPCACHE_ENABLED = True

# 緩存策略:所有請求均緩存畏纲,下次在請求直接訪問原來的緩存即可#?

HTTPCACHE_POLICY = "scrapy.extensions.httpcache.DummyPolicy"

# 緩存策略:根據(jù)Http響應(yīng)頭:Cache-Control、Last-Modified 等進(jìn)行緩存的策略# HTTPCACHE_POLICY = "scrapy.extensions.httpcache.RFC2616Policy"

# 緩存超時時間

# HTTPCACHE_EXPIRATION_SECS = 0

# 緩存保存路徑# HTTPCACHE_DIR = 'httpcache'

# 緩存忽略的Http狀態(tài)碼# HTTPCACHE_IGNORE_HTTP_CODES = []

# 緩存存儲的插件# HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'"""

19. 代理春缕,需要在環(huán)境變量中設(shè)置? ? from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware? ??? ? 方式一:使用默認(rèn)? ? ? ??

os.environ? ? ? ??

? ? ? ? ? ? ? ? {http_proxy:http://root:woshiniba@192.168.11.11:9999/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? https_proxy:http://192.168.11.11:9999/? ? ? ?

? ? ? ? ? ? ? ? ? }? ??

方式二:使用自定義下載中間件? ??? ??

def to_bytes(text, encoding=None, errors='strict'):

? ? ? ? if isinstance(text, bytes):

? ? ? ? ? ? return text

? ? ? ? if not isinstance(text, six.string_types):

? ? ? ? ? ? raise TypeError('to_bytes must receive a unicode, str or bytes '? ? ? ? ? ? ? ? ? ? ? ? ? ? 'object, got %s' % type(text).__name__)

? ? ? ? if encoding is None:

? ? ? ? ? ? encoding = 'utf-8'

? ? ? ? return text.encode(encoding, errors)

class ProxyMiddleware(object):

? ? ? ? def process_request(self, request, spider):

? ? ? ? ? ? PROXIES = [

? ? ? ? ? ? ? ? {'ip_port': '111.11.228.75:80', 'user_pass': ''},

? ? ? ? ? ? ? ? {'ip_port': '120.198.243.22:80', 'user_pass': ''},

? ? ? ? ? ? ? ? {'ip_port': '111.8.60.9:8123', 'user_pass': ''},

? ? ? ? ? ? ? ? {'ip_port': '101.71.27.120:80', 'user_pass': ''},

? ? ? ? ? ? ? ? {'ip_port': '122.96.59.104:80', 'user_pass': ''},

? ? ? ? ? ? ? ? {'ip_port': '122.224.249.122:8088', 'user_pass': ''},

? ? ? ? ? ? ]

? ? ? ? ? ? proxy = random.choice(PROXIES)

? ? ? ? ? ? if proxy['user_pass'] is not None:

? ? ? ? ? ? ? ? request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])? ? ? ? ? ? ? ????????????? encoded_user_pass = base64.encodestring(to_bytes(proxy['user_pass']))? ? ? ? ? ? ? ? request.headers['Proxy-Authorization'] = to_bytes('Basic ' + encoded_user_pass)

? ? ? ? ? ? ? ? print "**************ProxyMiddleware have pass************" + proxy['ip_port']

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? print "**************ProxyMiddleware no pass************" + proxy['ip_port']? ? ? ? ? ? ? ? request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])? ??? ? DOWNLOADER_MIDDLEWARES = {? ? ? ?'step8_king.middlewares.ProxyMiddleware': 500,? ? }? ??""""""

20. Https訪問

? ? Https訪問時有兩種情況:

? ? 1. 要爬取網(wǎng)站使用的可信任證書(默認(rèn)支持)? ? ? ? DOWNLOADER_HTTPCLIENTFACTORY = "scrapy.core.downloader.webclient.ScrapyHTTPClientFactory"? ? ? ? DOWNLOADER_CLIENTCONTEXTFACTORY = "scrapy.core.downloader.contextfactory.ScrapyClientContextFactory"? ? ? ??? ??

2. 要爬取網(wǎng)站使用的自定義證書? ? ? ??

DOWNLOADER_HTTPCLIENTFACTORY = "scrapy.core.downloader.webclient.ScrapyHTTPClientFactory"? ? ? ? DOWNLOADER_CLIENTCONTEXTFACTORY = "step8_king.https.MySSLFactory"

?# https.py

from scrapy.core.downloader.contextfactory import ScrapyClientContextFactory? ? ? ? from twisted.internet.ssl import (optionsForClientTLS, CertificateOptions, PrivateCertificate)? ? ? ??? ? ? ?

?class MySSLFactory(ScrapyClientContextFactory):

? ? ? ? ? ? def getCertificateOptions(self):

? ? ? ? ? ? ? ? from OpenSSL import crypto? ? ? ? ? ? ? ?

?????????????????v1 = crypto.load_privatekey(crypto.FILETYPE_PEM, open('/Users/wupeiqi/client.key.unsecure', mode='r').read())? ? ? ? ? ? ? ?

?????????????????v2 = crypto.load_certificate(crypto.FILETYPE_PEM, open('/Users/wupeiqi/client.pem', mode='r').read())

? ? ? ? ? ? ? ? return CertificateOptions(

? ? ? ? ? ? ? ? ? ? privateKey=v1, ?# pKey對象

? ? ? ? ? ? ? ? ? ? certificate=v2, ?# X509對象

? ? ? ? ? ? ? ? ? ?verify=False,

? ? ? ? ? ? ? ? ? ? method=getattr(self, 'method', getattr(self, '_ssl_method', None))? ? ? ? ? ? ? ? )? ? 其他:

? ? ? ? 相關(guān)類

? ? ? ? ? ? scrapy.core.downloader.handlers.http.HttpDownloadHandler? ? ? ? ? ? ????????????scrapy.core.downloader.webclient.ScrapyHTTPClientFactory? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????scrapy.core.downloader.contextfactory.ScrapyClientContextFactory? ? ? ? 相關(guān)配置? ? ? ? ? ??

????????DOWNLOADER_HTTPCLIENTFACTORY? ? ? ? ? ? ????????????DOWNLOADER_CLIENTCONTEXTFACTORY""""""

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盗胀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锄贼,更是在濱河造成了極大的恐慌票灰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宅荤,死亡現(xiàn)場離奇詭異屑迂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冯键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門惹盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惫确,你說我怎么就攤上這事手报。” “怎么了改化?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵掩蛤,是天一觀的道長。 經(jīng)常有香客問我陈肛,道長揍鸟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任句旱,我火速辦了婚禮阳藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈撒。我一直安慰自己稚配,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布港华。 她就那樣靜靜地躺著道川,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冒萄,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天臊岸,我揣著相機(jī)與錄音,去河邊找鬼尊流。 笑死帅戒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崖技。 我是一名探鬼主播逻住,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迎献!你這毒婦竟也來了瞎访?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤吁恍,失蹤者是張志新(化名)和其女友劉穎扒秸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冀瓦,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡伴奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翼闽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拾徙。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖感局,靈堂內(nèi)的尸體忽然破棺而出锣吼,到底是詐尸還是另有隱情,我是刑警寧澤蓝厌,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站古徒,受9級特大地震影響拓提,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隧膘,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一代态、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疹吃,春花似錦蹦疑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春叁温,著一層夾襖步出監(jiān)牢的瞬間再悼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工膝但, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留冲九,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓跟束,卻偏偏與公主長得像莺奸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冀宴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容