利用Python爬取国家水稻数据中心的品种数据

  • 一.页面获取
    python可以进行对网页的访问,主要用到requests,beautifulsoup4包。
    首先新建一个page的py文件,用来获取页面的数据。
import requests
import bs4
import re
import mathdef get_page(url, coding):  # 创建一个函数,用来获取BS4格式的文档,并返回整个页面。# 主要有两个参数,url代表网页地址,coding代表页面编码格式from fake_useragent import UserAgent # 调用UserAgent 包,获取用户代理头的值,避免被屏蔽。ua = UserAgent()headers = {"User-Agent": ua.random}r = requests.get(url, headers=headers,timeout=15)r.encoding = coding  # 用GB2312解码文档rt = r.textsoup = bs4.BeautifulSoup(rt, 'lxml')  # HTML文档字符串  HTML解析器  HTML文档编码return soupdef get_numdata(data):  # 创建一个函数,用来接收BS4格式的文档,并返回具体的页数。con = data.find_all(name='caption') # 查询文档中 name='caption' 的标签com = con[0].next.next  # 查询历年审定品种的数量s = re.findall("\d+", com)[0]  # 正则表达式提取数字z = math.floor((int(s) - 1) / 35) + 1  # 计算页数,当数字是35的时候,需要-1除以35再+1得到1页# 为什么是35,是因为页面中的数据共35行return zdef get_head(data):  # 创建一个函数,用来接收BS4格式的文档,并返回Excel的表头。Head = data.find_all(name='tr', align="left")  # 查表头:搜索文档中的tr标签,且符合类 align="left" 的tagx = Head[0].contents  # 获取标签 tr 的内容y = '网址'head_1 = [x[0].next.next, x[1].next.next, y, x[2].next.next, x[3].next.next, x[4].next.next, x[5].next.next]head_2 = ['全生育期', '株高', '穗长', '每亩有效穗', '每穗总粒数', '结实率', '千粒重','整精米率', '垩白粒率', '垩白度', '直链淀粉含量', '胶稠度', '长宽比']head = head_1 + head_2  # 得到Excel表头的listreturn headdef get_province(data):  # 用来获取省份和网址并建立字典url2 = 'http://www.ricedata.cn/variety/' # 获取省份的网址前缀con = data.find_all(name='a', target="_blank")  # 查省份:搜索文档中的a标签,且target="_blank"的tagprovince = {} # 建立一个代表省份的空字典for i in con[:-1]:if type(i) is bs4.element.Tag and i.string is not None:# 判断字符串的格式且不为空值z = i.string.replace(u'\u3000', '') # 省份名称y = url2 + i['href'] # 具体的网址province[z] = y # 追加数据 省份:网址 到字典province中else:continueprovince.pop(' ')  # 删除空值,也就是某些不种水稻的省份,如台湾,香港等return provincedef get_detailed_data(data):  # 获取每个品种的详细数据receive_data1 = str(data.find_all(name='td', colspan="2")[0].contents)receive_data = receive_data1.replace("\\r\\n", "")  # 去除字符串中的换行符full_growth_period = re.findall('(?<=全生育期)[\d+\.\d]*', receive_data)plant_height = re.findall('(?<=株高)[\d+\.\d]*', receive_data)spike_length = re.findall('(?<=穗长)[\d+\.\d]*', receive_data)effective_panicles_per_acre = re.findall('(?<=每亩有效穗数)[\d+\.\d]*', receive_data)grains_per_panicle = re.findall('(?<=每穗总粒数)[\d+\.\d]*', receive_data)seed_setting_rate = re.findall('(?<=结实率)[\d+\.\d]*', receive_data)thousand_grain_weight = re.findall('(?<=千粒重)[\d+\.\d]*', receive_data)head_rice_rate = re.findall('(?<=整精米率)[\d+\.\d]*', receive_data)chalky_rice_rate = re.findall('(?<=垩白粒率)[\d+\.\d]*', receive_data)chalkiness_degree = re.findall('(?<=垩白度)[\d+\.\d]*', receive_data)amylose_content = re.findall('(?<=直链淀粉含量)[\d+\.\d]*', receive_data)gel_consistency = re.findall('(?<=胶稠度)[\d+\.\d]*', receive_data)length_width_ratio = re.findall('(?<=长宽比)[\d+\.\d]*', receive_data)return [full_growth_period, plant_height, spike_length, effective_panicles_per_acre, grains_per_panicle,seed_setting_rate, thousand_grain_weight, head_rice_rate, chalky_rice_rate, chalkiness_degree,amylose_content, gel_consistency, length_width_ratio]def get_dedata(de_data):  # 将品种的详细数据转化成一个listdedata = []for i in de_data:if len(i) > 0:x = list(filter(None, i))# filter()为已知的序列的每个元素调用给定的布尔函数,调用中,返回值为非零的元素将被添加至一个列表中if len(x) > 0:dedata.append(x[0])else:dedata.append(None)else:dedata.append(None)return dedata
  • 二.数据处理
    然后新建一个 rdata 的 py 文件,用来处理数据。
