数据采集与融合技术作业2

发布时间 2023-10-08 20:42:28作者: StephenCurryykh

作业①

– 要求:在中国气象网(http://www.weather.com.cn)给定城市集的 7日天气预报,并保存在数据库。
– 输出信息:
Gitee 文件夹链接:作业链接

代码如下:

import requests
from lxml import etree
import xlwt
if __name__=='__main__':
    url = 'http://www.weather.com.cn/weather/101010100.shtml'
    response=requests.get(url=url)
    response.encoding = 'utf-8'
    response=response.text
    tree=etree.HTML(response)
    ul=tree.xpath('//*[@id="7d"]/ul')[0]
    lis=ul.xpath('./li')
    prts=[]#用来存放七天的天气数据
    num=1
    for li in lis:
        prt=[]
        day=li.xpath('./h1/text()')[0]
        wea=li.xpath('./p[@class="wea"]/text()')[0]
        tem=li.xpath('.//i/text()')[0]
        prt.append(str(num))
        prt.append('北京')
        #分别将获得的日期天气和气温存到列表中
        prt.append(day)
        prt.append(wea)
        prt.append(tem)
        prts.append(prt)
        num+=1
    print(prts)
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    sheet = book.add_sheet('sheet1', cell_overwrite_ok=True)
    #将数据写入表格
    sheet.write(0, 0, '序号')
    sheet.write(0,1,'地区')
    sheet.write(0, 2, '日期')
    sheet.write(0, 3, '气候')
    sheet.write(0,4,'温度')
    for i in range(1,len(prts)+1):  # 逐行
        for j in range(len(prts[0])):  # 逐列
            sheet.write(i, j, prts[i-1][j])  # 将指定值写入第i行第j列
    save_path = 'C:/Users/Administrator/Desktop/北京天气.xls'#保存到本地的excel文件中
    book.save(save_path)

结果如下:
image
心得体会:
本次实验采用xpath方法来做,虽然也可以使用re库,但是xpath为刚学过的知识,可以进行一些巩固,由于本题为复现,没出现什么大问题。

作业②

– 要求:用 requests 和 BeautifulSoup 库方法定向爬取股票相关信息,并
存储在数据库中。
– 候选网站:东方财富网:https://www.eastmoney.com/
新浪股票:http://finance.sina.com.cn/stock/
– 技巧:在谷歌浏览器中进入 F12 调试模式进行抓包,查找股票列表加
载使用的 url,并分析 api 返回的值,并根据所要求的参数可适当更改
api 的请求参数。根据 URL 可观察请求的参数 f1、f2 可获取不同的数
值,根据情况可删减请求的参数。

**– 输出信息:
Gitee 文件夹链接:作业链接
代码如下:

import json
import requests
import pandas as pd
if __name__=="__main__":
    page=int(input("请输入你要输入的页数: "))
    url='https://77.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408047147985914564_1696660084600&pn=%d&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1696660084601'
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit'
                     '/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'
    }
    datas=[]
    s='序号 股票代码 股票名称 最新报价 涨跌额 成交量 成交额 振幅 最高 最低 今开 昨收'
    for i in range(1,page+1):
        newurl=format(url%i)
        response=requests.get(url=newurl,headers=headers).text
        response=response[42:-2]
        data=json.loads(response)
        data=data['data']['diff']
        datas.extend(data)
    ds = pd.DataFrame(datas)
    df = ds[["f12", "f14", "f2", "f4", "f5", "f6", "f7", "f15", "f16", "f17","f18"]]
    df.columns = ["股票代码", "股票名称", "最新报价", "涨跌额", "成交量(手)", "成交额(手)", "振幅(%)", "最高", "最低","今开","昨收"]
    pd.set_option('display.max_columns', None)
    pd.set_option('display.max_rows', None)
    pd.set_option('expand_frame_repr', False)
    print(df)
    df.to_excel("C:/Users/Administrator/Desktop/股票.xlsx")
    print("任务完成")

结果如下:
image
excel结果为:
image
心得体会:
本题要求爬取的是股票的相关数据,涉及到翻页操作,通过观察不同页面的url可以发现url之间只是携带的参数pn不同而已
所以我们将pn这个参数设为变量即可爬取不同页面的数据。
于此同时,因为请求到的数据类型是json型,所以还涉及到对json数据的处理,了解到了如何处理json型数据。

作业③

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

分析:
用f12打开抓包工具,由于进行所有大学数据的爬取,我们直接在过滤器中搜索福州大学,找到与福州大学有关的返回文件即可。
分析过程动图如下:
image

代码如下:

import requests
import re
if  __name__=="__main__":
    url = 'https://www.shanghairanking.cn/_nuxt/static/1695811954/rankings/bcur/2021/payload.js'
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                     'Chrome/69.0.3947.100 Safari/537.36'
    }
    response=requests.get(url=url,headers=headers).text
    x='univNameCn:"(.*?)"'
    y='score:(.*?),'
    name=re.findall(x,response,re.S)
    score=re.findall(y,response,re.S)
    print("排名 学校 总分")
    fp = open("./大学排名.txt", "w", encoding='utf-8')
    fp.write("排名 学校 总分\n")
    for i in range(0,len(name)):
        print(str(i+1)+' '+name[i]+' '+score[i])
        fp.write(str(i+1)+' '+name[i]+' '+score[i]+'\n')
    fp.close()
    print("任务完成")

结果如下:
image
心得体会:
刚看到题目时以为和上一次做过的一样,于是准备用之前的方法做,但是发现无法实现翻页,每一页的url都相同,刚开始是准备用selenium库来处理,后来在返回的文件中发现了一个包含所有大学数据的响应,于是就用re库暴力破解,存储到txt文件中。
这次实验比前两次更棘手,因为这个翻页处理应该属于动态的,返回的数据类型不是熟悉的html文件或者json文件,不由得有些陌生感。这次实验提醒我们要加强对爬虫技术的理解与深造,以不变应万变,从容应对各种类型的网站。