1. Scrapy爬蟲框架
Scrapy是功能強(qiáng)大的網(wǎng)絡(luò)爬蟲框架
# 通過cmd的命令行安裝Scrapy庫
pip install -i https://mirrors.aliyun.com/pypi/simple/ scrapy
# 測試scrapy安裝情況
scrapy -h
爬蟲框架:實(shí)現(xiàn)爬蟲功能的一個軟件結(jié)構(gòu)和功能組件合集;一個半成品,能夠幫助用戶實(shí)現(xiàn)專業(yè)的網(wǎng)絡(luò)爬蟲
1.1 Scrapy簡介
Scrapy爬蟲框架結(jié)構(gòu):“5+2”結(jié)構(gòu)

以上5個模塊形成Scrapy爬蟲框架
SPIDRS是入口,需要用戶編寫,用來向整個框架提供url連接,同時需要解析網(wǎng)絡(luò)內(nèi)容
ITEM PIPELINES是出口,需要用戶編寫,負(fù)責(zé)對提取的信息進(jìn)行后處理
ENGINE、SCHEDULER、DOWNLOADER是已有的功能實(shí)現(xiàn),不需要編寫
5個模塊間,主要有3條數(shù)據(jù)流路徑
第一條:
- 1:ENGINE從SPIDRS獲得用戶爬取的請求(url)
- 2:ENGINE將從SPIDRS獲得的請求,轉(zhuǎn)發(fā)給SCHEDULER(SCHEDULER賦負(fù)責(zé)對爬取請求進(jìn)行調(diào)度)
第二條:- 3:ENGINE從SCHEDULER獲得請求(真實(shí)的網(wǎng)絡(luò)爬取請求)
- 4:ENGINE通過MIDDLEWARD發(fā)送給DOWNLOADER模塊
- 5:DOWNLOADER模塊獲得請求,連接互聯(lián)網(wǎng),并且爬取相關(guān)網(wǎng)頁,獲得響應(yīng)(RESPONSE)并傳遞給ENGINE
- 6:ENGINE將響應(yīng)傳給SPIDRS
第三條:- 7:SPIDRS處理從ENGINE獲得的響應(yīng),獲得2個數(shù)據(jù)類型:爬去項(xiàng)(ITEMS)、新爬取請求
- 8:ENGINE將ITEMS發(fā)送給ITEM PIPELINES;將新爬取請求發(fā)送給SCHEDULER進(jìn)行調(diào)度
1.2 Scrapy框架解析
ENGINE:控制所有模塊之間的數(shù)據(jù)流;根據(jù)條件觸發(fā)事件
DOWNLOADER:根據(jù)請求下載網(wǎng)頁
SCHEDULER:對所有爬取請求進(jìn)行調(diào)度
Downloader Middleware:通過修改、丟棄、新增請求或者響應(yīng),對ENGINE、DOWNLOADER、SCHEDULER之間的數(shù)據(jù)流進(jìn)行用戶可配置的控制。用戶可以編寫配置代碼
SPIDRS:解析DOWNLOADER返回的響應(yīng)(Respones);產(chǎn)生爬取項(xiàng)(scraped item);產(chǎn)生額外的爬取請求(Request)
ITEM PIPELINES:以流水線方式處理Spider參數(shù)的爬去項(xiàng);由一組操作順序組成,類似流水線,每個操作是一個ITEM PIPELINES類型;可能的操作包括清理、檢驗(yàn)、查重爬取項(xiàng)的HTML數(shù)據(jù)、將數(shù)據(jù)存儲到數(shù)據(jù)庫
Spider Middleware:通過修改、丟棄、新增請求或爬取項(xiàng),對請求和爬取項(xiàng)再處理。用戶可以編寫配置代碼
1.3 requests vs Scrapy
相同點(diǎn):
- 進(jìn)行頁面請求和爬取,是Python爬蟲的2個重要的技術(shù)路線
- 可用性號,文檔豐富,入門簡單
- 沒有處理js、提交表單。應(yīng)對驗(yàn)證碼等功能(可擴(kuò)展)
| requests | Scrapy |
|---|---|
| 頁面級爬蟲 | 網(wǎng)站級爬蟲 |
| 功能庫 | 框架 |
| 并發(fā)性考慮不足,性能差 | 并發(fā)性號,性能較高 |
| 重點(diǎn)在于頁面下載 | 重點(diǎn)在于爬蟲框架 |
| 定制靈活 | 一般定制靈活,深度定制困難 |
| 上手十分簡單 | 入門稍難 |
如何選擇:
- 非常小的需求,requests庫
- 不太小的需求,Scrapy框架
- 定制程度很高(不考慮規(guī)模),自搭框架,requests庫優(yōu)于Scrapy
1.4 Scrapy常用命令
Scrapy是為維持運(yùn)行設(shè)計(jì)的專業(yè)爬蟲框架,因此提供了相關(guān)操作的Scrapy命令行
在cmd命令行中執(zhí)行下列代碼,打開Scrapy命令行
scrapy -h
| 命令 | 說明 | 格式 |
|---|---|---|
| startproject | 創(chuàng)建一個新工程 | scrapy startproject <name> [dir] |
| genspider | 創(chuàng)建一個爬蟲 | scrapy genspider [options] <name> <domain> |
| settings | 獲得爬蟲配置信息 | scrapy settings [options] |
| crawl | 運(yùn)行一個爬蟲 | scrapy crawl <spider> |
| list | 列出工程中所有爬蟲 | scrapy list |
| shell | 啟動URL調(diào)式命令行 | scrapy shell [url] |
2. 基本使用
2.1 簡單實(shí)例
演示HTML頁面地址:https://python123.io/ws/demo.html
步驟:
- 建立一個Scrapy爬蟲工程
e:
cd code
acrapy startproject python123

