【工具】自动搜索Research网站的学术会议排名

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

Research.com是一个可以搜索学术会议网站的影响因子的网站。

好用是好用,但有一个缺点:得手动选择类目。有这么多类目,一个个手动选也太累了。

所以做了一个自动搜索的小工具,效果如图:

当然也是开源的,放到了这里:GitHub - 1061700625/small_tools_v2: 使用tkinter和Python制作的小工具集,非常方便自己扩展

这里也放一波源码,但不一定会常来更新,更新的还是放到上面的github去了:

代码语言:javascript
复制
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()