程序员的资源宝库

网站首页 > gitee 正文

数据采集与融合实践第二次实验作业

sanyeah 2024-03-29 15:22:04 gitee 7 ℃ 0 评论

作业1

在中国气象网给定城市爬取七日天气

  • Gitte文件夹链接:https://gitee.com/prettykuromi/102102137/tree/master/作业2/问题1
  • 首先点击链接进入网页,分析网页html结构,发现相关数据存储在一个个li中
  • 根据分析结果编写findElement函数,用于寻找网页中所需的信息,尽可能实现精确定位,主要代码如下:
def findElement(html):
    soup = BeautifulSoup(html, 'html.parser')
    rows=[]
    try:
        #尽量精确查找
        ul_element=soup.select("div[id='7d'] ul[class='t clearfix']")
        li_elements=ul_element[0].select('li')
        for li_element in li_elements:
            Date=li_element.select_one('h1').text.strip()
            Wea=li_element.select_one("p[class='wea']").text.strip()
            Tem=li_element.select_one("p[class='tem'] i").text.strip()
            row = Date + '-' + Wea + '-' + Tem
            rows.append(row)
    except Exception as err:
        print(err)
    return rows

  • 然后将读取到的数据存储到数据库中并提交保存
#部分代码
for row in rows:
    row=row.split('-')
    if(len(row)==3):
        sql='insert into Weathers (Date,Wea,Tem) values(?,?,?)'
        try:
            Date=row[0]
            Wea=row[1]
            Tem=row[2]
            cursor.execute(sql,(Date,Wea,Tem))
        except Exception as err:
            print(err)
# 数据库提交保存
con.commit()
con.close()
  • 最后编写showDB函数用于在终端输出数据库中的内容
def showDB():
    print("Hello 102102137,Showing data from DB...")
    try:
        con=sqlite3.connect('Weathers.db')
        cursor=con.cursor()
        cursor.execute('select * from Weathers')
        #获取查询结果集中的所有行,并将它们作为元组的列表返回
        rows=cursor.fetchall()
        print('日期\t天气\t温度')
        for row in rows:
            print(row[0]+'\t'+row[1]+'\t'+row[2])
        con.close()
    except Exception as err:
        print(err)
  • 然后获取页面并调用上述函数,即可成功获取杭州市七日内天气数据

心得体会

  1. 爬取网页的时候一定要仔细分析页面html结构,如果元素选择器写错就无法实现对应功能
  2. 数据存储到数据库中时要注意数据类型与实际数据的匹配
  3. 做实验的时候不能心急,要细心仔细防止代码出bug

作业2

爬取股票相关信息并存储在数据库中

  • Gittee文件夹链接:https://gitee.com/prettykuromi/102102137/tree/master/作业2/问题2

  • 准备爬取东方财富网中的股票相关信息,首先f12进行调试分析,获取到该网站传送数据的json文件,gif图如下:

  • 该json文件中通过简单正则表达式匹配与转换,即可获取字典类型的数据

#获取页面信息并使用正则表达式提取所需信息
resp = urllib.request.urlopen(url)
data = resp.read()
data = data.decode('utf-8')
pat = r'\[(.*?)\]'  # 正则表达式
data = re.search(pat, data).group()
dataList = eval(data)  # 现在data是一个数组,其中存放字典
  • 再分析json文件的网址结构,发现通过网址中的pn=?来控制不同页数,因此调用循环即可获取不同页面中的数据
  • 获取数据后再将数据存入数据库中,相关函数与第一题类似,在此不再展示
  • 共爬取200条数据,数据库中部分数据展示如下:

心得体会

  • 在f12调试抓包时要留意数据所在的json文件,同时分析不同页面间的url的关系,以更好爬取数据
  • 使用正则表达式时要细心,正确获取所需数据

作业3

爬取中国大学2021排名信息

  • Gittee文件夹链接:https://gitee.com/prettykuromi/102102137/tree/master/作业2/问题3

  • 首先f12进行抓包,获取服务器发送数据的json文件

  • 分析该json文件,首先可以使用正则表达式获得所需的姓名、省市等信息

resp = requests.get('https://www.shanghairanking.cn/_nuxt/static/1695811954/rankings/bcur/2021/payload.js')
res = resp.content
res = str(res, 'utf-8')
names = re.findall('NameCn:"(.*?)"', res)  # 获取大学名字
provinces = re.findall("province:(.)", res)  # 大学所在省市
Types = re.findall("univCategory:(.)", res)  # 大学类型
scores = re.findall("score:(.*?),ranking", res)  # 大学分数
  • 但仔细观察发现,除大学名字外,其他数据均由变量表示,变量和其对应的值分别在json文件头部和尾部,因此使用正则表达式获取变量和其值对应的字典
# 从页面的首部和尾部得到那个列表
KeyList = re.findall(r'function\((.*?)\)', res)
KeyList = KeyList[0].split(',')

ValueList = re.findall(r'mutations:\[\]\}\}\((.*?)\)', res)
ValueList = ValueList[0].split(',')[:-3]  # 切除最后三项元素

dataDic = {}  # 存放形参和其值对应的字典
for key in KeyList:
    dataDic[key] = ""
for key, value in zip(KeyList, ValueList):
    dataDic[key] = value
  • 然后在字典中对省市、大学类型、大学分数等数据进行赋值
for i in range(len(names)):
    #给省份和类型赋具体值
    provinces[i] = dataDic[provinces[i]].replace('"', '').replace('(','').replace(')','')
    Types[i] = dataDic[Types[i]].replace('"', '')
  • 获取数据后再将数据存入数据库中,相关函数与第一题类似,在此不再展示
  • 成功获取所有大学信息,数据库中数据展示如下:
    数据开始部分:

    数据结尾部分:

心得体会

  1. f12抓包时一定要注意仔细检查json文件中存放的数据和其特点,比如该网站中就是较为特殊的将数据以形参形式存放
  2. 存放数据库时注意检查数据是否有多余无用符号,比如多余的引号或括号,如有需要删除

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表