Scrapy框架

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)

Scrapy 1.png

以上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):

  1. 進(jìn)行頁面請求和爬取,是Python爬蟲的2個重要的技術(shù)路線
  2. 可用性號,文檔豐富,入門簡單
  3. 沒有處理js、提交表單。應(yīng)對驗(yàn)證碼等功能(可擴(kuò)展)
requests Scrapy
頁面級爬蟲 網(wǎng)站級爬蟲
功能庫 框架
并發(fā)性考慮不足,性能差 并發(fā)性號,性能較高
重點(diǎn)在于頁面下載 重點(diǎn)在于爬蟲框架
定制靈活 一般定制靈活,深度定制困難
上手十分簡單 入門稍難

如何選擇:

  1. 非常小的需求,requests庫
  2. 不太小的需求,Scrapy框架
  3. 定制程度很高(不考慮規(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
步驟:

  1. 建立一個Scrapy爬蟲工程
e:
cd code
acrapy startproject python123
Scrapy 2.png
  1. 在工程中產(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爬取請求

Scrapy 3.png
# -*- 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
  1. 配置產(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)
  1. 運(yùn)行爬蟲,獲得網(wǎng)頁
scrapy crawl demo
Scrapy 4.png

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是一個生成器

  1. 生成器是一個不斷產(chǎn)生值得函數(shù)
  2. 包含yield語句的函數(shù)是一個生成器
  3. 生成器每次產(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爬蟲基本步驟

  1. 創(chuàng)建一個工程和Spider模板
  2. 編寫Spider
  3. 編寫Item Pipeline
  4. 優(yōu)化配置策略

Scrapy爬蟲數(shù)據(jù)類型

  1. Request類:向網(wǎng)絡(luò)提交請求的內(nèi)容,表示一個HTTP請求,由Spider生成,Downloader執(zhí)行
屬性和方法 說明
.url Request對應(yīng)的請求URL地址
.method 對應(yīng)的請求方法,GETPOST
.headers 字典類型風(fēng)格的請求頭
.body 請求內(nèi)容主題,字符串類型
.meta 用戶添加的擴(kuò)展信息,在Scrapy內(nèi)部模塊間傳遞信息使用
.copy() 復(fù)制該請求
  1. 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)
  1. Item類:由Spider產(chǎn)生的信息封裝的類,表示一個從HTML頁面中提取的信息內(nèi)容,由Spider生成,Item Pipeline處理。是一個類字典類型,可以按照字典類型操作

Scrapy爬蟲提取信息的方法

  1. Beautiful Soup
  2. lxml
  3. re
  4. XPath Selector
  5. CSS Selector:<HTML>.css('a::attr(href)').extract()

CSS中,a:標(biāo)簽名稱;href:標(biāo)簽屬性

目錄
Python網(wǎng)絡(luò)爬蟲與信息提取
一、Requests庫
二、Beautiful Soup庫
三、Re庫
四、Scrapy框架
匯總

python網(wǎng)絡(luò)爬蟲與信息提取.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • scrapy框架Scrapy是用純Python實(shí)現(xiàn)一個為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,用途非常廣...
    糖炒栗子_01c5閱讀 2,999評論 0 2
  • scrapy框架的流程圖2018-11-01框架流程圖 1、scrapy框架主要為個塊??????(1)Scrap...
    dream_seeker閱讀 1,055評論 0 1
  • Scrapy Scrapy是用純Python實(shí)現(xiàn)一個為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,用途非常廣泛...
    愛你如閱讀 4,949評論 0 4
  • scrapy介紹 Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)化數(shù)據(jù)而編寫的爬蟲應(yīng)用框架。Scrapy內(nèi)部實(shí)現(xiàn)了包...
    3788ea30a4e8閱讀 2,684評論 0 1
  • Scrapy框架架構(gòu) Scrapy框架介紹: 寫一個爬蟲,需要做很多的事情。比如:發(fā)送網(wǎng)絡(luò)請求、數(shù)據(jù)解析、數(shù)據(jù)存儲...
    久壑閱讀 956評論 0 0

友情鏈接更多精彩內(nèi)容