许多实验需要匹配https://www.lipidmaps.org/这个网站中的INCHIKEY,查询搜索结果是否在,这里给出了一个一个自己写的爬虫小程序,无偿的分享给大家,希望大家能给点个赞和关注,文章末尾放出源码。
文章末尾的压缩包直接解压到D盘的根目录下即可使用。
使用说明:
因为这个程序需要提交的网站不是很稳定,大部分问题在解决查询回拨这一部分了,所以功能不是很完善
第一步:(这部分的名字不可以改变)在D盘下创建一个文件夹“PythonDemo”,从“PythonDemo”里创建一个子文件夹“lipidmaps”。
第二步:在这个文件夹下把你的只含有INCHIKEY的csv文件数据复制到文件夹“lipidmaps”
形如这个样子:
其中:标题头INCHIKET必须有,数据csv文件名字随便起,最好是英文+数字,这个只要自己区分就行。该文件夹下可以有多个的csv待搜索文件,你可以一份数据创建一个csv放在里面,程序自动匹配该文件夹下的所有CSV,等程序结束后及时移除匹配完成的数据,不然下次程序运行会再匹配一遍。
第三部:双击运行lipidmaps_submit.exe这个文件,刚开始运行界面如下:
会有提示运行哪一个文件,例如
若是INCHIKEY没有被lipidmaps 搜索到的会被打印出来:
(若是一直显示黑色没动,你点击一下黑色区域按一下回车)
只是给你展示程序正常的运行,会把在该网站出现下面没搜到的给打印出来并自动的生成一个同名的txt文件,如data_lipidmaps.txt,
这个txt包含两部分内容,一部分是正常的匹配没有在lipidmaps中搜到的,还有一部分就是因为网络波动(网页加载不出来)需要重新的搜索的,下面txt中展示的是csv里搜索不到的
若文件夹里出现下面这些这种情况,
1.把csv数据文件里的其他条目删除,只保留需要重新提交的这些内容,
2.把txt中“==Sever......匹配==”(含)之后的所有内容删除,
3.重新运行程序即可
也就是最终的txt里只有INCHIKEY
结果使用小技巧:
(前提是txt里没有需要重新提交的数据,把“”)
打开你对应的CSV数据文件,选择“数据”,“从文本/CSV”,选择对应的TXT文件,
新导入的数据就是没有匹配到的
将导入的数据与原来全部的数据复制到同一个工作表
在第二行如C2处插入公式=COUNTIF(A:A,B2),意思从A这一列里找到B2数据,有则显示1,没有则
是0,写好后双击右下角小方块即可
再筛选出全都是1的数据,在全部数据列标黄,这些就是在总数据中没有匹配到的
再点击筛选按钮选全部,就很容易的在全部数据中找到没有匹配到的数据
最后在附上源码,有什么不足或者希望更新的地方欢迎留言。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm
folder_path = r'D:\PythonDemo\lipidmaps'
urls = []
un_None_data = []
not_Found = []
for filename in os.listdir(folder_path):
if filename.endswith('.csv'):
file_path = os.path.join(folder_path, filename)
print('='*20,'Start Run ',file_path,'='*20)
file_name_without_extension = os.path.splitext(filename)[0]
data = pd.read_csv(file_path)
data = data.values
for i in data:
url = f'https://www.lipidmaps.org/quick_search?q={i[0]}'
urls.append(url)
def scrape_url(url):
try:
response = requests.get(url,headers=headers)
if response.status_code !=200:
print("500 Sever Error:", url)
un_None_data.append(url[41:])
soup = BeautifulSoup(response.text, 'html.parser')
# 找到搜索框元素
search_box = soup.find('div', class_='container mx-auto')
# print(search_box)
if search_box is not None:
not_Found.append(url[41:])
print('没有匹配到的')
print(url[41:])
# un_None_data.append(url[41:])
response.close()
except Exception as e:
print(f"连接错误:{str(e)}")
un_None_data.append(url[41:])
for i in tqdm(range(len(urls))):
scrape_url(urls[i])
txtname = file_name_without_extension+'.txt'
Txt_path = os.path.join(folder_path,txtname)
with open(Txt_path, 'a') as file:
for iteam in not_Found:
file.write(str(iteam)+'\n')
if len(un_None_data)>0:
file.write("==============Sever Error:从这个地方以后得数据都需要重新提交,因网络问题这些没匹配=============="+'\n')
print("==============Sever Error:从这个地方以后得数据都需要重新提交,因网络问题这些没匹配==============")
for iteam in un_None_data:
file.write(str(iteam)+'\n')
print(iteam)