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能減小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中斷,恢復仍是輸入上面的命令併發
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':'......' #在這裏配置你的請求頭 }}
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,而不是每一個域
必須在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.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()
使用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)
在 ‘DOWNLOADER_MIDDLEWARES’ 項中啓用中間件
DOWNLOADER_MIDDLEWARES = { 'LvdunSpider.middlewares.RandomUserAgentMiddleware': 543, }
pythonQQ交流羣:785239887