PYTHON 爬蟲筆記十一:Scrapy框架的基本使用

Scrapy框架詳解及其基本使用

  • scrapy框架原理

    Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 其可以應用在數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
    其最初是為了頁面抓取 (更確切來說, 網絡抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。

    Scrapy 使用了 Twisted異步網絡庫來處理網絡通訊。整體架構大致如下

?

Scrapy主要包括了以下組件:

      • 引擎(Scrapy)
        用來處理整個系統的數據流處理, 觸發事務(框架核心)
      • 調度器(Scheduler)
        用來接受引擎發過來的請求, 壓入隊列中, 并在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什么, 同時去除重復的網址
      • 下載器(Downloader)
        用于下載網頁內容, 并將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
      • 爬蟲(Spiders)
        爬蟲是主要干活的, 用于從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面
      • 項目管道(Pipeline)
        負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析后,將被發送到項目管道,并經過幾個特定的次序處理數據。
      • 下載器中間件(Downloader Middlewares)
        位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
      • 爬蟲中間件(Spider Middlewares)
        介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
      • 調度中間件(Scheduler Middewares)
        介于Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

Scrapy運行流程大概如下:

1、從spider中獲取到初始url給引擎,告訴引擎幫我給調度器;

2、引擎將初始url給調度器,調度器安排入隊列;

3、調度器告訴引擎已經安排好,并把url給引擎,告訴引擎,給下載器進行下載;

4、引擎將url給下載器,下載器下載頁面源碼;

5、下載器告訴引擎已經下載好了,并把頁面源碼response給到引擎;

6、引擎拿著response給到spider,spider解析數據、提取數據;

7、spider將提取到的數據給到引擎,告訴引擎,幫我把新的url給到調度器入隊列,把信息給到Item Pipelines進行保存;

8、Item Pipelines將提取到的數據保存,保存好后告訴引擎,可以進行下一個url的提取了;

9、循環3-8步,直到調度器中沒有url,關閉網站(若url下載失敗了,會返回重新下載)。

  • 基本使用

  1. 創建項目的基本過程

    Scrapy:# 創建項目,在當前目錄中創建中創建一個項目文件(類似于Django)
        scrapy startproject sp1生成目錄如下:sp1- sp1- spiders          目錄,放置創建的爬蟲應用- middlewares.py    中間件- items.py          格式化,與pipelines.py一同做持久化- pipelines.py      持久化- settings.py       配置文件- scrapy.cfg            配置# 創建爬蟲應用
        cd sp1scrapy genspider xiaohuar xiaohuar.com      # 創建了xiaohuar.pyscrapy genspider baidu baidu.com        # 創建了baidu.py# 展示爬蟲應用列表
        scrapy list# 執行爬蟲,進入project
        scrapy crawl baiduscrapy crawl baidu --nolog

    文件說明:

注意:一般創建爬蟲文件時,以網站域名命名

  • 項目實戰

  1. 實戰目標:對目標站點所有語錄,作者,標簽進行爬取并存如MongoDB中

  2. 目標站點分析:Quates to scrape

  3. 流程框架:

  4. 爬蟲實戰

    1. 明確目標--->items.py(明確想要抓取的目標,定義需要爬取的信息(字段))

      # -*- coding: utf-8 -*-import scrapy
      class QuoteItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()text = scrapy.Field() #語錄內容author = scrapy.Field() #作者tags = scrapy.Field() #標簽
    2. 制作爬蟲--->quotes.py(解析數據,并提取信息和新的url)

      # -*- coding: utf-8 -*-
      import scrapyfrom quotetutorial.items import QuoteItemclass QuotesSpider(scrapy.Spider):name = 'quotes'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/']def parse(self, response):#print(response.text)quotes = response.css('.quote')     #獲取每行的全部信息for quote in quotes:item = QuoteItem()                #創建獲取對象text = quote.css('.text::text').extract_first()     #*::text 用于獲取文本信息,axtract_first() 用于獲得第一個文本信息*author = quote.css('.author::text').extract_first()tags = quote.css('.tags .tag::text').extract()      #沒有指定獲取第一個--->獲取所有滿足條件的item['text'] = textitem['author'] = authoritem['tags'] = tagsyield itemnext = response.css('.pager .next a::attr(href)').extract_first()        #獲取元素屬性信息url = response.urljoin(next)        #把連接拼接起來yield scrapy.Request(url=url,callback=self.parse)        #回調函數
    3. 存儲內容--->pipelines.py(設計管道存儲內容。當spider收集好Item后,會將Item(由字典組成的列表)傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item)

      # -*- coding: utf-8 -*-
      import pymongofrom scrapy.exceptions import DropItemclass TextPipeline(object):        #對語錄進行處理,當長度超過50時,截斷然后在后面加*...*def __init__(self):self.limit =50def process_item(self, item, spider):if item['text']:if len(item['text']) > self.limit:item['text'] = item['text'][0:self.limit].rstrip() + '...'return itemelse:return DropItem('Miss Text')class MongoPipeline(object):        #鏈接數據庫def __init__(self ,mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):        #從ettings中拿到需要的配置信息(類方法)return cls(mongo_uri=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DB'))def open_spider(self,spider):       #初始化數據庫self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def process_item(self, item ,spider): #向數據庫插入數據name = item.__class__.__name__self.db[name].insert(dict(item))return itemdef close_spider(self ,spider):self.client.close()
    4. 相關配置--->settings.py(為了啟動Item Pipelines組件,必須將類添加到settings.py的ITEM_PIPELINES中,此處只有一個pipeline類,因此找到ITEM_PIPELINES,打開代碼)

      # -*- coding: utf-8 -*-# Scrapy settings for quotetutorial project
      #
      # For simplicity, this file contains only settings considered important or
      # commonly used. You can find more settings consulting the documentation:
      #
      #     https://doc.scrapy.org/en/latest/topics/settings.html
      #     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
      #     https://doc.scrapy.org/en/latest/topics/spider-middleware.html
      
      BOT_NAME = 'quotetutorial'SPIDER_MODULES = ['quotetutorial.spiders']
      NEWSPIDER_MODULE = 'quotetutorial.spiders'MONGO_URI = 'localhost'
      MONGO_DB = 'quotestutorial'# Crawl responsibly by identifying yourself (and your website) on the user-agent
      #USER_AGENT = 'quotetutorial (+http://www.yourdomain.com)'# Obey robots.txt rules
      ROBOTSTXT_OBEY = True# Configure maximum concurrent requests performed by Scrapy (default: 16)
      #CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
      # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
      # See also autothrottle settings and docs
      #DOWNLOAD_DELAY = 3
      # The download delay setting will honor only one of:
      #CONCURRENT_REQUESTS_PER_DOMAIN = 16
      #CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
      #COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
      #TELNETCONSOLE_ENABLED = False# Override the default request headers:
      #DEFAULT_REQUEST_HEADERS = {
      #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      #   'Accept-Language': 'en',
      #}# Enable or disable spider middlewares
      # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
      #SPIDER_MIDDLEWARES = {
      #    'quotetutorial.middlewares.QuotetutorialSpiderMiddleware': 543,
      #}# Enable or disable downloader middlewares
      # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
      #DOWNLOADER_MIDDLEWARES = {
      #    'quotetutorial.middlewares.QuotetutorialDownloaderMiddleware': 543,
      #}# Enable or disable extensions
      # See https://doc.scrapy.org/en/latest/topics/extensions.html
      #EXTENSIONS = {
      #    'scrapy.extensions.telnet.TelnetConsole': None,
      #}# Configure item pipelines
      # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
      ITEM_PIPELINES = {'quotetutorial.pipelines.TextPipeline': 300,'quotetutorial.pipelines.MongoPipeline': 400,
      }# Enable and configure the AutoThrottle extension (disabled by default)
      # See https://doc.scrapy.org/en/latest/topics/autothrottle.html
      #AUTOTHROTTLE_ENABLED = True
      # The initial download delay
      #AUTOTHROTTLE_START_DELAY = 5
      # The maximum download delay to be set in case of high latencies
      #AUTOTHROTTLE_MAX_DELAY = 60
      # The average number of requests Scrapy should be sending in parallel to
      # each remote server
      #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
      # Enable showing throttling stats for every response received:
      #AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
      # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
      #HTTPCACHE_ENABLED = True
      #HTTPCACHE_EXPIRATION_SECS = 0
      #HTTPCACHE_DIR = 'httpcache'
      #HTTPCACHE_IGNORE_HTTP_CODES = []
      #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

      注意:如果有多個item pipelines的話(多種保存方式),需要在ITEM_PIPELINES中配置類,后面的“300”隨意設置。

        ? ?分配給每個類的整型值,確定了它們的運行順序。數值越低,組件的優先級越高,運行順序越靠前。

    5. 啟動項目:

      scrapy crawl quotes
    6. 把獲得的內容保存

      scrapy crawl quotes -o quotes.{json | jl | csv | xml | pickle | marshal}

      ?

?

轉載于:https://www.cnblogs.com/darwinli/p/9485505.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java設計把兩個字符串的值交換 而不使用中間變量

public class Test {public static void main(String[] args) {String s1 "aaa";String s2 "cccx";s1 s1 s2;s2 s1.substring(0, s1.length()-s2.length());s1 s1.substring(s2.length());System.out.println(s1" - "s2);}}

服務器返回值 解釋 ajax提交方式 后臺數據刷進前端

轉載于:https://www.cnblogs.com/liuliang389897172/p/9120715.html

no typehandler found for property XXXX 解決

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. ssm框架下 啟動服務報錯如題。 2. 原因: 我的情況是,代碼中實體屬性映射書寫和數據庫字段名字不一致。 數據…

C++主流預處理,編譯和鏈接過程

在C的程序的編寫過程中,基本上都碰到過LNK2005的錯誤吧,下面就針對這個問題詳細分析:首先,預處理階段:這一過程,主要針對#include和#define進行處理,具體過程如下:對于cpp文件中經常…

shell中sed -i特殊字符

可參考文獻: Linux生產環境上,最常用的一套“sed“技巧 看懂shell中的各種語句

Win10遠程桌面提示你的憑據不工作的處理方法

需要確保在組策略編輯器(WinR 輸入 gpedit.msc )中計算機配置->Windows設置->安全設置->本地策略->安全選項->右側的網絡訪問:本地帳戶的共享和安全模型。修改為使用經典模式即可!

子網掩碼255.255.0.0與255.255.255.0的區別

先介紹子網掩碼:子網掩碼,是一種用來指明一個IP地址的哪些位標識的是主機所在的子網,以及哪些位標識的是主機的位掩碼。子網掩碼不能單獨存在,它必須結合IP地址一起使用。子網掩碼只有一個作用,就是將某個IP地址劃分成…

日期格式不符合要求:Unparseable date: quot;3e8a4d83533744c698216535a65850c0quot;

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 報錯如題 2. 原因:使用token 記錄當前登陸用戶,token值已經過期。 HttpClientUtil.doPost(&…

Spring中都用到了哪些設計模式?

Spring 框架中用到了哪些設計模式: 工廠設計模式 : Spring使用工廠模式通過 BeanFactory、ApplicationContext 創建 bean 對象。 代理設計模式 : Spring AOP 功能的實現。 單例設計模式 : Spring 中的 Bean 默認都是單例的。 模板方法模式 : Spring 中 jdbcTemplat…

解決火車票網上訂票難的方案

春運是最熱的話題,買火車票是最流行的事情;網上訂票給大家帶來了極大的便利,但是由于各種原因,網上訂票成功率很低,至少比在淘寶上買東西困難多了。在下不才,試圖提出其解決方案。 問題:并發訪問…

小程序支付成功后跳轉頁面失敗

在安卓報錯 relaunch:fail can not invoka lelaunch in background,ios正常,換成別的跳轉方式即可轉載于:https://www.cnblogs.com/wang-xing/p/9488961.html

linux 中 ~/. 是什么意思

~代表你的/home/用戶明目錄假設你的用戶名是x,那么~/就是/home/x/.是代表此目錄本身,但是一般可以不寫所以cd ~/. 和cd ~ 和cd ~/效果是一樣的但是.后面有東西又是另外一個問題,點在文件名頭部,代表一個隱藏文件~/.local是你的主目…

Nginx 啟動報錯 “/var/run/nginx/nginx.pid failed”

問題: 重啟虛擬機后,再次重啟nginx會報錯: open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) 解決方法: (1)進入 cd /usr/local/nginx/conf/ 目錄,編輯配置…

eclipse關閉討厭的菜單

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 不知道動哪了,開啟了這個菜單: 2. 很感謝群友幫我找到關閉方法,點擊 如下 按鈕: 然后就…

SSL加密工作原理RSA免密登錄原理

SSL 是一個安全協議,它提供使用 TCP/IP 的通信應用程序間的隱私與完整性。因特網的 超文本傳輸協議(HTTP)使用 SSL 來實現安全的通信。 在客戶端與服務器間傳輸的數據是通過使用對稱算法(如 DES 或 RC4)進行加密的。…

linux命令中cd / 和 cd ~

cd命令:切換當前目錄至其它目錄,比如進入/etc目錄,則執行 cd /etccd /: 在Linux 系統中斜杠“/”表示的是根目錄。 cd / ,即進入根目錄.cd ~命令是,進入用戶在該系統的home目錄,例如xz用戶,則進入/root/xz目…

h5頁面點擊事件ios沒反應 移動端兼容性問題

$(document).on("click",".動態添加的dom",function(){  console.log("11") }) //在ios里這里動態添加的dom點擊事件不會觸發,解決辦法:給觸發點擊事件動態添加的dom增加樣式,cursor:pointer |||||| 或者增加一個touch事件 ios…

我不知道的事——深克隆和淺克隆

推薦一部好電影《致命魔術》。(此處為植入廣告) 推薦理由:涉及人性。畫面不錯,劇情跌宕,亦魔亦幻(此處的”魔“為魔術的”魔“)。雖然女豬腳不盡如人意,但是男豬腳比較帥。而…

服務器搭建

2019獨角獸企業重金招聘Python工程師標準>>> 最近弄了個阿里云的服務器,想在上面搞點東西,故要搭建一套環境。登錄linux,在終端輸入 uname -a 即列出linux的內核版本號。(服務器網址:http://101.132.235.56…

mybatis內部類映射寫法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. B類是A類中的內部類。 2.  映射寫法: com.XXX.A$B , 注意A類和B類之間用 $ 表示內外關系,而不是常用的 …