web_search/README.md
2024-12-19 11:32:54 +08:00

289 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目说明文档
## 目录
1. [util\_old.py](#util_oldpy)
2. [utils.py](#utilspy)
3. [search\_ui.py](#search_uipy)
4. [main.py](#mainpy)
5. [search\_plus.py](#search_pluspy)
6. [search\_queries.py](#search_queriespy)
7. [search\_ui\_v2.py](#search_ui_v2py)
---
## 1. `util_old.py` <a name="util_oldpy"></a>
该文件包含一些用于网络爬取、文件处理和数据保存的实用函数。
### 主要功能
1. **`fetch_documents(ip_address, dataset_id, api_key)`**:
- 从指定的 API 端点获取文档数据。
- 使用 `requests` 库发送 HTTP GET 请求。
- 处理 HTTP 错误和其它异常。
- 返回 JSON 格式的响应数据。
2. **`is_file(url)`**:
- 检查给定的 URL 是否指向一个文件(基于文件扩展名)。
- 使用预定义的文件扩展名集合 `file_extensions` 进行判断。
3. **`is_webpage(url)`**:
- 检查给定的 URL 是否指向一个网页。
- 通过检查 `Content-Type` 头是否包含 `text/html` 来判断。
4. **`can_crawl_webpage(url)`**:
- 判断一个网页是否适合爬取。
- 使用 `BeautifulSoup` 解析网页内容。
- 检查否存在大量 JavaScript 代码、页面内容是否主要是乱码或图片、以及是否存在 `meta robots` 标签阻止爬取。
- 使用 `langdetect` 库检测页面语言是否为中文。
5. **`is_cosmetic_related(snippet)`**:
- 检查给定的文本片段是否与化妆品相关。
- 使用预定义的关键词列表进行判断。
6. **`parse_search(result)`**:
- 解析搜索结果,判断链接类型(文件、网页或未知类型)。
- 根据链接类型返回相应的描述字符串。
7. **`save_webpage_content(url, engine, search_id, output_dir, pool)`**:
- 保存网页内容到本地文件,并将相关信息记录到数据库。
- 使用 `BeautifulSoup` 提取网页文本内容。
- 检查网页是否已保存,避免重复保存。
8. **`download_file(url, engine, search_id, output_dir, pool)`**:
- 下载文件到本地,并将相关信息记录到数据库。
- 检查文件是否已下载,避免重复下载。
9. **`save_non_crawlable(url, engine, search_id, pool)`**:
- 将无法爬取的链接保存到数据库的黑名单中。
- 避免重复保存。
10. **`get_blacklist(pool)`**:
- 从数据库中获取黑名单列表。
11. **`libreoffice_to_pdf(file_path, output_dir)`**:
- 使用 LibreOffice 将文件转换为 PDF 格式。
- 处理文件不存在和转换失败的情况。
12. **`pdf_to_images(pdf_path, output_dir)`**:
- 将 PDF 文件逐页转换为图像。
- 使用 `pdf2image` 库进行转换。
- 强制清理每页处理后的内存。
13. **`process_files(base_dir)`**:
- 遍历指定目录下的所有文件,处理 PPT/PPTX、XLS/XLSX、DOC/DOCX 和 PDF 文件。
- 将这些文件转换为 PDF 格式,并将 PDF 文件转换为图像。
### 依赖库
- `bs4` (BeautifulSoup4)
- `os`
- `gc`
- `requests`
- `langdetect`
- `langchain_core`
- `langchain.text_splitter`
- `pdf2image`
- `typing`
---
## 2. `utils.py` <a name="utilspy"></a>
该文件包含一些用于判断 URL 类型和内容是否相关的实用函数。
### 主要功能
1. **`is_file(url)`**:
- 检查给定的 URL 是否指向一个文件(基于文件扩展名)。
- 使用预定义的文件扩展名集合 `file_extensions` 进行判断。
2. **`is_webpage(url)`**:
- 检查给定的 URL 是否指向一个网页。
- 通过检查 `Content-Type` 头是否包含 `text/html` 来判断。
3. **`can_crawl_webpage(url)`**:
- 判断一个网页是否适合爬取。
- 使用 `BeautifulSoup` 解析网页内容。
- 检查是否存在 `meta robots` 标签阻止爬取。
4. **`is_cosmetic_related(snippet)`**:
- 检查给定的文本片段是否与化妆品相关。
- 使用预定义的关键词列表进行判断。
5. **`parse_search(result)`**:
- 解析搜索结果,判断链接类型(文件、网页或未知类型)。
- 根据链接类型返回相应的描述字符串。
### 依赖库
- `bs4` (BeautifulSoup4)
- `requests`
---
## 3. `search_ui.py` <a name="search_uipy"></a>
该文件使用 Gradio 库创建一个 Web UI用于执行多搜索引擎聚合搜索。
### 主要功能
1. **`SearchUI` 类**:
- `__init__`: 初始化 API 密钥。
- `parse_google_results(results)`: 解析 Google 搜索结果,提取标题、链接、摘要和位置信息。
- `parse_bing_results(results)`: 解析 Bing 搜索结果,提取标题、链接、摘要和位置信息。
- `parse_baidu_results(results)`: 解析百度搜索结果,提取标题、链接、摘要和位置信息,并处理百度特有的 `answer_box`
- `format_results(results)`: 将解析后的搜索结果格式化为 Markdown 文本。
- `search_all_engines(query)`: 在 Google、Bing 和 Baidu 三个搜索引擎中执行搜索,并返回格式化后的结果。
2. **`create_ui()` 函数**:
- 创建 `SearchUI` 实例。
- 定义自义 CSS 样式,用于美化 UI。
- 使用 Gradio 创建 Web UI包括搜索输入框、搜索按钮、加载动画和搜索结果展示区域。
- 定义搜索事件处理函数,用于在搜索时显示加载动画,并在搜索完成后更新搜索结果。
### 依赖库
- `gradio`
- `json`
- `typing`
- `requests`
---
## 4. `main.py` <a name="mainpy"></a>
该文件使用 FastAPI 创建一个 API用于处理搜索请求和批量搜索请求。
### 主要功能
1. **数据库连接配置**:
- 定义数据库连接参数。
2. **API 端点**:
- `/search/`: 接收单个搜索请求,并返回搜索结果。
- `/batch_search/`: 接收批量搜索请求,并返回搜索结果。
3. **数据模型**:
- `SearchRequest`: 定义单个搜索请求的数据模型。
- `SearchResult`: 定义单个搜索结果的数据模型。
- `BatchSearchRequest`: 定义批量搜索请求的数据模型。
- `SearchResultItem`: 定义批量搜索结果中单个搜索结果的数据模型。
- `BatchSearchResponse`: 定义批量搜索响应的数据模型。
4. **`fetch_all_content(query)`**:
- 从数据库中获取与查询相关的已保存网页内容。
5. **`save_user_query(query, result_count)`**:
- 将用户查询记录保存到数据。
6. **`search(request)`**:
- 接收单个搜索请求,首先尝试从数据库获取结果,如果数据库中没有结果,则调用 `search_plus` 模块进行搜索。
- 保存用户查询记录。
7. **`batch_search(request)`**:
- 接收批量搜索请求,并使用 SerpAPI 在 Google、Bing 和 Baidu 中执行搜索。
- 返回包含所有搜索结果的响应。
### 依赖库
- `fastapi`
- `pydantic`
- `aiomysql`
- `requests`
- `search_plus`
- `datetime`
- `json`
---
## 5. `search_plus.py` <a name="search_pluspy"></a>
该文件包含用于执行搜索并将结果保存到数据库的函数。
### 主要功能
1. **数据库连接配置**:
- 定义数据库连接参数。
2. **`search_and_save(query)`**:
- 在 Google、Bing 和 Baidu 三个搜索引擎中执行搜索。
- 将搜索结果以 JSON 字符串的形式保存到数据库的 `web_search_results` 表中。
3. **`main(queries)`**:
- 接收一个查询列表,并对每个查询调用 `search_and_save` 函数。
### 依赖库
- `fastapi`
- `pydantic`
- `databases`
- `requests`
- `json`
- `datetime`
---
## 6. `search_queries.py` <a name="search_queriespy"></a>
该文件用于定时执行搜索任务。
### 主要功能
- **定时执行**:
- 该脚本配置为通过 Ubuntu 系统的定时任务 (crontab) 在每周日 0 点定时执行。它从数据库中读取预定义的查询列表,并使用 `search_plus.py` 中的 `main` 函数执行搜索,并将结果保存到数据库。 **设置方法见下文 "Crontab 设置说明" 部分。**
### 依赖库
- `aiomysql`
- `search_plus`
- `datetime`
---
## Crontab 设置说明
1. **打开 crontab 编辑器:** 使用命令 `crontab -e` 打开 crontab 编辑器。 如果这是你第一次使用 crontab系统会询问你使用哪个编辑器 (例如 vim 或 nano)。
2. **添加定时任务:** 在编辑器中添加以下一行,以在每周日 0 点执行 `search_queries.py` 脚本:
```bash
0 0 * * 0 /usr/bin/python3 /path/to/your/search_queries.py # 请替换 /path/to/your/ 为你的脚本实际路径 ```
* `0 0 * * 0`: 表示每天的 0 分 0 秒,每周日执行 (0 代表星期日)。 你可以根据需要修改这个时间表达式。 更多关于 crontab 时间表达式的资料,请参考 `man 5 crontab`
* `/usr/bin/python3`: 指定 Python3 解释器。 如果你的 Python3 解释器不在这个路径,请修改为正确的路径。
* `/path/to/your/search_queries.py`: 替换为 `search_queries.py` 脚本的完整路径。
3. **保存并退出:** 保存 crontab 文件并退出编辑器。
4. **查看 crontab 设置:** 使用命令 `crontab -l` 查看当前已设置的 crontab 任务。 你应该能够看到你刚刚添加的那一行。
5. **验证定时任务:** 为了验证定时任务是否正确设置,你可以尝试在 `search_queries.py` 脚本中添加日志记录功能,例如使用 `logging` 模块记录执行时间和相关信息。 然后,你可以等待到下一个星期日 0 点,查看日志文件,确认脚本是否被正确执行。 如果脚本没有执行请检查脚本路径、Python 解释器路径以及 crontab 时间表达式是否正确。 你也可以使用 `tail -f /path/to/your/logfile` 实时监控日志文件。
---
## 7. `search_ui_v2.py` <a name="search_ui_v2py"></a>
该文件使用 Gradio 库创建一个 Web UI用于执行多搜索引擎聚合搜索并提供更高级的功能。
### 主要功能
1. **`SearchUI` 类**:
- `__init__`: 初始化 API 密钥。
- `parse_google_results(results)`: 解析 Google 搜索结果,提取标题、链接、摘要和位置信息。
- `parse_bing_results(results)`: 解析 Bing 搜索结果,提取标题、链接、摘要和位置信息。
- `parse_baidu_results(results)`: 解析百度搜索结果,提取标题、链接、摘要和位置信息,并处理百度特有的 `answer_box`
- `format_results(results)`: 将解析后的搜索结果格式化为 Markdown 文本。
- `search_all_engines(query)`: 在 Google、Bing 和 Baidu 三个搜索引擎中执行搜索,并返回格式化后的结果。
- `save_search_results(query, results)`: 将搜索结果保存到数据库。
2. **`create_ui()` 函数**:
- 创建 `SearchUI` 实例。
- 定义自义 CSS 样式,用于美化 UI。
- 使用 Gradio 创建 Web UI包括搜索输入框、搜索按钮、加载动画、搜索结果展示区域和保存搜索结果的选项。
- 定义搜索事件处理函数,用于在搜索时显示加载动画,并在搜索完成后更新搜索结果。
- 定义保存搜索结果的事件处理函数,用于将搜索结果保存到数据库。
### 界面结构
1. **标题:** 显示"九鑫多搜索引擎聚合搜索"。
2. **搜索输入框:** 一个文本框,用于输入搜索关键词。
3. **搜索按钮:** 一个按钮,点击后开始搜索。
4. **加载动画:** 搜索过程中显示一个GIF动画提示用户正在等待结果。搜索完成后自动隐藏。
5. **搜索结果展示区域:** 分为三个部分分别显示Google、Bing和百度搜索结果。每个部分都以HTML卡片的形式展示搜索结果包含标题、链接和摘要。点击卡片中的链接会在新标签页打开搜索结果页面。每个搜索引擎的结果区域都有各自的边框颜色方便区分。
### 操作方法
1. **输入关键词:** 在搜索输入框中输入你想要搜索的内容。
2. **点击搜索:** 点击"搜索"按钮。此时加载动画会显示。
3. **查看结果:** 搜索完成后加载动画会消失Google、Bing和百度的搜索结果会分别显示在各自的区域内。每个搜索结果以卡片形式呈现点击卡片即可打开对应的链接。
### 功能说明
该UI使用SerpAPI接口在Google、Bing和百度三个搜索引擎上进行搜索。它会解析搜索结果并以用户友好的方式展示。界面使用了自定义CSS样式使界面更美观易用。程序还包含错误处理机制如果搜索过程中出现错误会显示相应的错误信息。
总而言之,这是一个功能完善、界面友好的多搜索引擎聚合搜索工具。用户只需输入关键词并点击搜索按钮,即可快速获得来自三个不同搜索引擎的搜索结果。
### 依赖库
- `gradio`
- `json`
- `typing`
- `requests`
- `aiomysql`