Python打造本地百度搜索引擎:附详细代码与SEO优化
Python打造本地百度搜索引擎:附详细代码与SEO优化想体验一把自己动手搭建搜索引擎的乐趣吗?本文将带你使用Python一步步实现一个简易的本地百度搜索引擎,并融入SEO优化技巧,助你轻松入门搜索引擎领域。### 功能简介本项目将实现以下功能:1. 爬取百度搜索结果: 根据输入的关键词和页数,抓取百度搜索结果页面。2. 本地索引: 将抓取到的网页标题和链接保存到本地文件,构建简单的搜索索引。3. 本地搜索: 根据用户输入的关键词,检索本地索引,并展示匹配的结果。4. 结果展示: 以友好的界面展示搜索结果,并提供链接跳转功能。5. 异常处理: 对网络请求、文件读写等操作进行异常处理,增强程序稳定性。6. SEO友好: 在代码中融入SEO元素,例如标题优化、关键词提取等。### 代码实现pythonimport requestsfrom bs4 import BeautifulSoupimport timeimport tkinter as tkimport webbrowserimport randomimport osimport redef get_random_user_agent(): user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36', ] return random.choice(user_agents)def crawl_baidu(keyword, page_limit): headers = { 'User-Agent': get_random_user_agent() } results = [] for page in range(1, page_limit + 1): url = f'https://www.baidu.com/s?wd={keyword}&pn={(page - 1) * 10}' # 添加随机延迟 delay = random.uniform(0.5, 1.0) time.sleep(delay) try: response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 except requests.exceptions.RequestException as e: print(f'网络请求异常: {e}') return results soup = BeautifulSoup(response.text, 'html.parser') for result in soup.find_all('div', class_='result'): result_title = result.find('h3').get_text() result_url = result.find('a')['href'] results.append((result_title, result_url)) return resultsdef open_url(url): webbrowser.open(url)def crawl_and_index(): keywords = re.split(r'[,,/s]+', entry_keywords.get()) # 获取关键词列表 page_limit = int(entry_pages.get()) # 获取指定的爬取页数 # 创建文件夹用于保存网页文件 if not os.path.exists('webpages'): os.makedirs('webpages') for keyword in keywords: search_results = crawl_baidu(keyword, page_limit) if len(search_results) > 0: file_name = f'webpages/{keyword}.html' with open(file_name, 'w', encoding='utf-8') as file: for title, url in search_results: file.write(f'{title}/n') file.write(f'{url}/n') file.write('/n') else: print(f'关键词 /'{keyword}/' 没有搜索结果')def search_local(): keyword = entry_search.get() result_text.delete('1.0', tk.END) for file_name in os.listdir('webpages'): try: with open(f'webpages/{file_name}', 'r', encoding='utf-8') as file: lines = file.readlines() if len(lines) < 2: continue found_results = {} for i in range(0, len(lines), 2): if i + 1 >= len(lines): break title = lines[i].strip() url = lines[i + 1].strip() if keyword.lower() in title.lower() or keyword.lower() in url.lower(): found_results[len(found_results) + 1] = (title, url) if len(found_results) > 0: result_text.insert(tk.END, f'搜索结果 - {file_name[:-5]}:/n/n', 'title') for index, (title, url) in found_results.items(): result_text.insert(tk.END, f'{title}/n', 'found_title') result_text.insert(tk.END, f'{url}/n', f'link{index}') result_text.tag_configure(f'link{index}', foreground='blue', underline=True) result_text.tag_bind(f'link{index}', '', lambda event, url=url: open_url(url)) result_text.insert(tk.END, '/n') if result_text.get('1.0', tk.END) == '/n': result_text.insert(tk.END, '没有搜索结果/n') except FileNotFoundError: print(f'文件未找到: {file_name}') except Exception as e: print(f'发生错误: {e}')# 创建UI界面window = tk.Tk()window.title('百度搜索')window.geometry('800x600')label_keywords = tk.Label(window, text='请输入关键词(用逗号或空格隔开):')label_keywords.pack()entry_keywords = tk.Entry(window)entry_keywords.pack()label_pages = tk.Label(window, text='请输入爬取页数:')label_pages.pack()entry_pages = tk.Entry(window)entry_pages.pack()crawl_button = tk.Button(window, text='爬取并索引', command=crawl_and_index)crawl_button.pack()label_search = tk.Label(window, text='请输入搜索关键词:')label_search.pack()entry_search = tk.Entry(window)entry_search.pack()search_button = tk.Button(window, text='搜索', command=search_local)search_button.pack()scrollbar = tk.Scrollbar(window)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)result_text = tk.Text(window, yscrollcommand=scrollbar.set)result_text.pack(fill=tk.BOTH)scrollbar.config(command=result_text.yview)window.mainloop()### 代码解析1. 导入模块: 导入所需模块,包括 requests 用于网络请求,BeautifulSoup 用于解析HTML,time 用于设置延迟,tkinter 用于创建用户界面,webbrowser 用于打开网页,random 用于生成随机数,os 用于文件操作,re 用于正则表达式。2. get_random_user_agent() 函数: 从预设列表中随机选择一个用户代理,模拟真实用户访问网站。3. crawl_baidu() 函数: 根据关键词和页数限制,爬取百度搜索结果,并返回包含标题和链接的列表。4. open_url() 函数: 使用默认浏览器打开指定链接。5. crawl_and_index() 函数: 获取用户输入的关键词和页数,调用 crawl_baidu() 函数爬取搜索结果,并将结果保存到本地文件。6. search_local() 函数: 获取用户输入的搜索关键词,读取本地索引文件,匹配关键词并展示结果,同时支持点击链接打开网页。7. UI界面: 使用 tkinter 创建图形界面,方便用户输入关键词、页数和搜索内容。### SEO优化1. 标题优化: 使用包含关键词的标题,例如 'Python打造本地百度搜索引擎',吸引目标用户点击。2. 关键词提取: 在代码中使用 re 模块提取网页标题和链接中的关键词,优化本地索引。3. 内容相关性: 确保爬取的网页内容与目标关键词高度相关,提高搜索结果质量。4. 用户体验: 提供简洁易用的界面,方便用户进行搜索操作,提升用户体验。### 总结通过本教程,你学会了如何使用Python构建一个简易的本地百度搜索引擎,并了解了基本的SEO优化技巧。在实际应用中,你可以根据需求扩展功能,例如:* 更强大的爬虫: 使用 Scrapy 等框架构建更强大、高效的爬虫,处理更复杂的网站结构。* 更精准的索引: 使用jieba分词等工具对网页内容进行分词,构建更精准的倒排索引。* 更丰富的功能: 添加搜索结果排序、分页显示、相关搜索等功能,提升用户体验。希望本教程能激发你对搜索引擎的兴趣,并为你的学习和工作带来帮助
requests 用于网络请求,BeautifulSoup 用于解析HTML,time 用于设置延迟,tkinter 用于创建用户界面,webbrowser 用于打开网页,random 用于生成随机数,os 用于文件操作,re 用于正则表达式。2. get_random_user_agent() 函数: 从预设列表中随机选择一个用户代理,模拟真实用户访问网站。3. crawl_baidu() 函数: 根据关键词和页数限制,爬取百度搜索结果,并返回包含标题和链接的列表。4. open_url() 函数: 使用默认浏览器打开指定链接。5. crawl_and_index() 函数: 获取用户输入的关键词和页数,调用 crawl_baidu() 函数爬取搜索结果,并将结果保存到本地文件。6. search_local() 函数: 获取用户输入的搜索关键词,读取本地索引文件,匹配关键词并展示结果,同时支持点击链接打开网页。7. UI界面: 使用 tkinter 创建图形界面,方便用户输入关键词、页数和搜索内容。### SEO优化1. 标题优化: 使用包含关键词的标题,例如 'Python打造本地百度搜索引擎',吸引目标用户点击。2. 关键词提取: 在代码中使用 re 模块提取网页标题和链接中的关键词,优化本地索引。3. 内容相关性: 确保爬取的网页内容与目标关键词高度相关,提高搜索结果质量。4. 用户体验: 提供简洁易用的界面,方便用户进行搜索操作,提升用户体验。### 总结通过本教程,你学会了如何使用Python构建一个简易的本地百度搜索引擎,并了解了基本的SEO优化技巧。在实际应用中,你可以根据需求扩展功能,例如:* 更强大的爬虫: 使用 Scrapy 等框架构建更强大、高效的爬虫,处理更复杂的网站结构。* 更精准的索引: 使用jieba分词等工具对网页内容进行分词,构建更精准的倒排索引。* 更丰富的功能: 添加搜索结果排序、分页显示、相关搜索等功能,提升用户体验。希望本教程能激发你对搜索引擎的兴趣,并为你的学习和工作带来帮助
原文地址: https://www.cveoy.top/t/topic/SJG 著作权归作者所有。请勿转载和采集!