def get_rice(num, data):  # 该函数用来从data中获取35行水稻数据url = 'http://www.ricedata.cn/variety'data1 = data[num + 0].text  # 序号data2 = data[num + 1].text  # 品种data3 = url + str(data[num + 1].contents[0]['href'][2:])  # 网址data4 = data[num + 2].text  # 亲本来源data5 = data[num + 3].text  # 类型data6 = data[num + 4].text  # 选育单位data7 = data[num + 5].text  # 审定编号return data1, data2, data3, data4, data5, data6, data7def get_ricedata(ricedata): # 该函数用来获取每一行的数据x = []count = 0data_len = len(ricedata)while count + 5 < data_len:for i in get_rice(num=count, ricedata=data):x.append(i)count += 6 # count+6表示每一行有6个数据return xdef get_data(soup):  # 用来查询品种数据,页面的品种的行和列soup_data = soup.find_all('td', style="border-top:dotted silver 1px")data = get_ricedata(data=soup_data)return data
  • 三.数据保存
    新建一个 rice.py 的文件
    将爬取到的数据保存到Excel中, 具体的路径为rice.py的文件所在的路径。
import datetime
import xlwt
import page
import rdata
import time
import osprint('请求数据')
url = 'http://www.ricedata.cn/variety/index.htm'
pro_data = page.get_page(url=url, coding='utf-8')
pro = page.get_province(data=pro_data)
workbook = xlwt.Workbook(encoding='utf-8')  # 创建一个workbook 设置编码for key, value in pro.items():starttime = datetime.datetime.now()  # 计算当前循环的开始时间# print(key+':'+value)worksheet = workbook.add_sheet(key)  # 创建一个worksheetstart_data = page.get_page(url=value, coding='GB2312')  # 确定省份的起始页码head = page.get_head(data=start_data)  # 确定省份页的表头ncolumn = len(head)  # 计算一共有多少列for i in range(1, ncolumn):worksheet.write(0, i, label=head[i])  # 把表头写入到Excel中for pages in range(page.get_numdata(data=start_data)):url_1 = value[:-5] + str(pages + 1) + '.htm'print('正在查询第', str(pages + 1), '页')page_data = page.get_page(url=url_1, coding='GB2312')  # 获取当前页面数据num_data = page.get_numdata(data=page_data)  # 获取当前页面的页数rice_data = rdata.get_data(soup=page_data)  # 获取当前页面35行品种数据,就是单元格的数量n = int(len(rice_data) / 7)  # 列表中的数据是每一行有7列,页面的总行数=总单元格数/7for x in range(1, n + 1):  # 写入excelz_data = page.get_page(url=rice_data[(x - 1) * 7 + 2], coding='GB2312')pz_data = page.get_detailed_data(data=z_data)dedata = page.get_dedata(de_data=pz_data)row = pages * 35 + x  # 第**行for y in range(1, ncolumn + 1):if y - 1 == 2:  # 判断是否是第3列,如果是则将网址改变成超链接的格式。rd = rice_data[(x - 1) * 7 + y - 1]  # 单元格数据colum = head[y - 1]  # 第**列worksheet.write(row, y - 1, label=xlwt.Formula("HYPERLINK" + '("' + rd + '";"' + rd + '")'))  # 参数对应 行, 列, 值print("{0:^6}\t{1:{2}<12}".format(str(pages * 35 + x), colum, chr(12288)),rd)elif y - 1 > 6:  # 当单元格的列数在第7行之后,需要获取 具体品种 网址内品种数据rd = dedata[y - 8]  # 单元格数据colum = head[y - 1]  # 第**列worksheet.write(row, y - 1, label=rd)print("{0:^6}\t{1:{2}<12}".format(row, head[y - 1], chr(12288)),rd)else:rd = rice_data[(x - 1) * 7 + y - 1]  # 单元格数据colum = head[y - 1]  # 第**列worksheet.write(row, y - 1, label=rd)  # 参数对应 行, 列, 值print("{0:^6}\t{1:{2}<12}".format(row, head[y - 1], chr(12288)),rd)endtime = datetime.datetime.now()  # 计算当前循环的结束时间print(key, '的品种数据写入完成', '耗时:', (endtime - starttime).seconds, '秒')print('等待5秒后继续下一个省份')time.sleep(5)
dirs = os.getcwd() # 获取页面的
filename = dirs + '\\品种数据.xls'
workbook.save(filename)  # 保存
print('保存完毕,文件路径为:', filename)
time.sleep(2)

实际获取的数据如下:

import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['C:\\Python\\PycharmProjects', 'C:/Python/PycharmProjects'])
PyDev console: starting.
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 02:47:15) [MSC v.1900 32 bit (Intel)] on win3
请求数据
正在查询第 1 页1      序号           11     品种名称         韵两优8271    网址           http://www.ricedata.cn/variety/varis/618369.htm1       亲本来源("×"前为母本) 韵2013S×R8271      类型           籼型两系杂交稻1       原产地/选育单位     袁隆平农业高科技股份有限公司等1       审定编号         国审稻201861431       全生育期         116.01     株高           107.61     穗长           23.61      每亩有效穗        18.51      每穗总粒数        163.31     结实率          81.41      千粒重          23.41      整精米率         66.41      垩白粒率         151    垩白度          3.71       直链淀粉含量       15.61      胶稠度          711    长宽比          3.1