- 在工程中產(chǎn)生一個Scrapy爬蟲
cd python123
# 生成一個名為demo的爬蟲;python123.io是網(wǎng)頁的domain(見上述網(wǎng)址)
scrapy genspider demo python123.io
發(fā)現(xiàn)在Spider目錄中出現(xiàn)一個名為demo.py的代碼
demo.py是面向?qū)ο缶幋a的一個類
parse()用于處理響應(yīng),解析內(nèi)容形成字典,發(fā)現(xiàn)新的URL爬取請求

# -*- coding: utf-8 -*-
import scrapy
# 名字取名為demo所有類名為DemoSpider
class DemoSpider(scrapy.Spider):
name = 'demo'
# 用戶提交給命令行的域名,說明只能爬取這個域名一下的相關(guān)連接
allowed_domains = ['python123.io']
# 以列表形式包含一個或多個url
start_urls = ['http://python123.io/']
# 解析頁面空的方法
def parse(self, response):
pass
- 配置產(chǎn)生的spider爬蟲
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
# allowed_domains = ['python123.io']【不需要,將這個變成注釋】
start_urls = ['https://python123.io/ws/demo.html']
def parse(self, response):
# 定義存儲response文件的名字
# 從響應(yīng)的url文件名作為文件的名字
fname = response.url.split('/')[-1]
# 將返回的內(nèi)容保存為文件
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file &s.' & name)
- 運(yùn)行爬蟲,獲得網(wǎng)頁
scrapy crawl demo

demo.py代碼完整版
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
def start_requests(self):
urls = ['https://python123.io/ws/demo.html']
for url in urls:
# 向NGINE提出訪問請求
yield acrapy.Request(url = url, callback = self.parse)
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file &s.' & name)
2.2 yield關(guān)鍵字
yield是一個生成器
- 生成器是一個不斷產(chǎn)生值得函數(shù)
- 包含
yield語句的函數(shù)是一個生成器 - 生成器每次產(chǎn)生一個值,函數(shù)被凍結(jié),被喚醒后再產(chǎn)生一個值
'''生成器寫法'''
def gen(n):
for i in range(n):
yield i**2
以上函數(shù)能夠產(chǎn)生所有小于n的整數(shù)的平方值
當(dāng)函數(shù)被調(diào)用時,首先執(zhí)行for循環(huán),到yield時,函數(shù)會被凍結(jié),而當(dāng)前yield那一行的值會被返回出來
生成器的使用一般與for循環(huán)搭配,調(diào)用生成器
for i in gen(5):
print(i, ' ', end = ' ') # 0 1 4 9 16
普通寫法
def square(n):
ls = [i**2 for i in range(n)]
return ls
a = square(5)
a # [0, 1, 4, 9, 16]
生成器,相比一次列出所有內(nèi)容的普通寫法,更節(jié)省存儲空間、更快的響應(yīng)速度、使用更靈活
demo.py的完整的代碼中的下列代碼就是生成器的利用
for url in urls:
# 使用yield語句,每次只提交一個請求
yield acrapy.Request(url = url, callback = self.parse)
2.3 基本使用
Scrapy爬蟲基本步驟
- 創(chuàng)建一個工程和Spider模板
- 編寫Spider
- 編寫Item Pipeline
- 優(yōu)化配置策略
Scrapy爬蟲數(shù)據(jù)類型
- Request類:向網(wǎng)絡(luò)提交請求的內(nèi)容,表示一個HTTP請求,由Spider生成,Downloader執(zhí)行
| 屬性和方法 | 說明 |
|---|---|
.url |
Request對應(yīng)的請求URL地址 |
.method |
對應(yīng)的請求方法,GET、POST等 |
.headers |
字典類型風(fēng)格的請求頭 |
.body |
請求內(nèi)容主題,字符串類型 |
.meta |
用戶添加的擴(kuò)展信息,在Scrapy內(nèi)部模塊間傳遞信息使用 |
.copy() |
復(fù)制該請求 |
- Response類:從網(wǎng)絡(luò)上爬取內(nèi)容的封裝類,表示一個HTTP響應(yīng),由Downloader生產(chǎn),Spider處理
| 屬性和方法 | 說明 |
|---|---|
.url |
Response對應(yīng)的URL地址 |
.status |
HTTP狀態(tài)碼,默認(rèn)是200 |
.headers |
Response對應(yīng)的頭部信息 |
.body |
Response對應(yīng)的內(nèi)容信息,字符串類型 |
.flags |
一組標(biāo)記 |
.request |
產(chǎn)生Response類型對應(yīng)的Request對象 |
.copy() |
復(fù)制該響應(yīng) |
- Item類:由Spider產(chǎn)生的信息封裝的類,表示一個從HTML頁面中提取的信息內(nèi)容,由Spider生成,Item Pipeline處理。是一個類字典類型,可以按照字典類型操作
Scrapy爬蟲提取信息的方法
- Beautiful Soup
- lxml
- re
- XPath Selector
- CSS Selector:<HTML>.css('a::attr(href)').extract()
CSS中,a:標(biāo)簽名稱;href:標(biāo)簽屬性
目錄
Python網(wǎng)絡(luò)爬蟲與信息提取
一、Requests庫
二、Beautiful Soup庫
三、Re庫
四、Scrapy框架
匯總
