本文通過一個簡單的項目實現Scrapy採集流程。希望通過該項目對Scrapy的使用方法和框架能夠有幫助。
1. 工作流程
重點流程如下:
- 創建一個Scrapy項目。
- 創建一個爬蟲來抓取網站和處理數據。
- 通過命令行將採集的內容進行分析。
- 將分析的數據保存到MongoDB數據庫。
2. 準備環境
安裝好Scrapy框架,MongoDB的和PyMongo庫。
3. 爬蟲項目實現
(1)創建一個Scrapy項目,文件項目可以直接用
scrapy
命令生成,命令如下所示:
scrapy startproject教程複製代碼
(2)爬蟲是自己定義的類,Scrapy通過該類從網頁裏採集內容分析數據的結果。不過這個類必須繼承Scrapy提供的蜘蛛類
scrapy.Spider
,還要定義爬蟲的名稱和起始請求,以及怎樣處理爬取後的數據。
也可以使用命令行創建一個蜘蛛比如要生成行情這個蜘蛛,可以執行如下命令:
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,
}