本文經過一個簡單的項目實現Scrapy採集流程。但願經過該項目對Scrapy的使用方法和框架可以有幫助。數據庫
重點流程以下:服務器
安裝好Scrapy框架,MongoDB的和PyMongo庫。框架
(1)建立一個Scrapy項目,文件項目能夠直接用dom
scrapy
scrapy
命令生成,命令以下所示:ide
scrapy startproject教程複製代碼
(2)爬蟲是本身定義的類,Scrapy經過該類從網頁裏採集內容分析數據的結果。不過這個類必須繼承Scrapy提供的蜘蛛類網站
scrapy.Spider
url
,還要定義爬蟲的名稱和起始請求,以及怎樣處理爬取後的數據。命令行
也能夠使用命令行建立一個蜘蛛好比要生成行情這個蜘蛛,能夠執行以下命令:代理
scrapy genspider 複製代碼
進入剛纔建立的教程文件夾,執行而後
genspider
命令。第一個參數是爬蟲的名稱,第二個參數是網站域名。執行完畢以後,蜘蛛文件夾中多了一個quotes.py,它就是剛剛建立的蜘蛛,內容以下所示:
import scrapy class QuotesSpider (scrapy.Spider): name = 「quotes」 allowed_domains = [ 「quotes.toscrape.com」 ] start_urls = [ 'http://quotes.toscrape.com/' ] def parse (self,response): 經過複製代碼
(3)採集過程當中,目標網站會限制爬蟲的請求訪問頻率,必須使用爬蟲代理
在項目中新建middlewares.py文件(./項目名/middlewares.py)
#! -*- encoding:utf-8 -*- import base64 import sys import random PY3 = sys.version_info[0] >= 3 def base64ify(bytes_or_str): if PY3 and isinstance(bytes_or_str, str): input_bytes = bytes_or_str.encode('utf8') else: input_bytes = bytes_or_str output_bytes = base64.urlsafe_b64encode(input_bytes) if PY3: return output_bytes.decode('ascii') else: return output_bytes class ProxyMiddleware(object): def process_request(self, request, spider): # 代理服務器(產品官網 www.16yun.cn) proxyHost = "t.16yun.cn" proxyPort = "31111" # 代理驗證信息 proxyUser = "username" proxyPass = "password" request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort) # 添加驗證頭 encoded_user_pass = base64ify(proxyUser + ":" + proxyPass) request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass # 設置IP切換頭(根據需求) tunnel = random.randint(1,10000) request.headers['Proxy-Tunnel'] = str(tunnel)
修改項目配置文件 (./項目名/settings.py)
DOWNLOADER_MIDDLEWARES = { '項目名.middlewares.ProxyMiddleware': 100, }