Python-网络爬虫爬取陶素药物价格

定义:

网络爬虫(又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。(来源于百度,懒得写定义)

目的:

爬取陶素官网药物的售价信息
https://tsbiochem.com/alltargets

工具

python的爬虫工具很多,这次使用Beautiful Soup为例,简单,快速。

步骤:
#安装
conda install -c conda-forge beautifulsoup4
conda install requests
#导入包
import os, time, random,sys,re
import requests
import bs4
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
#requests获取网页,BeautifulSoup获取网页状态
response = requests.get('https://tsbiochem.com/alltargets')
soup = BeautifulSoup(response.content, "html.parser")
soup.prettify
#显示
<bound method Tag.prettify of <!DOCTYPE html>

<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="true" name="HandheldFriendly"/>
<link href="/css/bootstrap.min.css" media="all" rel="stylesheet" type="text/css"/>
<link href="/images/ticontransparent.png" rel="icon"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="/css/tsweb_base.css?ver=1.3" rel="stylesheet" type="text/css">
<link href="/css/tsweb_layout.css?ver=1.35" rel="stylesheet" type="text/css">
<link href="/css/tsweb_shopcart.css" rel="stylesheet" type="text/css">
<link href="/css/tsweb_orderway.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_compound.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_library.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_alltargets.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_pathway.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_search.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_target.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_contact.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_about.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_partner.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_calculator.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_news.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_join_us.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_faq.css" rel="stylesheet" type="text/css"/>
<link href="/css/tsweb_alllibraries.css" rel="stylesheet" type="text/css"/>
<script src="/js/jquery-3.1.1.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/tsweb_base.js"></script>
<meta content="dtb30YDZRhiTZGGnIbEL36fKUTMGnLcU7DTY1Sdd" name="csrf-token"/>
<title>通路靶点 | 陶素生化</title>
#显示我们需要的内容,就是提取属性为’content_a_en target_a‘的内容,获取其网址链接
body=soup.find_all(class_="content_a_en target_a")
http1=[x['href'] for  x in body]
http1
#结果
'https://tsbiochem.com/target/Salt-Inducible%20Kinase',
 'https://tsbiochem.com/target/Serine-Protease',
 'https://tsbiochem.com/target/Serine-threonin-kinase',
 'https://tsbiochem.com/target/SGK',
 'https://tsbiochem.com/target/SGLT',
 'https://tsbiochem.com/target/Sigma-receptor',
 'https://tsbiochem.com/target/Sirtuin',
 'https://tsbiochem.com/target/Sodium-Channel',
 'https://tsbiochem.com/target/Somatostatin',
 'https://tsbiochem.com/target/Src',
 'https://tsbiochem.com/target/STAT',
 'https://tsbiochem.com/target/Survivin',
 'https://tsbiochem.com/target/Syk',
 'https://tsbiochem.com/target/TAM-Receptor',
 'https://tsbiochem.com/target/Telomerase',
 'https://tsbiochem.com/target/TGF-beta-Smad',
 'https://tsbiochem.com/target/Thioredoxin',
 'https://tsbiochem.com/target/Thrombin',

#转换接头(UserAgent),防止反爬虫,
http2=[]
for i in range(len(http1)):
    ua=UserAgent()
    headers={"User-Agent":ua.random}
    response1 = requests.get(http1[i],headers=headers)
    soup1 = BeautifulSoup(response1.content, "html.parser")
    body1=soup1.find_all('td')
#发现所有‘td’的标签,储存为body1
    for x in range(len(body1)):
        try:
            c=body1[x].find('a')
#找寻body1中所有为‘a’的标签,存储为c
            http2.append(c['href'])
#找寻c中‘href’的属性,储存静茹列表http2
        except:
            True
#将http2转化为一个无序,无重复的列表
http3=list(set(http2))

#看下我们都做了什么,我这里直接展示最后的结果,如果你想看看每一步都发生了什么,取http1中的一个元素测试一下就好
http3[1:10]
#结果
['https://tsbiochem.com/compound/N-Acetyl-5-hydroxytryptamine',
 'https://tsbiochem.com/compound/Atipamezole',
 'https://tsbiochem.com/compound/Zacopride%20hydrochloride',
 'https://tsbiochem.com/compound/GTS-21-dihydrochloride',
 'https://tsbiochem.com/compound/Carvedilol',
 'https://tsbiochem.com/compound/Isoetharine%20mesylate%20salt',
 'https://tsbiochem.com/compound/Sotalol-hydrochloride',
 'https://tsbiochem.com/compound/Urapidil-hydrochloride',
 'https://tsbiochem.com/compound/Pirenzepine-hydrochloride']
#获取价格以及规格信息,使用字典格式储存
fin_dict={}
#获取网页
for i in range(len(http3)):
        ua=UserAgent()
        headers={"User-Agent":ua.random}
        response3 = requests.get(http3[i],headers=headers)
        soup3 = BeautifulSoup(response3.content, "html.parser")
#获取CAS编号
        if re.search(r'\s\d+-\d+-\d+\s',str(soup3)):
           cas=re.search(r'\s\d+-\d+-\d+\s',str(soup3))
           body3=soup3.find_all(class_="qtyInput")
           package=[]
        else:
           cas=http3[i]
           body3=soup3.find_all(class_="qtyInput")
           package=[]
#将价格以及规格储存
        for y in range(len(body3)):
                package.append([body3[y]['package'],body3[y]['price']])
        try:
               fin_dict[cas.group(0)]=package
        except:
               fin_dict[http3[i]]=[['0','0']]
#看下结果
fin_dict
#结果,键为cas编号,值以列表储存,列表中第一个元素为规格,第二个元素为价格
{' 62-51-1 ': [['25 mg', '154.00'],
  ['50 mg', '278.00'],
  ['100 mg', '500.00'],
  ['200 mg', '850.00'],
  ['1 mL * 10 mM (in DMSO)', '459.00']],
 ' 1210-83-9 ': [['5 mg', '336.00'],
  ['10 mg', '664.00'],
  ['25 mg', '1064.00'],
  ['50 mg', '1808.00'],
  ['100 mg', '3254.00'],
  ['200 mg', '5858.00']],
 ' 104054-27-5 ': [['5 mg', '369.00'],
  ['10 mg', '665.00'],
  ['25 mg', '1197.00'],
  ['50 mg', '1975.00'],
  ['100 mg', '3555.00'],
  ['200 mg', '6399.00'],
  ['1 mL * 10 mM (in DMSO)', '369.00']],
.....}
#输出文件为,csv格式,将fin_dict输出为out.csv
f=open('out.csv','w+')
for k,v in fin_dict.items():
    f.write(k+',')
    for i  in range(len(v)):
        f.write(v[i][0]+','+v[i][1]+',')
    f.write('\n')
f.close()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343