scrapy
scrapy 是什麼
scrapy是框架 類似於車子
-
採用異步框架 實現高效率的網絡採集
-
最強大的框架 沒有之一
scrapy 框架結構
Engine
- 控制有所模塊之間的數據交流
- 根據條件觸發事件
Spider
-
解析Downloader返回的響應 (Response)
-
產生爬取項 (scraped item)
-
產生額外的爬取請求 (Request)
需要用戶編寫配置代碼
Spider Middleware
- 目的: 對請求和爬取項的再處理
- 功能: 修改、丟棄、新增請求或爬取項
需要用戶編寫配置代碼
Scheduler
- 對所有爬取請求進行調度管理
Item Pipelines
-
以流水線方式處理Spider產生的爬取項。
-
由一組操作順序組成,類似流水線,每個操作是一個 ItemPipeline 類型
-
可能操作包括: 清理、檢驗和查重爬取項中的HTML數據、將數據存儲到數據庫
需要用戶編寫配置代碼
Downloader
- 根據請求下載網頁
Downloader Middleware
- 目的:實施Engine、Scheduler和Downloader之間進行用戶可配置的控制
- 功能: 修改、丟棄、新增請求或響應
scrapy 安裝
-
pip install scrapy → 報:VC++14.0 Twisted
- 解決方案:離線安裝 pip install xxx.whl
-
scrapy bench 運行的時候 → 報:win32
- 解決方案:
pip install pywin32
- 解決方案:
創建 scrapy 項目
-
使用命令行 cd 到 要創建 scrapy 項目的文件夾下
-
運行命令:
scrapy startproject xxx(項目名稱)
創建爬蟲文件
-
使用命令行 cd 到scrapy 項目的根文件夾下
-
運行命令:scrapy genspider Reptile_name(爬蟲名稱) domain_name(域名)
注意:
-
爬蟲名字不得與項目名稱一樣
-
網站域名是允許爬蟲採集的域名(限制爬蟲數據採集範圍)
-
爬蟲文件
import scrapy # 導入scrapy
創建 爬蟲類 並且繼承自scrapy.Spider --> 最基礎的類 scrapy共有5個爬蟲類
class XicidailiSpider(scrapy.Spider):
name = 'xicidaili' # 爬蟲名字 必須唯一
allowed_domains = ['www.xicidaili.com'] # 允許的域名(可以不要)
start_urls = ['http://www.xicidaili.com/'] # 開始採集的網站
# 解析響應數據 提取數據 或網址等 response響應數據
def parse(self, response):
pass
分析網站:
-
提取數據
-
正則表達式(基礎 必會 難掌握)
-
xpath表達式 → 從HTML中提取數據(scrapy默認提取數據方式)
-
-
CSS表達式 → 從HTML中提取數據(不建議使用 scrapy中的CCS表達式是轉成xpath表達式使用的)
- response.xpath(’’).get() get() → 得到一個元素 getall → 得到多個元素
-
運行爬蟲:
-
scrapy crawl xxx(爬蟲名稱)
yield scrapy.Request(next_url, callback=self.parse) #生成器
# Request()發出請求 類似於requests.get()
# callback 是將發出去的請求得到的響應數據還交給自己處理
# 注意:回調函數 不寫() 只寫 函數名
-
執行程序並保存數據:
- scrapy crawl xxx(爬蟲名稱) -o xxx.json/.csv/.xml
scrapy 常用命令
命令 | 說明 | 格式 |
---|---|---|
startproject | 創建一個新工程 | scrapy startproject xxx_Spider(項目名稱) |
genspider | 創建一個爬蟲 | scrapy genspider Reptile_name(爬蟲名稱) domain_name(域名) |
settings | 獲得爬蟲配置信息 | scrapy genspider [options] |
crawl | 運行一個爬蟲 | scrapy crawl xxx(爬蟲名稱) |
list | 列出工程中所有爬蟲 | scrapy list |
shell | 啓動URL調試命令行 | scrapy shell [url] |
requests 庫 VS scrapy 框架
相同點
-
兩者都可以進行頁面請求和爬取,Python爬蟲的兩個重要技術路線
-
兩者可用性都好,文檔豐富,入門簡單
-
兩者都沒有處理js、提交表單、應對驗證碼等功能(可擴展)
不同點
requests | scrapy |
---|---|
頁面級爬蟲 | 網站級 |
功能庫 | 框架 |
併發考慮不足,性能較差 | 併發性好,性能較高 |
重點在於頁面下載 | 重點在於爬蟲結構 |
定製靈活 | 一般定製靈活,深度定製困難 |
上手十分簡單 | 入門稍難 |
技術路線的選擇
- 非常小的需求,requests庫
- 不太小的需求,scrapy框架
- 定製程度很高的需求(不考慮規模),自搭建框架,requests > scrapy
較差|併發性好,性能較高
重點在於頁面下載|重點在於爬蟲結構
定製靈活|一般定製靈活,深度定製困難
上手十分簡單|入門稍難
技術路線的選擇
- 非常小的需求,requests庫
- 不太小的需求,scrapy框架
- 定製程度很高的需求(不考慮規模),自搭建框架,requests > scrapy