数据采集与融合技术实践作业二
数据采集与融合技术作业二
码云链接:2022级数据采集与融合技术 - 码云 (gitee.com)
作业①:
·在中国气象网(http://www.weather.com.cn)给定城市集的7 日天气预报,并保存在数据库。
·输出信息: Gitee 文件夹链接
(1)实验过程
通过F12寻找相关信息:
部分代码:
定义了名为 WeatherDB
的类,管理 weathers.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"))
for row in rows:
print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))
定义 WeatherForecast
类,用于从特定城市的天气网站抓取未来几天的天气预报,并将这些信息存储到数据库中,最后输出数据库中的所有天气记录。
class WeatherForecast:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
self.cityCode = {"北京": "101010100", "上海": "101020100", "广州": "101280101", "深圳": "101280601","福州":"101230101"}
def forecastCity(self, city):
if city not in self.cityCode.keys():
print(city + " code cannot be found")
return
url = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"
try:
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"] span')[0].text + "/" + li.select('p[class="tem"] i')[0].text
print(city, date, weather, temp)
self.db.insert(city, date, weather, temp)
except Exception as err:
print(err)
except Exception as err:
print(err)
def process(self, cities):
self.db = WeatherDB()
self.db.openDB()
for city in cities:
self.forecastCity(city)
print("\n")
print("开始输出数据库:\n")
self.db.show()
self.db.closeDB()
ws = WeatherForecast()
ws.process(["北京", "上海", "广州", "深圳","福州"])
print("completed")
print("输出数据库完成")
输出结果:
(2)心得体会
作业①:中国气象网7日天气预报数据采集与数据库存储
通过这次作业,我学会了如何利用Python的requests和BeautifulSoup库来爬取中国气象网的7日天气预报数据。在这个过程中,我学会了如何分析和处理HTML页面结构此外,我还熟练掌握了SQLite数据库的基本操作,包括创建表、插入数据和查询数据。通过实际操作,我对数据库的工作原理有了更深入的理解
作业②:
·要求:用requests 和BeautifulSoup 库方法定向爬取股票相关信息,并存储在数据库中。
·候选网站:东方财富网:https://www.eastmoney.com/ 新浪股票:http://finance.sina.com.cn/stock/
·技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加 载使用的url,并分析api返回的值,并根据所要求的参数可适当更改 api 的请求参数。根据URL可观察请求的参数f1、f2可获取不同的数值,根据情况可删减请求的参数。
·参考链接:https://zhuanlan.zhihu.com/p/50099084
·输出信息: Gitee 文件夹链接
(1)实验过程
通过F12抓包结果:
部分代码:
从指定的 URL 获取股票数据,解析这些数据,并将解析出的数据插入到数据库中。
def getData(url, gupiao, db):
response = requests.get(url)
database = []
daima = re.findall('f12":"(.*?)",', response.text)
name = re.findall('f14":"(.*?)",', response.text)
newprice = re.findall('f2":(.*?),', response.text)
diezhanfu = re.findall('f4":(.*?),', response.text)
diezhane = re.findall('f3":(.*?),', response.text)
cjl = re.findall('f5":(.*?),', response.text)
cje = re.findall('f6":(.*?),', response.text)
zf = re.findall('f7":(.*?),', response.text)
zg = re.findall('f15":(.*?),', response.text)
zd = re.findall('f16":(.*?),', response.text)
jk = re.findall('f17":(.*?),', response.text)
zs = re.findall('f18":(.*?),', response.text)
for i in range(0, len(zs)):
data = []
data.append(str(i+1))
data.append(name[i])
data.append(daima[i])
data.append(newprice[i])
data.append(diezhanfu[i])
data.append(diezhane[i])
data.append(cjl[i])
data.append(cje[i])
data.append(zf[i])
data.append(zg[i])
data.append(zd[i])
data.append(jk[i])
data.append(zs[i])
database.append(data)
db.insert(i+1, daima[i], name[i], newprice[i], diezhanfu[i], diezhane[i], cjl[i], cje[i], zf[i], zg[i], zd[i], jk[i], zs[i])
print("已保存数据到数据库")
输出结果:
(2)心得体会
作业②:东方财富网股票信息定向爬取与数据库存储
在完成这个作业的过程中,我深入学习了如何使用requests库和正则表达式来爬取东方财富网上的股票信息。这个任务让我更加熟悉了HTTP请求的过程,以及如何处理和解析JSON数据。我还学会了如何使用F12开发者工具进行网页抓包,这对于我来说是一个全新的技能。通过这个项目,我对网络请求和响应的处理有了更深入的了解,并且提高了我的问题解决能力。同时,我也加深了对数据库存储机制的理解,特别是在设计数据库结构和优化查询性能方面。
作业③:
·要求:爬取中国大学2021主榜 (https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加 入至博客中。
·技巧:分析该网站的发包情况,分析获取数据的api
·输出信息: Gitee 文件夹链接
排名 学校 省市 类型 总分
1 清华大学 北京 综合 969.2
(1)实验过程
通过F12抓包:
部分代码:
部分数据使用字母代替,也需要把数据爬取出来,一一对应。
定义 parse_data
的方法,解析包含大学信息的文本数据,并提取出各个大学的名称、分数、类别和省份等信息。具体实现步骤:
- 使用正则表达式
re.findall
从输入的文本text
中提取大学名称(name
)、分数(score
)、类别(category
)和省份(province
)。 - 同样使用正则表达式提取出
code_name
,这是一段包含编码的字符串,用于映射省份、类别和分数的索引。 - 再次使用正则表达式提取出
value_name
,这是一段包含实际省份、类别名称和分数的字符串。 - 初始化一个空列表
universities
,用于存储解析后的大学信息。 - 遍历提取出的大学名称列表,对于每个大学:
- 使用
code_name.index(province[i])
获取省份的索引,并用它从value_name
中获取对应的省份名称。 - 同样方法获取类别名称。
- 尝试将分数
score[i]
转换为浮点数。如果转换失败(即分数是字符串形式的非数字内容),则尝试从value_name
中获取对应的分数,并再次尝试转换为浮点数。
- 使用
- 将每个大学的信息(排名、名称、省份、类别和分数)作为一个元组添加到
universities
列表中。 - 返回包含所有大学信息的
universities
列表。
def parse_data(self, text):
name = re.findall(',univNameCn:"(.*?)",', text)
score = re.findall(',score:(.*?),', text)
category = re.findall(',univCategory:(.*?),', text)
province = re.findall(',province:(.*?),', text)
code_name = re.findall('function(.*?){', text)
start_code = code_name[0].find('a')
end_code = code_name[0].find('pJ')
code_name = code_name[0][start_code:end_code].split(',')
value_name = re.findall('mutations:(.*?);', text)
start_value = value_name[0].find('(')
end_value = value_name[0].find(')')
value_name = value_name[0][start_value+1:end_value].split(",")
universities = []
for i in range(len(name)):
province_name = value_name[code_name.index(province[i])][1:-1]
category_name = value_name[code_name.index(category[i])][1:-1]
# 尝试将成绩转换为浮点数,如果失败则保留原字符串
try:
score_value = float(score[i])
except ValueError:
score_value = score[i]
score_value = value_name[code_name.index(score[i])].strip().strip('"').strip("'")
score_value = float(score[i])
universities.append((i+1, name[i], province_name, category_name, score_value))
return universities
输出结果:
(2)心得体会
作业③:中国大学排名信息爬取与数据库存储
这个作业让我学会了如何爬取复杂网站上的数据,并且处理了数据中的编码问题。我使用了Python的requests库来发送网络请求,并利用正则表达式来解析返回的JavaScript代码。这个过程中,我学会了如何分析网站的API请求,并从中提取有用的数据。此外,我还掌握了如何处理和存储大量数据到SQLite数据库中,通过这个项目,我不仅提高了我的编程能力,还增强了我的数据分析和处理能力。同时,我面临了一个特别的挑战:部分数据使用字母代替,这要求我在爬取数据时必须更加细致和精确。这个任务教会了我如何识别和处理非结构化数据,以及如何确保数据的完整性和准确性。对F12开发者工具进行网页抓包的过程更加熟练,通常都是通过对应页面的文字来确定js文件。