转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]
Research.com是一个可以搜索学术会议网站的影响因子的网站。
好用是好用,但有一个缺点:得手动选择类目。有这么多类目,一个个手动选也太累了。
所以做了一个自动搜索的小工具,效果如图:
当然也是开源的,放到了这里:GitHub - 1061700625/small_tools_v2: 使用tkinter和Python制作的小工具集,非常方便自己扩展
这里也放一波源码,但不一定会常来更新,更新的还是放到上面的github去了:
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import threading
import tkinter as tk
import tkinter.messagebox as msgbox
import tkinter.ttk as ttk
import tkinter.simpledialog as simpledialog
def search(keyword):
filterDisciplines = [
'animal-science-and-veterinary',
'biology-and-biochemistry',
'business-and-management',
'chemistry',
'computer-science',
'earth-science',
'ecology-and-evolution',
'economics-and-finance',
'electronics-and-electrical-engineering',
'environmental-sciences',
'genetics-and-molecular-biology',
'immunology',
'law-and-political-science',
'materials-science',
'mathematics',
'mechanical-and-aerospace-engineering',
'medicine',
'microbiology',
'neuroscience',
'physics',
'plant-science-and-agronomy',
'psychology',
'social-sciences-and-humanities',
]
results = []
for target in tqdm(filterDisciplines, desc='挨个搜索中...', ncols=60):
url = 'https://research.com/conference-rankings/' + target
headers = {
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82',
}
data = {"searchQuery": keyword}
soup = BeautifulSoup(requests.post(url, json=data, headers=headers).text, 'lxml')
conference_items = soup.find_all('div', class_='conference-item')
if not conference_items:
continue
for item in conference_items:
rank = item.find(class_='position').getText().replace('Rank', '').strip()
score = item.find(class_='rankings-info').getText().strip()
url = item.find('a').get('href').strip()
title = item.find('a').getText().strip()
results.append((rank, title, score, url))
break
print('排名\t名称\t\t影响因子\t链接')
for rank, title, score, url in results:
print(f'{rank}\t{title}\t{score}\t{url}')
return results
def on_button_click():
processing = False
def perform_search(keyword):
nonlocal processing
processing = True
button.config(text="搜索中...", state=tk.DISABLED)
# Clear the output list before performing the search
output_listbox.delete(*output_listbox.get_children())
if keyword is not None and len(keyword.strip()) > 0:
keyword = keyword.strip()
for rank, title, score, url in search(keyword):
output_listbox.insert("", "end", values=(rank, title, score, url))
processing = False
button.config(text="开始搜索", state=tk.NORMAL)
if not processing:
keyword = input_entry.get()
if not keyword.strip():
msgbox.showinfo("Warning", "请先输入搜索词")
else:
t = threading.Thread(target=perform_search, args=[keyword,], daemon=True)
t.start()
def on_treeview_double_click(event):
item = output_listbox.selection()
if item:
selected_item = output_listbox.item(item, "values")
if selected_item:
link = selected_item[3]
root.clipboard_clear()
root.clipboard_append(link)
msgbox.showinfo("Copy", f"Link copied: {link}")
# 粗糙版本,请勿模仿
root = None
output_listbox = None
input_entry = None
button = None
def process():
global root, output_listbox, input_entry, button
root = tk.Tk()
root.title("Research-er")
# Calculate the center position of the screen
window_width = 400
window_height = 300
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x_position = (screen_width - window_width) // 2
y_position = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}")
input_entry = tk.Entry(root)
input_entry.pack(pady=10)
button = tk.Button(root, text="开始搜索", command=on_button_click)
button.pack()
columns = ("Rank", "Name", "Impact Factor", "Link")
output_listbox = ttk.Treeview(root, columns=columns, show="headings")
for col in columns:
output_listbox.heading(col, text=col)
output_listbox.column(col, width=100, anchor="center")
output_listbox.pack(pady=10, fill=tk.BOTH, expand=True)
# Add horizontal and vertical scrollbars to the output listbox
h_scrollbar = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=output_listbox.xview)
v_scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=output_listbox.yview)
output_listbox.configure(xscrollcommand=h_scrollbar.set, yscrollcommand=v_scrollbar.set)
h_scrollbar.pack(fill=tk.X, side=tk.BOTTOM)
v_scrollbar.pack(fill=tk.Y, side=tk.RIGHT)
output_listbox.bind("<Double-Button-1>", on_treeview_double_click)
root.mainloop()
if __name__ == '__main__':
process()