【爬虫】爬取化学反应数据库(反应物,生成物,催化剂)

爬取化学反应数据库(反应物,生成物,催化剂)

 -*- 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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值