Python 百度搜索爬虫:使用 Requests 和 BeautifulSoup 抓取搜索结果
import requests
from bs4 import BeautifulSoup
import time
import tkinter as tk
import webbrowser
def crawl_baidu(keyword):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
url = f'https://www.baidu.com/s?wd={keyword}'
time.sleep(2) # 添加延迟
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
results = []
for result in soup.find_all('div', class_='result'):
result_url = result.find('a')['href']
results.append(result_url)
return results
def open_url(event):
index = result_text.index(tk.CURRENT)
tag_ranges = result_text.tag_ranges('link')
for tag_range in tag_ranges:
if result_text.compare(tag_range[0], '<=', index) and result_text.compare(index, '<', tag_range[1]):
url = result_text.get(tag_range[0], tag_range[1])
if url:
webbrowser.open(url)
break
def search():
keyword = entry.get()
search_results = crawl_baidu(keyword)
if len(search_results) > 0:
for index, url in enumerate(search_results, start=1):
result_text.insert(tk.END, f'{index}. {url}
', 'link')
result_text.tag_configure('link', foreground='blue', underline=True)
result_text.tag_add('link', f'{index}.0', f'{index}.end')
result_text.insert(tk.END, '
')
else:
result_text.insert(tk.END, '没有搜索结果
')
# 创建UI界面
window = tk.Tk()
window.title('百度搜索')
window.geometry('800x600')
label = tk.Label(window, text='请输入关键词:')
label.pack()
entry = tk.Entry(window)
entry.pack()
search_button = tk.Button(window, text='搜索', command=search)
search_button.pack()
result_text = tk.Text(window)
result_text.pack()
result_text.bind('<Button-1>', open_url)
window.mainloop()
这段代码实现了一个简单的百度搜索爬虫,它使用requests库发送 HTTP 请求获取百度搜索结果页面,然后使用BeautifulSoup库解析HTML代码,提取搜索结果的链接。此外,它还提供了一个基本的GUI界面,使用tkinter库创建,允许用户输入关键词并查看搜索结果。
功能说明:
crawl_baidu(keyword)函数负责抓取百度搜索结果。它使用requests库发送 HTTP 请求,并使用BeautifulSoup库解析 HTML 代码,提取搜索结果的链接。open_url(event)函数处理点击搜索结果链接的行为。它获取当前点击的文本位置,查找对应的链接,并使用webbrowser库打开链接。search()函数处理搜索操作。它获取用户输入的关键词,调用crawl_baidu(keyword)函数抓取搜索结果,并将结果显示在GUI界面上。- 主程序创建了一个
tkinter窗口,并添加了标签、输入框、按钮和文本框,用于显示搜索结果。
改进建议:
- 可以使用更复杂的爬虫策略,例如使用代理服务器、处理验证码等,以应对网站的反爬虫机制。
- 可以增加更多功能,例如显示搜索结果的标题和描述,支持分页浏览等。
- 可以使用其他GUI库,例如
PyQt或Kivy,创建更美观和功能更强大的界面。 - 可以将代码封装成类,提高代码的可读性和可维护性。
代码示例:
import requests
from bs4 import BeautifulSoup
import time
import tkinter as tk
import webbrowser
def crawl_baidu(keyword):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
url = f'https://www.baidu.com/s?wd={keyword}'
time.sleep(2) # 添加延迟
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
results = []
for result in soup.find_all('div', class_='result'):
result_url = result.find('a')['href']
results.append(result_url)
return results
def open_url(event):
index = result_text.index(tk.CURRENT)
tag_ranges = result_text.tag_ranges('link')
for tag_range in tag_ranges:
if result_text.compare(tag_range[0], '<=', index) and result_text.compare(index, '<', tag_range[1]):
url = result_text.get(tag_range[0], tag_range[1])
if url:
webbrowser.open(url)
break
def search():
keyword = entry.get()
search_results = crawl_baidu(keyword)
if len(search_results) > 0:
for index, url in enumerate(search_results, start=1):
result_text.insert(tk.END, f'{index}. {url}
', 'link')
result_text.tag_configure('link', foreground='blue', underline=True)
result_text.tag_add('link', f'{index}.0', f'{index}.end')
result_text.insert(tk.END, '
')
else:
result_text.insert(tk.END, '没有搜索结果
')
# 创建UI界面
window = tk.Tk()
window.title('百度搜索')
window.geometry('800x600')
label = tk.Label(window, text='请输入关键词:')
label.pack()
entry = tk.Entry(window)
entry.pack()
search_button = tk.Button(window, text='搜索', command=search)
search_button.pack()
result_text = tk.Text(window)
result_text.pack()
result_text.bind('<Button-1>', open_url)
window.mainloop()
原文地址: https://www.cveoy.top/t/topic/pRq 著作权归作者所有。请勿转载和采集!