Scrapy使用入門及爬蟲代理配置

mmz_77發表於2020-11-11

本文通過一個簡單的專案實現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,
   }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31522063/viewspace-2733501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章