Python requests+bs4 爬取TCMSP的资源获得清肺排毒汤的靶向基因

为研究清肺排毒汤的中药材对于新冠肺炎的作用机制,需要收集相关数据,于是将目光洒向了TCMSP。。

检索首页是这样的:


接下来用一味药材进行检索。

中药材检索界面获取

以清肺排毒汤中的麻黄为例,进行检索后它的界面是这样的,注意观察url:
http://tcmspw.com/tcmspsearch.php?qs=herb_all_name&q=麻黄&token=9b8fe8d60b5028b2eb0ee7e5e7834a40

找规律:
1.http://tcmspw.com/tcmspsearch.php?qs=herb_all_name&q=麻黄&token=9b8fe8d60b5028b2eb0ee7e5e7834a40
也可能是这样:
http://tcmspw.com/tcmspsearch.php?qs=herb_all_name&q=%E9%BA%BB%E9%BB%84&token=9b8fe8d60b5028b2eb0ee7e5e7834a40
2.http://tcmspw.com/tcmspsearch.php?qs=herb_all_name&q=广藿香&token=9b8fe8d60b5028b2eb0ee7e5e7834a40
也可能是这样:
http://tcmspw.com/tcmspsearch.php?qs=herb_all_name&q=%E5%B9%BF%E8%97%BF%E9%A6%99&token=9b8fe8d60b5028b2eb0ee7e5e7834a40
也就是说url可能对中文字符进行了16进制的编码。
发现除了q=后面的中药材名称不同,其他的都相同,而且可以分为四大块:
1.http://tcmspw.com/tcmspsearch.php?
2.qs=herb_all_name&q=
3.中药名或者其对应的16进制的编码
4.&token=9b8fe8d60b5028b2eb0ee7e5e7834a40
然后可以写代码了:
导入需要的库,parse是用以解码中文的。当用中文访问失败时,可以将中文解码再试试。后面解码的过程注释掉了。

import requests
# import urllib.parse  # urllib用以解码中药材名称,是否需要见具体需求
from bs4 import BeautifulSoup
import re
import xlsxwriterclass get_drug_target(object):def __init__(self):self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',}self.base_url = 'http://tcmspw.com/tcmspsearch.php?'

根据上面提到的格式将url进行拼接,并请求:

def get_url(self, drug):# 下面注释的是中文解码的过程# drug_decode = urllib.parse.quote(drug)# url = self.base_url+'qs=herb_all_name&q='+drug_decode+'&token=f8abf58ec1d6b214e0d6ca4ec94ee7d3'# 下面是不解码url = self.base_url+'qs=herb_all_name&q='+drug+'&token=9b8fe8d60b5028b2eb0ee7e5e7834a40'# 请求urlresponse = requests.get(url, headers=self.headers)data = response.content.decode()return data

获取中药材靶向基因的url

以下是含有靶向基因的页面,观察url,发现里面包含了麻黄的英文名,并且在英文名之间还有 %20 进行间隔,其他的与之前的思路相同。

对照跳转前的源码,发现英文名就在a标签中,那么仅需要获取它并修改上面跳转后的url即可获取靶向基因所在的页面了。

接下来可以解析请求到的内容并获取a标签的内容了,首先尝试获取a标签前面的div标签内容:

soup = BeautifulSoup(data, 'lxml')
drug_url1 = soup.find_all('div', attrs={'id': 'grid'})
print(drug_url1)
drug_url2 = soup.find_all('div', attrs={'div': 'k-grid-content'})
print(drug_url2)


然而,事实却并不这么简单,只能获取到id为grid的div,再往下就获取不到了。。
同样也尝试过用lxml解析内容,还是行不通。(或许还有其他的方式可以获得,有大神知道的请指教!)
那咋办呢?在仔细观察了html页面后,发现在div下面还有script存在,看来很有可能是它在捣鬼,这时候不得不曲线救国了。


也就是说div标签下的内容是通过javascript这段代码传递过去的。那么我们只要用正则获取这段代码中的内容就好了,当然,要注意对这段代码进行str转化。

def search_drug_url(self, data):soup = BeautifulSoup(data, 'lxml')# 曲线救国,寻找javascript中的数据drug_url1 = soup.find_all('script')drug_url1 = str(drug_url1)

后面就可以用正则表达式进行英文名和url格式的提取了。

# 获取英文名
drug_name1 = re.search(r'"herb_en_name":"(.*?)"', drug_url1).group(1)
# 将英文名之间的空格替换为 %20
drug_name2 = drug_name1.replace(' ', '%20')
# 获取url地址
drug_url2 = re.search(r"href='(.+)'", drug_url1).group(1)
# 拼接url
combined_url = 'http://tcmspw.com/'+drug_url2.split('$')[0]+drug_name2+drug_url2.split('}')[1]
return combined_url

尝试拼接的url。。可用!

获取中药材靶向基因所在页面的url

观察跳转页面的源码,又发现了靶向基因就在a标签中。这会不会又是一个坑呢?


尝试了一下,确实是个坑。
前车之鉴,继续寻找script。


果不其然,靶向基因就在这里,而且还是所有页面的!


接下来就继续获取,然后正则。
不过要注意一些特殊的靶点,它们有 ‘/’,因此需要将这类靶点的‘\’替换为’’

def get_target(self, url):response = requests.get(url, headers=self.headers)soup = BeautifulSoup(response.content, 'lxml')# 一共10个scripttarget = soup.find_all('script')[9]target = str(target)# 两次使用正则获取靶向基因target_info = re.search(r'JSON.parse(.+)', target).group(1)target_info = re.findall(r'label\\":\\"(.*?)\\"', target_info)target_list = [] for t in target_info:# 注意这里的pattern我没加rtarget_list.append(t.replace('\\\\', ''))print(target_list)return target_list

