ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-18 20:35:40  阅读:172  来源: 互联网

标签:url self 融合 采集 weather 实验 print data row


作业①:


    我的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)


    • 输出信息:

      序号 股票代码 股票名称 最新报价 涨跌幅 涨跌额 成交量 成交额 振幅 最高 最低 今开 昨收
      1 688093 N世华 28.47 62.22% 10.92 26.13万 7.6亿 22.34 32.0 28.08 30.2 17.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:

标签:url,self,融合,采集,weather,实验,print,data,row
来源: https://www.cnblogs.com/a820845164/p/15404300.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有