做過資料分析和爬蟲程式的小夥伴想必對 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 的各種問題和解決方案。