作业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)
- 然后获取页面并调用上述函数,即可成功获取杭州市七日内天气数据
心得体会
- 爬取网页的时候一定要仔细分析页面html结构,如果元素选择器写错就无法实现对应功能
- 数据存储到数据库中时要注意数据类型与实际数据的匹配
- 做实验的时候不能心急,要细心仔细防止代码出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('"', '')
- 获取数据后再将数据存入数据库中,相关函数与第一题类似,在此不再展示
- 成功获取所有大学信息,数据库中数据展示如下:
数据开始部分:
数据结尾部分:
心得体会
- f12抓包时一定要注意仔细检查json文件中存放的数据和其特点,比如该网站中就是较为特殊的将数据以形参形式存放
- 存放数据库时注意检查数据是否有多余无用符号,比如多余的引号或括号,如有需要删除
本文暂时没有评论,来添加一个吧(●'◡'●)