【Python爬虫】植物分类爬取

文章讲述了如何利用Species2000China提供的API接口,通过学名查询植物的界、门、纲、目、科、属、种等分类信息。代码示例展示了如何读取xls文件中的学名,发送请求并解析返回的JSON数据,最终将结果保存到新的xls文件中。注意,返回的分类信息为英文,需要手动翻译。
摘要由CSDN通过智能技术生成

这次爬取的植物分类,也就是 植物所属的界、门、纲、目、科、属、门、种,来自于下面这个网站提供的接口,用户注册之后每天能够调用2000次API。Species 2000 China,Catalogue of Life China,CoL China 物种2000中国节点 中国生物物种名录 (sp2000.org.cn)http://www.sp2000.org.cn/

在网站的数据服务栏目下面提供了各种爬取内容的方式,包括了基于科名、学名、俗名等来进行爬取分类,那么在这里就需要按照你需要查取的植物名称是学名还是俗名,或者其他的对内容的要求来进行选择,在这里的API服务说明下方的不同选项会出现网站提供的对应说明。

 我这次选择使用学名来进行爬取,点击“按学名查询”,界面内出现了接口的说明,包括了请求方法、参数说明、返回内容;网站为不同爬取方式提供的说明是类似的,那么在代码中只需要修改对应的请求的地址、输入的参数,并修改最后提取需要内容的部分代码即可。

 那么具体的爬取方式如下,主要是填入申请到的Key、url以及学名这三个内容,key是用户注册之后申请的此处不进行赘述;那么url是网页请求方法处提供的,不同的爬取方式url有不同;学名这里我从xls文件中进行了读取。

    col = []
    apiKey = '###'
    commonName = sheet.cell_value(i, 0)
    url = f"http://www.sp2000.org.cn/api/v2/getSpeciesByScientificName" 


    params = { 
        'commonName':commonName,
        'apiKey': apiKey   
    }  

返回的参数中我需要的部分是界门纲目科属门种 这些参数,所以利用逐层寻找的方式查取到就好了。

完整的代码如下: 

import requests
from bs4 import BeautifulSoup
import json
import xlwt
from Coordin_transformlat import gcj02towgs84 
import xlrd
import xlwt

# 打开xls文件
workbook = xlrd.open_workbook('species.xls')

# 选择第一个sheet
sheet = workbook.sheet_by_index(0)

# 读取第一列数据(从第二行到最后一行)
data = []
for i in range(0, sheet.nrows):
    col = []
    apiKey = '###'
    commonName = sheet.cell_value(i, 0)
    url = f"http://www.sp2000.org.cn/api/v2/getSpeciesByScientificName" 


    params = { 
        'commonName':commonName,
        'apiKey': apiKey   
    }  

    response = requests.get(url, params=params)
    result = json.loads(response.text)

    # 获取返回结果中的物种信息
    species = result['data']
    if species['species'] == None:
        kingdom = 0
        phylum = 0
        class_1 = 0
        order = 0
        family = 0
        genus = 0
        species = commonName
    else:
        species_json = species['species'][0]['accepted_name_info']['taxonTree']
        kingdom = species_json['kingdom']
        phylum = species_json['phylum']
        class_1 = species_json['class']
        order = species_json['order']
        family = species_json['family']
        genus = species_json['genus']
        species = commonName
    col.append(kingdom)
    col.append(phylum)
    col.append(class_1)
    col.append(order)
    col.append(family)
    col.append(genus)
    col.append(species)
    data.append(col)
    print(commonName)


# 七列数据的标题
cols = ['界', '门', '纲', '目', '科', '属', '种']

# 创建一个新的xls文件,添加一个sheet
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('Sheet1')

# 写入表头
for i, col in enumerate(cols):
    sheet.write(0, i, col)

# 写入数据
for row, row_data in enumerate(data):
    for col, value in enumerate(row_data):
        sheet.write(row+1, col, value)

# 保存文件
workbook.save('output.xls')

需要注意的是利用这个网站爬取到的植物分类是英文的,需要自己翻译成中文,当然爬取植物分类的方式还有很多,也可以通过百度百科这些网站来进行爬取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值