[python爬虫] Selenium定向爬取PubMed生物医学摘要信息
PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要。它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科。它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学。
PubMed是因特网上使用最广泛的免费MEDLINE,该搜寻引擎是由美国国立医学图书馆提供,它是基于WEB的生物医学信息检索系统,它是NCBI Entrez整个数据库查询系统中的一个。PubMed界面提供与综合分子生物学数据库的链接,其内容包括:DNA与蛋白质序列,基因图数据,3D蛋白构象,人类孟德尔遗传在线,也包含着与提供期刊全文的出版商网址的链接等。
医学导航链接:http://www.meddir.cn/cate/736.htm
PubMed官网:http://pubmed.cn/
实现代码
实现的代码主要是Selenium通过分析网页DOM结点进行爬取。
爬取的地址是:http://www.medlive.cn/pubmed/
在网址中搜索Protein(蛋白质)后,分析网址可发现设置Page=1~20可爬取前1~20页的URL信息。链接如下:
http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page=1
1 # coding=utf-8
2 """
3 Created on 2015-12-05 Ontology Spider
4 @author Eastmount CSDN
5 URL:
6 http://www.meddir.cn/cate/736.htm
7 http://www.medlive.cn/pubmed/
8 http://paper.medlive.cn/literature/1502224
9 """
10
11 import time
12 import re
13 import os
14 import shutil
15 import sys
16 import codecs
17 from selenium import webdriver
18 from selenium.webdriver.common.keys import Keys
19 import selenium.webdriver.support.ui as ui
20 from selenium.webdriver.common.action_chains import ActionChains
21
22 #Open PhantomJS
23 driver = webdriver.Firefox()
24 driver2 = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
25 wait = ui.WebDriverWait(driver,10)
26
27 '''
28 Load Ontoloty
29 去到每个生物本体页面下载摘要信息
30 http://paper.medlive.cn/literature/literature_view.php?pmid=26637181
31 http://paper.medlive.cn/literature/1526876
32 '''
33 def getAbstract(num,title,url):
34 try:
35 fileName = "E:\\PubMedSpider\\" + str(num) + ".txt"
36 #result = open(fileName,"w")
37 #Error: 'ascii' codec can't encode character u'\u223c'
38 result = codecs.open(fileName,'w','utf-8')
39 result.write("[Title]\r\n")
40 result.write(title+"\r\n\r\n")
41 result.write("[Astract]\r\n")
42 driver2.get(url)
43 elem = driver2.find_element_by_xpath("//div[@class='txt']/p")
44 #print elem.text
45 result.write(elem.text+"\r\n")
46 except Exception,e:
47 print 'Error:',e
48 finally:
49 result.close()
50 print 'END\n'
51
52 '''
53 循环获取搜索页面的URL
54 规律 http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page=1
55 '''
56 def getURL():
57 page = 1 #跳转的页面总数
58 count = 1 #统计所有搜索的生物本体个数
59 while page<=20:
60 url_page = "http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page="+str(page)
61 print url_page
62 driver.get(url_page)
63 elem_url = driver.find_elements_by_xpath("//div[@id='div_data']/div/div/h3/a")
64 for url in elem_url:
65 num = "%05d" % count
66 title = url.text
67 url_content = url.get_attribute("href")
68 print num
69 print title
70 print url_content
71 #自定义函数获取内容
72 getAbstract(num,title,url_content)
73 count = count + 1
74 else:
75 print "Over Page " + str(page) + "\n\n"
76 page = page + 1
77 else:
78 "Over getUrl()\n"
79 time.sleep(5)
80
81 '''
82 主函数预先运行
83 '''
84 if __name__ == '__main__':
85 path = "F:\\MedSpider\\"
86 if os.path.isfile(path): #Delete file
87 os.remove(path)
88 elif os.path.isdir(path): #Delete dir
89 shutil.rmtree(path, True)
90 os.makedirs(path) #Create the file directory
91 getURL()
92 print "Download has finished."
分析HTML
1.获取每页Page中的20个关于Protein(蛋白质)的URL链接和标题。其中getURL()函数中的核心代码获取URL如下:
url = driver.find_elements_by_xpath("//div[@id='div_data']/div/div/h3/a")
url_content = url.get_attribute("href")
getAbstract(num,title,url_content)
2.再去到具体的生物文章页面获取摘要信息
其中你可能遇到的错误包括:
1.Error: 'ascii' codec can't encode character u'\u223c'
它是文件读写编码错误,我通常会将open(fileName,"w")改为codecs.open(fileName,'w','utf-8') 即可。
2.第二个错误如下图所示或如下,可能是因为网页加载或Connection返回Close导致
WebDriverException: Message: Error Message => 'URL ' didn't load. Error: 'TypeError: 'null' is not an object
运行结果
得到的运行结果如下所示:00001.txt~00400.txt共400个txt文件,每个文件包含标题和摘要,该数据集可简单用于生物医学的本体学习、命名实体识别、本体对齐构建等。


浙公网安备 33010602011771号