热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据采集与融合技术实验二

作业①:我的Gitee要求:在中国气象网(http:www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。输出信息:序号地区日期天气信息温度1北京7日(今

作业①:



    我的Gitee


  • 要求:在中国气象网

    (http://www.weather.com.cn)

    给定城市集的7日天气预报,并保存在数据库。


  • 输出信息:






















































    序号地区日期天气信息温度
    1北京7日(今天)晴间多云,北部山区有阵雨或雷阵雨转晴转多云31℃/17℃
    2北京8日(明天)多云转晴,北部地区有分散阵雨或雷阵雨转晴34℃/20℃
    3北京9日(后台)晴转多云36℃/22℃
    4北京10日(周六)阴转阵雨30℃/19℃
    5北京11日(周日)阵雨27℃/18℃
    6......

    (1)爬取中国气象网网页内容

    实验过程

    1.创建weather.db数据库,内涵开关,插入数据,打印数据的功能(代码如下)

    class WeatherDB:
    # 打开数据库
    def openDB(self):
    self.con=sqlite3.connect("weathers.db")
    self.cursor=self.con.cursor()
    try:
    self.cursor.execute("create table weathers (wCity varchar(16),wDate varchar(16),wWeather varchar(64),wTemp varchar(32),constraint pk_weather primary key (wCity,wDate))")
    except:
    self.cursor.execute("delete from weathers")
    # 关闭数据库
    def closeDB(self):
    self.con.commit()
    self.con.close()
    # 插入数据
    def insert(self, city, date, weather, temp):
    try:
    self.cursor.execute("insert into weathers (wCity,wDate,wWeather,wTemp) values (?,?,?,?)",
    (city, date, weather, temp))
    except Exception as err:
    print(err)
    # 打印数据
    def show(self):
    self.cursor.execute("select * from weathers")
    rows = self.cursor.fetchall()
    # print("%-16s%-16s%-32s%-16s" % ("city", "date", "weather", "temp"))
    # print(“{0:{4}^16}{1:{4}^16}{2:{4}^32}{3:{4}^32}”.format(“city”,“date”,“weather”,“temp”,chr(12288)))
    tplt = "{0:^10}\t{1:{4}^9}\t{2:{4}^16}\t{3:^7}"
    print("{0:^12}\t{1:^13}\t{2:^19}\t{3:^0}".format("city", "date", "weather", "temp", chr(12288)))
    for row in rows:
    # print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))
    print(tplt.format(row[0], row[1], row[2], row[3], chr(12288)))

    2.建立 WeatherForecast类,通过观察url,得到以下代码:

    url = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"

    设定citycode

    self.cityCode = {"北京": "101010100", "福州": "101230101", "武汉": "101230101", "香港": "101320101"}

    3.通过urllib.request方法获取html,在通过beautiful soup方法爬取数据

    req = urllib.request.Request(url, headers=self.headers)
    data = urllib.request.urlopen(req)
    data = data.read()
    dammit = UnicodeDammit(data, ["utf-8", "gbk"])
    data = dammit.unicode_markup
    soup = BeautifulSoup(data, "lxml")
    lis = soup.select("ul[class='t clearfix'] li")
    for li in lis:
    try:
    date = li.select('h1')[0].text
    weather = li.select('p[class="wea"]')[0].text
    temp = li.select("p[class='tem']")[0].text.strip()

    运行结果


    心得体会:

    通过本次实验了解到了创建数据库的类方法实现,至于爬虫部分运用的是之前经常使用的beautiful soup方法,较为熟练。


    作业②:



      我的Gitee


    • 要求:用requests和自选提取信息方法定向爬取股票相关信息,并存储在数据库中。

      候选网站:东方财富网:https://www.eastmoney.com/

      新浪股票:http://finance.sina.com.cn/stock/

      技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url,并分析api

      返回的值,并根据所要求的参数可适当更改api的请求参数。根据URL可观察请求的参数f1、

      f2可获取不同的数值,根据情况可删减请求的参数。

      参考链接:[https://gitee.com/chen-benyuan/CHEN/blob/master/实验二/实验二作业三.py)



    • 输出信息:




















































      序号股票代码股票名称最新报价涨跌幅涨跌额成交量成交额振幅最高最低今开昨收
      1688093N世华28.4762.22%10.9226.13万7.6亿22.3432.028.0830.217.55
      2......

      (2)爬取股票相关信息

      实验过程

      1.在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url

      url = "http://59.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124004035526877987472_1634114986169\
      &pn="+str(page)+"&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&\
      fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1634114986170"

      2.导入JsonSearch,先通过正则表达式拆枝,将不是json格式的部分去除,在利用

      jsOndata= JsonSearch(object=json2, mode='j'),调用jsOndata=search_all_value方法

      pat = "jQuery1124004035526877987472_1634114986169 \((.*?)\)"
      str1 = re.compile(pat,re.S).findall(str)[0]
      json2 = json.loads(str1)
      jsOndata= JsonSearch(object=json2, mode='j')
      Symbollist = jsondata.search_all_value(key='f12')
      namelist = jsondata.search_all_value(key='f14')
      # 这里展示一部分

      3.利用数据库插入功能进行数据插入

      self.db.insert( index,Symbollist[i], namelist[i], LastTradelist[i], Chglist[i], Changelist[i], Volume, Turnover, slist[i], helist[i], lelist[i], Openlist[i], PrevCloselist[i])

      至于创建数据库的过程与题目一类似,这里不做展示,见源代码

      运行结果


      心得体会

      本次作业与之前几次显然不同,刚刚开始感觉一头雾水,东方财富网页面包含的所有股票信息被分成了多个板块,导致我们无法直接通过网页的url爬取所有数据,因此本题采用动态抓包,使用f12进行抓包抓取js,分析得到数据对应的url就能实现爬取操作。紧接着可以通过严格的json格式,进行jsonSearch,或者正则表达式筛选信息都可以。


      作业③:



        我的Gitee


      • 要求:爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所
        有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。
        技巧:分析该网站的发包情况,分析获取数据的api

      • 输出信息:
















        排名学校总分
        1清华大学969.2

        (3)爬取大学相关信息

        实验过程

        1.一页20个大学,可以考虑翻页,但也可以选择用抓包的方法,获取js

        url = "https://www.shanghairanking.cn/_nuxt/static/1632381606/rankings/bcur/2021/payload.js"

        2.对抓包得到的数据进行正则匹配:

        score = r'score:(.*?),'
        scorelist = re.findall(score,data)
        # print(scorelist)
        name = r'univNameCn:"(.*?)"'
        namelist = re.findall(name,data)

        部分学校总分数据有异常采用如下方法处理

        for i in range(len(namelist)):
        try:
        if 'a'<=scorelist[i]<='z' or 'A'<=scorelist[i]<='Z':
        ulist.append([i+1,namelist[i], "--"])
        else:
        ulist.append([i + 1, namelist[i], scorelist[i]])

        原本以为是混入了乱码直接用--代替,后来发现与整个js文件首尾的键值对有关所以又做了以下处理:

        key = re.findall(r'function\((.*?)\)', data) # 获取键
        str = ''.join(key)
        key2 = str.split(',')
        # print(key2)
        value = re.findall(r'"",(.*?)\)', data)
        str2 = ''.join(value)
        # print(str2)
        str3 = str2.replace('"',"")
        # print(str3)
        value2 = str3.split(',')
        # print(value2) # 获取值

        获取了键值对后与srocelist和ranklist进行比较(这里特别处理了"h:一流学科"的错误)

        for i in range(len(scorelist)):
        for j in range(len(key2)):
        if scorelist[i]==key2[j]:
        scorelist[i]=value2[j]
        elif ranklist[i]==key2[j]:
        ranklist[i]=value2[j]
        ranklist[210] = "211"

        3.插入数据库(一样的操作)

        运行结果

        更改后的结果

        可以与上面的结果进行对比,完美解决。(这里的图样式和上面的不太一样,原因是pycharm出了点毛病,被我重装了)


        心得体会

        第三题所用的技术与第二题类似,本次实验对于抓包有了全面的认识,第二题用search_all_value分析js,第三题则采用另一种正则表达式分析。

        gif:




推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
拟称2502902853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有