这次爬取的植物分类,也就是 植物所属的界、门、纲、目、科、属、门、种,来自于下面这个网站提供的接口,用户注册之后每天能够调用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')
需要注意的是利用这个网站爬取到的植物分类是英文的,需要自己翻译成中文,当然爬取植物分类的方式还有很多,也可以通过百度百科这些网站来进行爬取。