scrapy+flask+html打造搜索引擎的示例代码

1. scrapy+flask+html打造搜索引擎的示例代码

本篇文章将介绍如何使用scrapy、flask和html构建一个简单的搜索引擎,实现爬取指定网站信息,并可通过flask展现出来。本文的示例代码可以在Github上找到,并且会分别介绍如何使用scrapy实现爬虫和如何使用flask搭建服务器进行展示。

2. Scrapy爬虫

Scrapy是一个开源的Python爬虫框架。它可以快速高效地抓取网站的信息,并提供了一个方便的API接口来处理抓取到的数据。接下来我们详细介绍如何使用Scrapy实现我们的爬虫。

2.1 安装Scrapy

在开始之前,我们需要首先安装Scrapy。在命令行中执行以下命令:

pip install scrapy

2.2 创建Scrapy项目

接下来我们将创建一个Scrapy项目,并定义需要爬取的站点,可以在Scrapy项目根目录下运行以下命令:

scrapy startproject myspider

这将在当前目录下创建一个`myspider`的Scrapy项目。

2.3 编写Scrapy爬虫

在创建Scrapy项目后,我们需要定义爬虫。Scrapy爬虫通常由两部分组成:第一部分是网站的URL地址,第二部分是要抓取的数据。我们需要将这些数据定义为Scrapy中的Item。

在`myspider/myspider/spiders`目录下创建一个Python文件,比如命名为`myfirstspider.py`。接下来我们编写爬取代码,下面是一个简单的例子:

import scrapy

class MyFirstSpider(scrapy.Spider):

name = 'myfirstspider'

allowed_domains = ['example.com']

start_urls = ['http://www.example.com/']

def parse(self, response):

# 解析代码

pass

以上代码定义了一个Scrapy爬虫,在这个爬虫中,我们定义了爬取`example.com`站点,并提供了一个`parse`方法来处理抓取的数据。

在这里,我们以抓取http://books.toscrape.com/为例。在`myfirstspider.py`中添加以下代码:

import scrapy

class BooksSpider(scrapy.Spider):

name = "books"

def start_requests(self):

urls = [

'http://books.toscrape.com/'

]

for url in urls:

yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):

for quote in response.css('article.product_pod'):

yield {

'title': quote.css('h3 > a::attr(title)').get(),

'price': quote.css('p.price_color::text').get(),

'description': quote.css('p::text').get(),

}

以上代码定义了一个爬虫,该爬虫将抓取指定URL中的书籍标题、价格和描述信息。其中,`start_requests()`方法会首先初始化要抓取的URL,然后将这些URL通过`parse()`方法处理。

2.4 运行Scrapy爬虫

在完成爬虫代码编写并保存后,我们需要在命令行中启动Scrapy爬虫。在`myspider`文件夹下,执行以下命令:

scrapy crawl books -o books.json

执行上述命令后,Scrapy将抓取BooksSpider爬虫中定义的网站的信息,并将抓取到的信息保存到当前目录下的`books.json`文件中。我们可以打开这个文件查看抓取到的数据。

3. Flask服务器

使用Scrapy已经抓取到了我们需要的数据,接下来我们需要将这些数据通过Flask构建一个Web应用,提供用户界面查询。

3.1 安装Flask

安装Flask可以通过以下代码在命令行中执行:

pip install flask

3.2 创建Flask服务器

在Flask中,我们需要创建一个Flask应用。在`myspider`文件夹下,创建一个名为`app.py`的文件,并在其中添加以下代码:

from flask import Flask, jsonify, render_template

from scrapy.crawler import CrawlerProcess

from scrapy.utils.project import get_project_settings

from myspider.myspider.spiders.myfirstspider import BooksSpider

app = Flask(__name__)

@app.route('/')

def home():

return render_template('index.html')

@app.route('/books')

def books():

process = CrawlerProcess(get_project_settings())

process.crawl(BooksSpider)

process.start()

with open('books.json') as f:

data = f.read()

return jsonify(data)

if __name__ == '__main__':

app.run(debug=True)

在以上代码中,我们首先导入了Flask的依赖包。接下来,我们创建了一个名为`app`的Flask应用,并定义路由。其中,`home`路由对应的是Flask应用的主页,`books`路由对应的是爬虫抓取到的信息。

在`books`路由中,我们首先定义好Scrapy的配置信息,然后通过在命令行中执行相应Scrapy爬虫,获取抓取到的数据。接下来,我们将读取到的结果通过`jsonify`方法返回,以便Flask将结果呈现给客户端。

3.3 创建模板

在Flask中,我们还需要创建模板,并将数据渲染进模板中。在`templates`目录下创建一个名为`index.html`的模板,然后添加以下代码:

{% extends 'base.html' %}

{% block title %}Books{% endblock %}

{% block content %}

<h1>Books</h1>

<ul id="books"></ul>

<script>

fetch('/books')

.then(response => response.json())

.then(data => {

let booksElement = document.querySelector('#books');

let books = JSON.parse(data);

books.forEach(book => {

let li = document.createElement('li');

li.innerHTML = `<h2>${book.title}</h2><p>${book.description}</p><p>Price: ${book.price}</p>`;

booksElement.appendChild(li);

});

});

</script>

{% endblock %}

以上代码定义了HTML模板,其中包含了JavaScript代码,用于将后端返回的数据呈现给用户。

4. 完整的搜索引擎代码

上述是本搜索引擎的核心代码,但是还有其他代码组成了完整的搜索引擎。这些代码包括了Scrapy的配置信息、Flask的依赖文件等。可以在上述给出的Github仓库中查看。

至此,我们已经介绍了如何使用Scrapy、Flask和HTML构建一个简单的搜索引擎。在实际使用中,我们可以修改Scrapy爬虫的代码来针对不同的网站进行爬取,并使用Flask来将抓取到的数据呈现在Web页面中,为用户提供更好的搜索体验。

后端开发标签