爬取化学反应数据库(反应物,生成物,催化剂)
-*- coding: utf-8 -*-
import time
import xlwt
import webbrowser
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
#目标页数
total_pages = 1
num = 0 # 用于计数目前爬取的数量
web = Chrome()
# 如果页面中出现了iframe怎么办
web.get("http://www.organchem.csdb.cn/scdb/main/crc_introduce.asp")
web.find_element_by_xpath('/html/body/table/tbody/tr[1]/td[2]/table/tbody/tr[3]/td/input').send_keys("lah")
time.sleep(1)
web.find_element_by_xpath('/html/body/table/tbody/tr[1]/td[2]/table/tbody/tr[4]/td/input').send_keys("Lah5695211",
Keys.ENTER)
time.sleep(1)
web.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[3]/table/tbody/tr[2]/td/div[1]/a').click()
time.sleep(1)
# 输入催化剂种类
web.find_element_by_xpath('/html/body/form/table[1]/tbody[2]/tr[5]/td[2]/input').send_keys("Pd(OAc)2", Keys.ENTER)
workbook = xlwt.Workbook()
# 创建工作表worksheet,填入表名
worksheet = workbook.add_sheet('催化剂爬取')
worksheet.write(0, 0, '反应物')
worksheet.write(0, 1, '生成物')
worksheet.write(0, 2, '催化剂')
for page in range(total_pages):
for i in range(10):#也就是图page1的十个化学反应
try:
web.find_element_by_xpath(f'/html/body/form[1]/table/tbody/tr[{i + 3}]/td[3]/a').click()#见下方图一
# web.refresh()
obj_in = web.find_element_by_xpath('/html/body/font/table[1]/tbody/tr[1]/td[2]').text#爬取反应物
obj_out = web.find_element_by_xpath('/html/body/font/table[1]/tbody/tr[2]/td[2]').text#爬取生成物
obj_in = obj_in.split(' ')[0] # 反应物,因为上一步获取的数据带有其他不需要的信息,只要提取第0个元素就可以了
obj_out = obj_out.split(' ')[0] # 生成物,同上
print(obj_in)
print(obj_out)
# 坑1下面两句用于进入iframe,此处要进入iframe才可以操作,不然会报错!
xpath = web.find_element_by_xpath('/html/body/font/table[2]/tbody/tr/td/iframe')#定位iframe
web.switch_to.frame(xpath)#进入iframe
# t1 = web.find_element_by_xpath('/html/body/table/tbody/tr[1]/td[2]/table/tbody/tr').text#这句没用,可以删除,,
lis = web.find_elements_by_xpath('/html/body/table/tbody/tr')#找到表格
chj_lists = []#用于存储爬取到的催化剂,具体见图chj_lists
for li in lis[:-1]: # 坑2,去掉最后一个空白项,因为最后一个啥也没有,不然报错,li的含义是表的一行,如下面:图li
# 在iframe中获取催化剂的名称
t1 = li.find_element_by_xpath('./td[2]/table/tbody/tr').text#t1表示标题:如 产率 试剂 催化剂 溶剂 反应时间 反应温度(℃)
# print(t1)
#下面if语句里面的是用于获取催化剂在表中的位置,并且提取催化剂的名称
if "催化剂" in t1:
t1_lists = t1.split()
# print(t1_lists)
loc = t1_lists.index('催化剂') # 催化剂的位置
chj = li.find_element_by_xpath(f'./td[2]/table/tbody/tr[2]/td[{loc}]').text#获取内容
# 催化剂存储在chj中
# print(chj)
chj_lists.append(chj)#放入数组
# print(chj_lists)
num = num + 1#当前爬取的数量
#坑3,注意此时的保存只是暂时存放,需要workbook.save('catalyst.xls')才可以生成xls文件
worksheet.write(num, 0, obj_in)#保存反应物
worksheet.write(num, 1, obj_out)#保存生成物
worksheet.write(num, 2, chj_lists)#保存催化剂
print("目前已经爬取: ", num)
# 坑4,下面1句用于退出iframe,不然会报错
web.switch_to.default_content()
web.find_element_by_xpath('/html/body/font/a[1]').click()#点击返回上一页,点击之后就进入了下图page1
time.sleep(1)
except:
web.switch_to.default_content()
web.find_element_by_xpath('/html/body/font/a[1]').click()#如果出错也会点击返回上一页,点击之后就进入了下图page1,开始下一轮操作
time.sleep(1)
#由于页面不同,按键“下一页”的位置也不同,所以用下面方法;
if page==0:#page=0时,就是首页,要点下一页的方法
web.find_element_by_xpath('/html/body/form[1]/center[2]/input[1]').click()
time.sleep(1)
else:#page!=0时,点下一页
web.find_element_by_xpath('/html/body/form/center[2]/center/input[3]').click()
time.sleep(1)
workbook.save('catalyst.xls')