爬蟲之Scrapy的簡介與優勢


Scrapy框架與原始爬蟲的區別

原始爬蟲

效率低、同步、阻塞

Scrapy框架

效率高、異步、非阻塞

Scrapy的概念

  •   爬蟲框架
  •   開發速度快
  •   穩定性高
  •   性能優越

 scrapy的流程

  1. 爬蟲模塊(Spiders)  -->  准備起始URL(Request)  -->   爬蟲中間件  -->  引擎   -->   調度器(Scheduler):請求去重, 緩存請求(隊列)
  2. 調度器  -->  請求(Request)   -->  引擎   -->  下載器中間件   -->  下載器:發送請求, 獲取響應, 把響應封裝為Response對象
  3. 下載器 -Response   -->  下載器中間件   -->  引擎   -->  爬蟲中間件   -->  爬蟲模塊:解析響應數據, 提取數據, 提取請求
  4. 爬蟲模塊   -->  數據   -->  引擎   -->  管道(Pipeline):保存數據
  5. 爬蟲模塊   -->  請求   -->  爬蟲中間件   -->  引擎   -->  調度器

 scrapy各個組件作用

  •    引擎模塊:調度各個模塊, 以及模塊間數據傳遞.
  •    調度器模塊:請求去重, 緩存請求(隊列)
  •    下載器: 發送請求, 獲取響應數據
  •    爬蟲模塊:解析響應數據, 提取數據, 提取請求
  •    管道模塊:處理數據, 比如:保存數據
  •    下載器中間件: 在引擎和下載器之間, 把請求交給下載器之前, 可以對請求進行處理, 比如設置代理, 設置隨機請求頭.
  •    爬蟲中間件: 在引擎和爬蟲之間, 可以請求和響應數據進行過濾.

ScrapyShell

  使用格式:scrapy shell URL

作用

  1. 可以用於測試response常見屬性和方法
  2. 可用於用於測試/調試XPATH

response中重要屬性

  • response.body:響應的二進制數據
  • response.text: 響應的文本字符串數據
  • response.url: 響應的URL
  • response.request.headers: 響應對應的請求的請求頭

settings.py中的設置信息

  • ROBOTSTXT_OBEY 是否遵守robots協議,默認是遵守
  • DOWNLOAD_DELAY 下載延遲,默認0.5~1.5的隨機延遲
  • COOKIES_ENABLED 是否開啟cookie,即每次請求帶上前一次的cookie,默認是開啟的
  • DEFAULT_REQUEST_HEADERS 設置默認請求頭
  • DOWNLOADER_MIDDLEWARES 下載中間件
  • LOG_LEVEL 控制日志輸出的級別
  •   日志等級: DEBUG,INFO,WARNING,ERROR,CRITICAL
  • LOG_FILE 設置log日志文件的保存路徑, 如果設置該參數,終端將不再顯示日志信息

 回調函數之間數據的傳遞

yield scrapy.Requst(url,[callback,method,headers,body,cookies,meta,dont_filter])

  • callback:表示當前的url的響應交給哪個函數去處理
  • meta:實現數據在不同的解析函數中傳遞,設置代理IP
  •    meta={'xx':yy}:在callback函數中使用response.meta['xx']獲取傳遞過來的yy的數據
  • dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續被請求,對需要重復請求的url地址可以把它設置為True
  • method:指定POST或GET請求
  • headers:接收一個字典,其中不包括cookies
  • cookies:接收一個字典,專門放置cookies
  • body:接收字符串格式:name=aa&age=bb

scrapy中間件

  1.   先書寫middlewares文件內部的process_request方法
  2.   再在setting文件中打開配置信息
DOWNLOADER_MIDDLEWARES = {
   'middle.middlewares.MiddleDownloaderMiddleware': 543,
}
USER_AGENT_LIST = [
    '1111111111',
    '222222222',
    '...',]

PROXY_LIST = [
    '14.106.27.137:8118',
    '27.193.49.150:8118',
    '12.86.54.194:8118',
    '115.218.132.203:8118',
    '182.96.203.11:49225',
    '114.249.112.65:9000',
    '43.248.122.251:8123',
]

Downloader Middlewares默認的方法

process_request(self, request, spider)

  •     當每個request通過下載中間件時,該方法被調用。
  •     返回None值:繼續請求
  •     返回Response對象:不再請求,把response返回給引擎
  •     返回Request對象:把request對象交給引擎 -> 調度器進行后續的請求

process_response(self, request, response, spider)

  •     當下載器完成http請求,傳遞響應給引擎的時候調用
  •     返回Resposne:交給process_response來處理
  •     返回Request對象:交給調取器繼續請求
    def process_request(self, request, spider):
        # 處理請求的下載器中間件
        # Called for each request that goes through the downloader
        # 每當有一個request經過下載中間件的時候,那么此方法就會被調用
        # 隨機獲取一個user_agent
        # USER_AGENT_LIST/PROXY_LIST:setting中配置
        """
        隨機User-Agent下載器中間件
            1.在settings.py中准備USER_AGENT_LIST列表
            2.實現 process_request`方法
            3.隨機中USER_AGENT_LIST, 選出一個UserAgent設置給request
                request.headers['User-Agent']
        在settings.py中配置中間件
        """
        ua = random.choice(USER_AGENT_LIST)
        request.headers['User-Agent'] = ua
        """
        代理IP下載器中間件
            request.meta['proxy']
        """
        p = random.choice(PROXY_LIST)
        request.meta['proxy'] = p
        # return None 這個請求繼續執行
        # return request 換了一個新的請求,把request對象交給引擎 -> 調度器進行后續的請求
        # return response 根本不會再發送請求,把response返回給引擎
        return None


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM