天天看點

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

目錄

1.選取目标站點

目标站點分析

2.流程架構

3.爬蟲實戰

建立項目

建立spider

輸出調試資訊

4.抓取:

1.分析源代碼

2.爬取中的存儲(資料結構)

3.定義解析的方法

3.指令行互動模式

4.指派

5.翻頁

6.儲存

1.選取目标站點

目标站點分析

http://quotes.toscrape.com/:scrapy官方提供的抓取網站

顯示名人名言,作者,标簽等資訊

翻頁為最簡單的GET請求,通過改變URL的名稱進行翻頁

網頁結構簡單,沒有任何的反爬蟲措施

2.流程架構

抓取第一頁

請求第一頁的URL并得到源代碼,進行下一步的分析

擷取内容和下一頁連結

分析源代碼,提取首頁内容,擷取下一頁連結等待進一步擷取

翻頁提取

請求下一頁資訊,分析内容并請求再下一頁連結

儲存爬取結果

将爬取結果儲存為特定格式如文本,資料庫

3.爬蟲實戰

在指令行中輸入scrapy會輸出提示

建立項目

scrapy startproject quotetutorial
           

會在目前目錄生成項目檔案

cd quotetutorial 進入項目檔案夾

scrapy.cfg:配置檔案,定義scrapy一些相關的部署資訊

建立spider

scrapy genspider quotes quotes.toscrape.com
           

quotes:spider名稱

quotes.toscrape.com:需要爬取網站的域名

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

scrapy.cfg

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

items.py:儲存資料的資料結構

middlewares.py:在爬取過程中定義的中間件,用來處理request,response和exceptions等操作,可以在其中修改request,response和exceptions的相關配置

pipelines.py:項目管道,用來輸出一些items

settings.py:定義配置資訊

主要運作代碼在spiders檔案夾中

解析的操作在parse函數中

scrapy crawl quotes:執行spider

輸出調試資訊

info:提示資訊

scrapy.utils.log:顯示已啟動

2019-06-01 19:34:39 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: firstscrapy)

scrapy.crawler:settings

Overridden settings: {'BOT_NAME': 'firstscrapy', 'NEWSPIDER_MODULE': 'firstscrapy.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['firstscrapy.spiders']}

scrapy.middleware:中間件(下載下傳中間件:downloadermiddlewares;爬蟲中間件:spidermiddlewares)

INFO: Spider opened:調用spider,開始抓取

2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)

2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)

首先尋找robots.txt,沒有傳回狀态碼404,随後通路首頁正常為200

statscollectors:輸出爬取資訊

quotes.py

改寫代碼:parse:請求完成後預設調用的方法/預設回調

eg:

def parse(self, response):
        print(response.text)
           

請求成功後将response的内容列印出來

4.抓取:

1.分析源代碼

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

内容:text

作者:author

标簽:tags(tags數量不固定,有幾個抓幾個)

2.爬取中的存儲(資料結構)

items.py

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

定義field變量指派,作為一個整體生成

3.定義解析的方法

quotes.py

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰
Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

11:定義選擇每個區塊

之後周遊每個區塊,進一步篩選

13:聲明對象

::text:選擇标簽内的文本内容

extract_first():拿到裡面的文本内容

extract():把所有結果都找出來,類似于find和findall

3.指令行互動模式

scrapy shell quotes.toscrape.com
           

進入到互動模式下,可以進行一些相關的調試

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

爬取到的quotes為list格式,每一項為selector選擇器    

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

同為list

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

同為list,data類型為str

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

傳回清單,内容為文本

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

傳回第一個值

若為tags,就需要用extract()擷取所有的标簽

4.指派

item['text'] = text
item['author'] = author
item['tags'] = tags
yield item#将item生成出來
           

再次運作,即可完成單頁索引資訊的爬取

5.翻頁

1.可通過改變URL來完成翻頁

2.在next中對應着下一頁的超連結,從網頁代碼中擷取

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

提取:

next = response.css('.pager .next a::attr(href)').extract_first()
           

attr():擷取屬性的内容

補全為完整的URL:

url = response.urljoin(next)
           

urljoin():補全URL

生成request,實作翻頁循環:

url = response.urljoin(next)
           

callback:回調函數,定義response請求之後誰來處理

6.儲存

儲存為json格式

scrapy crawl quotes -o quotes.json
           

生成json檔案并儲存在項目目錄下

儲存為jl格式

scrapy crawl quotes -o quotes.jl
           

将結果儲存為一行一行的格式,一行為一個item

儲存為csv格式

scrapy crawl quotes -o quotes.csv
           

儲存為xml格式

scrapy crawl quotes -o quotes.xml
           

其他格式同改字尾即可,如pickle,marshal等

儲存至FTP伺服器

scrapy crawl quotes -o ftp://user:[email protected]/path/quotes.csv
           

pipelines

在儲存前需要做item的處理,如在解析完後有些item不是我們想要的,如要将item儲存到資料庫裡需要借助pipelines工具。

eg:限制名言的長度,如果大于50将後面的變為省略号

pipelines.py

class TextPipeline(object):

    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item['text']:
            if len(item['text']) > self.limit:
                item['text'] = item['text'][0:self.limit].rstrip() + '. . .'
        else:
            return DropItem('Missing Text')
           

儲存至MongoDB資料庫

pipelines中:

class MongoPipeline(object):

    def __init__(self):
        self.mongo_uri = 'localhost'
        self.mongo_db = 'quotestutorial'

    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 item

    def close_spider(self, spider):
        self.client.close()
           

settings.py中:

ITEM_PIPELINES = {
    'firstscrapy.pipelines.TextPipeline': 300,
    'firstscrapy.pipelines.MongoPipeline': 400,
}
           

儲存結果

Python爬蟲——Scrapy架構的基本使用1.選取目标站點2.流程架構3.爬蟲實戰

繼續閱讀