这个是帮朋友做的,难点就是他们有一个反爬虫机制,用request一直不行,后面我就用selenium直接把网页copy下来,然后再来解析本地的html文件,就木有问题啦。

现在看来,写得有点傻,多包涵。

# -*- coding:utf-8 -*-

import os
import time
import datetime
import codecs
from lxml import etree
from selenium import webdriver
import csv
#控制编码,全英文网页,用不着
# import sys
# reload(sys)
# sys.setdefaultencoding('utf-8') # # date格式转为string格式
today = datetime.date.today()
today_string = today.strftime('%Y-%m-%d') #通过浏览器得到网页页面--反反爬虫
def html_getter(site,file_name):
driver = webdriver.Firefox()
# chromedriver = r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
# os.environ['webdriver.chrome.driver'] = chromedriver
# driver = webdriver.Chrome(chromedriver)
driver.get(site)
driver.maximize_window() # 将浏览器最大化显示
time.sleep(5) # 控制间隔时间,等待浏览器反映
# 保存页面
source_code = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
f = codecs.open(file_name, 'w+', 'utf8')
f.write(source_code)
f.close() #打开保存在本地的html文件
def file_html(file_name):
f = open(file_name,'r')
html = f.read()
f.close()
return html #写入csv,也可以有其他写入方式,这个地方就csv啦
def csv_writer(ll):
headers = ['drug','inter','snp_rs_id','Allele_name','Defining_change','Adverse_Reaction','ref','href','original_title']
with open('drugbank.csv','a') as f:
f_csv = csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(ll) #用xpath解析网页,得到表格数据,我就是这么爱xpath,不喜欢正则表达式
def data_get(html):
selector = etree.HTML(html)
tbody=selector.xpath('/html/body/main/table/tbody/tr')
for each in tbody:
# #1.'drug'
drug_name=each.xpath('td[1]/strong/text()')[0]
drug_sn=each.xpath('td[1]/a/text()')[0]
drug=drug_name+' '+drug_sn
# #print(drug)
# #2.'Interacting Gene/Enzyme'
int=each.xpath('td[2]')[0]
inter=int.xpath('string(.)')
# print(inter)
# #3.'SNP RS ID'
snp=each.xpath('td[3]/a/text()')
if snp:
snp_rs_id=snp[0]
else:
snp_rs_id='Not Available '
#print snp_rs_id
#4.Allele name
Allele=each.xpath('td[4]/text()')
if Allele:
Allele_name=Allele[0]
else:
Allele_name='Not Available '
# #print Allele_name
# #5.'Defining change'
Defining=each.xpath('td[5]/text()')
if Defining:
Defining_change=Defining[0]
else:
Defining_change='Not Available '
# print Defining_change
# 6.'Adverse Reaction'
Adverse=each.xpath('td[6]/text()')
if Adverse:
Adverse_Reaction=Adverse[0]
else:
Adverse_Reaction='Not Available '
# print Adverse_Reaction
#7.'Reference(s)'
ref=each.xpath('td[7]/span/a/text()')[0]
href=each.xpath('td[7]/span/a/@href')[0]
original_title=each.xpath('td[7]/span/a/@data-original-title')[0]
# print ref
# print(href)
# print(original_title) tt=(drug,inter,snp_rs_id,Allele_name,Defining_change,Adverse_Reaction,ref,href,original_title)
ll.append(tt) #print ll if __name__ == '__main__':
ll=[]
for i in range(1,5):
page_num=i
site='http://www.drugbank.ca/genobrowse/snp-adr?page='+str(page_num)
#get the html through webdriver
file_name=unicode(today_string)+u'drugbank_'+unicode(str(page_num))+u'.html' html_getter(site,file_name)
html=file_html(file_name)
data_get(html)
csv_writer(ll)

python爬虫:爬取医药数据库drugbank的更多相关文章

  1. python爬虫——爬取NUS-WIDE数据库图片

    实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需 ...

  2. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  3. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  4. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  5. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  6. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

  7. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  8. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  9. 一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...

随机推荐

  1. (转)RabbitMQ学习之主题topic(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887775 参考:http://blog.csdn.NET/lmj623565791/artic ...

  2. MongoDB_基本操作

    数据库操作 增加数据库 use db1 #如果数据库不存在,则创建数据库,否则切换到指定数据库 查询数据库 show dbs #可以看到,我们刚创建的数据库db1并不在数据库的列表中,要显示它我们需要 ...

  3. 以checked选中作为判断条件的各种写法

    <input type="radio" name="choice" id="ipt1"> <label for=" ...

  4. [luogu3952 noip2017] 逛公园 (计数dp+最短路)

    传送门 Description Input Output 输出文件包含 T 行,每行一个整数代表答案. Sample Input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 ...

  5. 【模板】 非旋转treap

    模板:luogu P3369 [模板]普通平衡树 code: #include <cstdio> #include <cstdlib> const int MAX_N=1000 ...

  6. 小松之LINUX驱动学习笔记之模块间函数调用通讯

    1. 符号导出函数 EXPORT_SYMBOL() EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用. EXPORT_SYMBOL_GPL( ...

  7. Ubuntu安装Docker 适合Ubuntu17.04版本

    Docker介绍 Docker是一个开源的容器引擎,它有助于更快地交付产品.Docker可将应用程序和基础设施层隔离,并且将基础设施当作程序一样进行管理.使用Docker,可以更快地打包,测试以及部署 ...

  8. rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

    首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...

  9. 关于idea控制台乱码问题

    乱码是常有的事儿,改一下也就两分钟......不多说看图: 上图中的勾选项一定不要忘记,它可以隐藏你项目中encoding设置. 在上图两个文件中加入 -Dfile.encoding=UTF-8 在上 ...

  10. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...