结果都以list返回了,第一个list是麻黄。
再对照一下麻黄的靶向基因。

程序的主干:

def run(self):drug_list = ['麻黄', '广藿香', '苦杏仁', '款冬花', '射干', '细辛', '山药', '枳实', '陈皮', '桂枝', '泽泻', '猪苓', '白术', '茯苓', '柴胡', '黄芩', '生姜', '紫菀']with xlsxwriter.Workbook('TCM.xlsx') as writer:sheet = writer.add_worksheet('TCM_target')for index, drug in enumerate(drug_list):data = self.get_url(drug)combined_url = self.search_drug_url(data)target_data = self.get_target(combined_url)sheet.write_column(1, index, target_data)sheet.write(0, index, drug_list[index])writer.close()

用xlsxwriter将每个list写入excel并保存。(发现把for嵌套在with结构外面时好像不能成功写入,折腾了好一会儿)


Bingo!

Python requests+bs4爬取中药数据库TCMSP的资源获得清肺排毒汤的靶向基因(曲线救国)相关推荐

  1. python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程

    python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...

  2. Python借助爬虫Requests+BS4爬取人民教育出版社义务教育下学期课本(二)

    文章目录 思路梳理 封装函数 重要提示 系列文章 思路梳理 我们打开网页,可以看到这其中有许多链接,我们可以查看一下网页源代码,可以看到如我们所期盼的一样,这里有许多的链接,我们只需要把链接爬取出来就 ...

  3. Python借助爬虫Requests+BS4爬取人民教育出版社义务教育下学期课本(一)

    经过一晚上的休息,我已经重新从阴影中站了起来,并重新发现了一个人性化的网站,一起来看看这个网站吧 来到了人民教育出版社的官网,一看,顿时晕眩三秒,我昨天的努力不都白费了吗,只得重新打起精神,研究一下这 ...

  4. python用bs4爬取豆瓣电影排行榜 Top 250的电影信息和电影图片,分别保存到csv文件和文件夹中

    python用bs4爬取豆瓣电影排行榜 Top 250的电影信息和图片,分别保存到csv文件和文件夹中. 爬取的数据包括每个电影的电影名 , 导演 ,演员 ,评分,推荐语,年份,国家,类型. py如果 ...

  5. python利用bs4爬取外国高清图片网站

    python利用bs4爬取外国高清图片网站 爬取高清图片 爬取高清图片 import re import requests from bs4 import BeautifulSoup import o ...

  6. python3 requests+bs4爬取某网页MM图片

    python3 requests+bs4爬取某网页MM图片 原理: 将所要抓取的首页分标题及地址保存到字典,遍历字典,对每一个标题下的所有分页进行抓取 import requests from bs4 ...

  7. python:bs4爬取奥特曼,是不是所有奥特曼都长一样

    利用python+bs4爬取奥特曼粉丝联盟的奥特曼图片,难点把其实也没有,就是爬虫不经常搞,容易忘记一些东西.废话不多说,直接上代码 主要引包 import os from pathlib impor ...

  8. 运用requests模块爬取NCBI数据库论文题目及摘要

    本人生物专业,本身做湿实验的,但对python有着极大的兴趣,因此开始自学Python.在这里记录一下学习进程. 近期编一个爬取NCBI数据库文献的脚本,放在这里希望大家能帮忙看看可以改进的地方,谢谢 ...

  9. python采用requests+bs4爬取豆瓣top250电影信息

    爬取豆瓣top250电影说明 (链接:https://movie.douban.com/top250,可爬取一页或者多页(输出电影的正标题(肖申克的救赎),副标题( The Shawshank Red ...

最新文章

  1. java包装类方法_Java包装类
  2. C++中结构体和类的区别和联系
  3. static 二次理解
  4. r中gglot怎么组合多张图_最终版本Science级组合图表绘制
  5. 面向对象的分析与设计
  6. “搞机器学习没前途”
  7. UVA - 699 The Falling Leaves
  8. OSG仿真案例(2)
  9. PL/SQL Developer使用笔记
  10. 企业网络管理和华为企业级路由交换产品介绍
  11. JS对象(对象的创建、属性的增删改查、属性的检测和枚举)
  12. AutoCAD三维建模图——汽车车轮
  13. WINDOWS系统文件夹、实用自带工具、DOS、进程等,解析集合(积累)较实用...
  14. 计算机控制系统的模拟控制器,导 读 利用计算机代替常规的模拟控制器,使它成为控制系统的一个组成部分,这种有计算机参加控制的系统简称为计算机控制系统。...
  15. UART串口通信协议
  16. [浅析]UE4物理系统
  17. ca加密是什么情况_让我们进行加密:为什么要创建一个免费,自动化和开放的CA?...
  18. 禅说教育(之一)——百般说教不如帮人悟到
  19. vue百度地图api 获取小区边界值
  20. linux CentOS 7 在线安装 zabbix 官网的思路,最简洁

热门文章

  1. cobar文档 - 资料集合
  2. #创作纪念日# 我的创作128天纪念日
  3. Redis的新数据类型
  4. 环融科技携手梅花网,与你一起讨论快消品企业如何管理好营销费用
  5. 【Flink系列】部署篇(三):Native k8s部署高可用Flink集群实战
  6. uni-app + sentry 前端异常监控
  7. 在anaconda环境中配置PCV和vlfeat
  8. 华为MateX5G折叠屏手机正式发售的意义
  9. VIVO 校园招聘提前批 面试经验
  10. 将a.txt的内容,转成b.json的内容