利用Python爬取国家水稻数据中心的品种数据相关推荐

  1. 利用Python爬取《囧妈》豆瓣短评数据,并进行snownlp情感分析

    利用Python爬取<囧妈>豆瓣短评数据,并进行snownlp情感分析 一.电影评论爬取 今年的贺岁片<囧妈>上映前后,在豆瓣评论上就有不少网友发表了自己的观点,到底是好评的声 ...

  2. python 怎么爬桌软件数据_如何利用Python爬取并分析红岭创投的数据?

    第一步:爬取数据 通过 selenium + Firefox 的无头模式将需要的数据爬取出来,代码实现不在赘述,详细步骤可查看我的上一篇图文(如何利用Python爬取网易新闻), 由于 seleniu ...

  3. python爬取豆瓣电影top250_利用python爬取豆瓣电影Top250,并把数据放入MySQL数据库...

    在学习了python基础后,一心想着快速入门爬虫,因为我就是为爬虫而学的python,所以就找了这个豆瓣电影来爬取.好了,废话不多说,进入正题 1.找到网页并分析网页结构 首先进入豆瓣电影Top250 ...

  4. python爬取网易云_利用python爬取网易云音乐,并把数据存入mysql

    作者:sergiojune Python爱好者社区--专栏作者 个人公众号:日常学python 专注python爬虫,数据可视化,数据分析,python前端技术 公众号:Python爱好者社区 获取本 ...

  5. 利用python爬取网易云音乐,并把数据存入mysql

    点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 图片源自网络 作者 sergiojune 如需转载,请联系原作者授权. 在简单学习 ...

  6. python爬取股票信息_利用Python爬取网易上证所有股票数据(代码

    利用Python爬取网易上证所有股票数据(代码 发布时间:2018-04-14 17:30, 浏览次数:1261 , 标签: Python import urllib.request import r ...

  7. 利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息

    新增:国外疫情网站介绍 已更新:爬取国外疫情数据 已更新:新型肺炎历史数据下载 2020年3月27日补充: 制作了一个全球肺炎数据查询下载网站,效果如下: 访问地址:http://119.3.227. ...

  8. python爬取电脑本地数据_利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息...

    原标题:利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息 新型肺炎肆虐全国,可以预知,最近一两年地理学中会有一部分论文研究新型肺炎的空间分布及与其他指标的关联分析.获取其患病人 ...

  9. 利用 Python 爬取了近 3000 条单身女生的数据,究竟她们理想的择偶标准是什么?

    灵感来源与学习:利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论? 本文原创作者:壹加柒 本文来源链接:https://blog.csdn.net/yu1300000363/a ...

最新文章

  1. 【js】实现分页查询操作的步骤
  2. NLP专栏|图解 BERT 预训练模型!
  3. Python字符串前加u/r/b的作用
  4. Kafka消息序列化和反序列化(下)
  5. python join() 函数的用法
  6. matlab dtft的函数,DTFT的Matlab矩阵计算的理解
  7. 在 Delphi 6 中使用 Hashtable
  8. php中fastcgi和php-fpm是什么东西
  9. [WPF]有Focus(), 那Unfocus()呢?
  10. 面试题分享,麻麻再也不用担心我的面试了
  11. 图像分类数据集(Fashion-MNIST)
  12. Modbus RTU/ASCll+TCP+OPC电脑模拟+串口调试软件对接方案
  13. ZYNQ系统中实现FAT32文件系统的SD卡读写 之二 VIVADO配置
  14. 服务器销售周总结怎么写,网管周工作总结范文的内容
  15. Lempel-Ziv算法 具体过程
  16. FPGA——时钟分频
  17. CodeForces - 1005A . Tanya and Stairways
  18. 只有真正将产业互联网看成是一种嬗变的过程,才能把握其精髓和原始奥义
  19. php 3d animation,CSS_纯CSS实现菜单、导航栏的3D翻转动画效果,我曾经向大家展示过闪光的logo - phpStudy...
  20. 敏捷转型行动笔记:内部敏捷教练培训资料分享——基础篇(夯实精益敏捷思想,掌握相关实践)

热门文章

  1. Idea中Git和SVN如何切换
  2. 记一次富途集团后台开发笔试
  3. 程序员这个职业已经不香了吗?从业10年程序员告诉你真实情况
  4. linux如何安装声卡驱动
  5. Java类定义、成员变量定义、方法定义、成员变量与局部变量的区别
  6. openresty的 opm 踩坑之旅
  7. 成都玖益科技:店铺流量怎么提升
  8. 浅议数字化双胞胎与仿真
  9. ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
  10. 上位机和Arduino的通信的解决方案