python多线程爬取CKB数据库

3 篇文章 2 订阅
2 篇文章 0 订阅

python多线程爬取CKB数据库

python多线程爬取CKB数据库

简介

本文针对ckb数据库里的Gene Variant Detail Transcript 信息进行爬取:

1、进入网站https://ckb.jax.org/gene/grid,获取gene的名称及其相对应的链接。只有这些蓝色信息可以爬取。
![(https://img-blog.csdnimg.cn/20200412171714655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1amlkYW4=,size_16,color_FFFFFF,t_70)
2、点开链接后,获取其Variant的名称及其相应的链接。
在这里插入图片描述
3、点开链接后,将其对应的Transcript信息爬取下来。在这里插入图片描述

本代码,会将Gene Variant Detail Transcript 信息 print 出来。由于数量太多,导致等待时间太长,最后又添加了线程池以提升爬取速度,如果你电脑扛得住可以将线程数加大。

import requests
import bs4
from bs4 import BeautifulSoup
import threadpool  

def getHTMLText(url):
   try:
      r = requests.get(url,timeout = 40)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      return r.text
   except:
      return ""
    
def get_gene_id(url):
   html = getHTMLText(url)
   soup = BeautifulSoup(html,'html.parser')
   gene_id_dict = {}
   for a in soup.find_all(name = "a",attrs = "btn btn-default btn-gene btn-block"):
       gene_name = a.string.replace("\n","").replace(" ","")
       ID = a.attrs['href']  
       gene_id = "https://ckb.jax.org" + ID
       gene_id_dict[gene_name] = gene_id
   return gene_id_dict

def gene_variant_link(gene,url):
    list_link = []
    url = url
    html = getHTMLText(url)
    soup = BeautifulSoup(html,'html.parser')
    for a in soup.select('a[href^="/geneVariant"]'):        
        #print(gene, '\t', a.text.replace(" ","").replace("\n",""),'\t','https://ckb.jax.org'+a['href'])
        list_link.append([gene, a.text.replace(" ","").replace("\n",""), 'https://ckb.jax.org'+ a['href']])
    return list_link
        
def print_gene_variant(aaa):
    url = aaa[-1]
    html = getHTMLText(url)
    soup = BeautifulSoup(html,'html.parser')
    list_aa = []
    if len(soup.find_all("table",attrs={"id":"TranscriptTabTable"})) == 2:
        for tr in soup.find_all("table",attrs={"id":"TranscriptTabTable"})[1].children:
            if isinstance(tr,bs4.element.Tag):
                print('\t'.join(aaa), '\t', tr.text.replace(' ','').replace('\n\n','').strip().replace('\n','\t'))
                list_aa.append(tr.text.replace(' ','').replace('\n\n','').strip().replace('\n','\t'))

    if len(soup.find_all("table",attrs={"id":"TranscriptTabTable"})) == 1:
        for tr in soup.find_all("table",attrs={"id":"TranscriptTabTable"})[0].children:
            if isinstance(tr,bs4.element.Tag):
                print('\t'.join(aaa), '\t', tr.text.replace(' ','').replace('\n\n','').strip().replace('\n','\t'))
                list_aa.append(tr.text.replace(' ','').replace('\n\n','').strip().replace('\n','\t'))
    
    if len(soup.find_all("table",attrs={"id":"TranscriptTabTable"})) == 0:
        print('\t'.join(aaa), '\t', 'NAN')
        
url = "https://ckb.jax.org/gene/grid"
gDict = get_gene_id(url)

for name,ID in gDict.items():
    #print(name,ID)
    ainfo = []
    url = ID
    gene = name    
    list_link = gene_variant_link(gene, url)

    pool = threadpool.ThreadPool(10)
    tasks = threadpool.makeRequests(print_gene_variant, list_link)
    [pool.putRequest(task) for task in tasks]
    pool.wait()

    

参考

本代码前半部分参考另一文章,其可以将Gene Variant的list输出出来,也就本文提到的第2张图。
https://www.jianshu.com/p/1d37a4f2f7ed

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值