如何用 Scrapy 爬取網站資料並在 Easysearch 中進行儲存檢索分析

极限实验室發表於2024-09-12

做過資料分析和爬蟲程式的小夥伴想必對 Scrapy 這個爬蟲框架已經很熟悉了。今天給大家介紹下,如何基於 Scrapy 快速編寫一個爬蟲程式並利用 Easysearch 儲存、檢索、分析爬取的資料。我們以極限科技的官網 Blog 為資料來源,做下實操演示。

安裝 scrapy

使用 Scrapy 可以快速構建一個爬蟲專案,從目標網站中獲取所需的資料,並進行後續的處理和分析。

pip install scrapy

# 新建專案 infini_spiders
scrapy startproject infini_spiders

# 初始化爬蟲
cd infini_spiders/spiders
scrapy genspider blog infinilabs.cn

爬蟲編寫

編寫一個爬蟲檔案 blog.py ,它會首先訪問 start_urls 指定的地址,將結果發給 parse 函式解析。透過這一步解析,我們得到了每一篇部落格的地址。然後我們對每個部落格的地址傳送請求,將結果發給 parse_blog 函式進行解析,在這裡才會真正提取每篇部落格的 title、tag、url、date、content 內容。

from typing import Any, Iterable
import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Response

class BlogSpider(scrapy.Spider):
    name = "blog"
    allowed_domains = ["infinilabs.cn"]
    start_urls = ["https://infinilabs.cn/blog/"]

    def parse(self, response):
        links = response.css("div.blogs a")
        yield from response.follow_all(links, self.parse_blog)

    def parse_blog(self, response):
        title = response.xpath('//div[@class="title"]/text()').extract_first()
        tags = response.xpath('//div[@class="tags"]/div[@class="tag"]/text()').extract()
        url = response.url
        author = response.xpath('//div[@class="logo"]/div[@class="name"]//text()').extract_first()
        date = response.xpath('//div[@class="date"]/text()').extract_first()
        all_text = response.xpath('//p//text() | //h3/text() | //h2/text() | //h4/text() | //ol/li//text()').extract()
        content = '\n'.join(all_text)

        yield {
            'title': title,
            'tags': tags,
            'url': url,
            'author': author,
            'date': date,
            'content': content
        }

提取完我們想要的內容後,接下來就要考慮儲存了。考慮到要對內容進行檢索、分析,接下來我們將內容直接存放到 Easysearch 當中。

安裝外掛

透過安裝 ScrapyElasticsearch pipeline 可將 scrapy 爬取的內容存入到 Easysearch 中。

pip install ScrapyElasticSearch

修改 scrapy 自帶的配置檔案 settings.py ,新增以下內容。

ITEM_PIPELINES = {
    'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 10
}

ELASTICSEARCH_SERVERS = ['http://192.168.56.3:9210']
ELASTICSEARCH_INDEX = 'scrapy'
ELASTICSEARCH_INDEX_DATE_FORMAT = '%Y-%m-%d'
ELASTICSEARCH_TYPE = '_doc'
ELASTICSEARCH_USERNAME = 'admin'
ELASTICSEARCH_PASSWORD = '9423d1d5345ed6d0db19'

ScrapyElasticSearch 會以 bulk 方式寫入 Easysearch,每次批次的大小由 scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline 引數控制,大家可自行修改。

在上述配置中,我們會將爬到的資料存放到 scrapy-yyyy-mm-dd 索引中。

啟動爬蟲

在 infini_spiders/spiders 目錄下,使用命令啟動爬蟲。

scrapy crawl blog

blog 就是爬蟲的名字,對應到 blog.py 裡面的 name 變數。執行完成後,就可以去 Easysearch 裡檢視資料了,當然我們還是使用 Console 進行檢視。

檢視資料

先檢視下索引情況,scrapy 索引已經生成,裡面有 129 篇部落格。

檢視詳細內容,確保部落格正文已經儲存。

到了這一步,我們就能使用 Console 對部落格進行搜尋、分析了。

這次的分享就到這裡了。歡迎與我一起交流 ES 的各種問題和解決方案。

相關文章