Python + Selenium爬取drugbank药物靶点信息

由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:2 年前

Selenium爬虫

为什么要使用selenium来进行爬取,因为有的网站有反爬机制,平常的requests等无法爬取。
Selenium可使用pip进行安装

1
pip install selenium

这里使用chrome浏览器进行爬取,所以需要下载对应版本的chromedriver,下载地址如下
https://chromedriver.storage.googleapis.com/index.html

在drugbank网站输入一个drugID或者drug的名字即可查到该药物的相关信息,根据自己的需求进行提取。我主要是需要靶点的信息即targets。

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
from selenium import webdriver
from selenium.webdriver.common.by import By

# 下载的chromedriver地址
chromedriver = r'/Users/xxx/Desktop/drugbank-spider/chromedriver'
os.environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)

# 使用代码爬虫的时候只能输入drugID,如果有很多个drugID,网址信息只需要改变drugID即可
drugID = 'DB00635'
site = 'https://go.drugbank.com/drugs/' + drugID
driver.get(site)

运行代码会打开一个chrome窗口显示对应的drug的信息,就如同自己输入一样。
如果想获取或者保存整个网页的源代码,可通过如下代码

1
driver.page_source

如果只是想获取某一部分信息,就需要进行提取了。
在网页上选中自己感兴趣的信息点击右键,选择检查就可以直接定位到html中。
在 WebDriver 中现在有两种用法,find_element()和find_elements()。需要通过参数传入定位方式和定位语句。
比如这里通过ID定位查找元素

1
2
3
driver.find_element(By.ID, 'uniprot-id')
#获取文本内容需要加个.text即可,如下
driver.find_element(By.ID, 'uniprot-id').text

find_elements()查到的信息是个列表
比如通过class 名字进行定位查找(targets信息)

1
2
3
driver.find_elements(By.CLASS_NAME, 'col-md-7')
# 这里targets的信息如下(如果targets有多个,可能位置索引就会变,而不是8了)
driver.find_elements(By.CLASS_NAME, 'col-md-7')[8].text

以上获取的是所有class名字为col-md-7 的所有内容,还需要手动确认列表中哪一项是自己需要的。当然了,以这种方式获取可能会存在bug,因为不能保证自己需要的信息一定在列表中的某一固定位置。

以下是定位方式与 By 中的属性对应清单:

定位方式 By
id By.ID
name By.NAME
class_name By.CLASS_NAME
tag_name By.TAG_NAME
link_text By.LINK_TEXT
partial_link_text By.PARTIAL_LINK_TEXT
css_selector By.CSS_SELECTOR
xpath By.XPATH

顺便贴一下另一个数据库网站(药智数据,应该是这个公司自己整理的数据库,只对人民币玩家开放,所以只能不厚道了)的代码

1
2
3
4
5
6
7
8
9
10
# 该公司的数据库可输入drug的名字进行查询
drugName = 'Esmolol'
site = 'https://db.yaozh.com/targets?durg_name=' + drugName + '&type=%E5%85%A8%E9%83%A8&durg_targets=&groups=%E5%85%A8%E9%83%A8&durg_indication=&cas='
driver = webdriver.Chrome(chromedriver)
driver.get(site)
#th = driver.find_elements(By.TAG_NAME, 'th')
td = driver.find_elements(By.TAG_NAME, 'td')
target = td[3].text
driver.close()

最后就是使用脚本批量爬取的时候电脑需要一直开机,而且会一直自动打开关闭chrome窗口,所以在爬取的时候就无法进行其他工作。
在网上找了下无头操作(即不显示窗口),但是结果却(头是没了,结果也没了),,,可能还是有bug,不过也好,在爬取的时候正好摸个鱼休息休息也不错。

1
2
3
4
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chromedriver, chrome_options = chrome_options)

参考:https://blog.csdn.net/minzhung/category_9416023.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!