数据采集与融合技术第二次作业
Gitee地址:https://gitee.com/wang-zi-lian20031002/crawl_project
一、在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库
1、核心代码与效果图展示
- 核心代码
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")
x = 0
for li in lis:
try:
date = li.select('h1')[0].text
weather = li.select('p[class="wea"]')[0].text
if x == 0: # 为今天只有一个温度做判断 <i>14℃</i>
x += 1
temp = li.select('p[class="tem"] i')[0].text
else:
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)
- 效果图展示
2、心得体会
这个程序利用递归函数来计算一个数的阶乘。递归是一种强大的编程方法,它通过函数自我调用简化了问题的解决方案。总的来说,这次编程练习不仅加深了我对递归理解,也提醒我在实际应用中要权衡不同的编程方法
二、用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中
1、核心代码与效果图展示
- 核心代码
url = 'https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409840494931556277_1633338445629&pn=1&pz=10&po=1&np=1&fltt=2&invt=2&fid=f3&fs=b:MK0021&fields=f12,f14,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f18,f15,f16,f17,f23'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
# 去除不必要的字符,提取有效的JSON部分
response_text = response.text.split('(', 1)[1].rsplit(')', 1)[0]
stock_data = json.loads(response_text)['data']['diff'] # 解析JSON并提取有用的字段
return stock_data
# 打印每行数据
for row in rows:
# 尝试将字段转换为浮点数,如果失败则使用0.0
latest_price = float(row[3]) if row[3] not in ('-', None) else 0.0
change_percent = float(row[4]) if row[4] not in ('-', None) else 0.0
change_amount = float(row[5]) if row[5] not in ('-', None) else 0.0
amplitude = float(row[8]) if row[8] not in ('-', None) else 0.0
high = float(row[9]) if row[9] not in ('-', None) else 0.0
low = float(row[10]) if row[10] not in ('-', None) else 0.0
open_price = float(row[11]) if row[11] not in ('-', None) else 0.0
yesterday_close = float(row[12]) if row[12] not in ('-', None) else 0.0
print(f"{row[0]:<5} {row[1]:<10} {row[2]:<10} "
f"{latest_price:<10.2f} {change_percent:<10.2f} {change_amount:<10.2f} "
f"{row[6]:<10} {row[7]:<15} {amplitude:<10.2f} {high:<10.2f} "
f"{low:<10.2f} {open_price:<10.2f} {yesterday_close:<10.2f}")
- 效果图展示
2、心得体会
通过模拟获取股票数据的过程,我理解了API在实时数据获取中的重要性。这让我意识到在现代编程和数据科学领域,能够有效地从外部源获取数据是一项基本技能。这个练习让我更加熟悉了Python中json库的使用
三、爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中
1、核心代码与效果图展示
- 核心代码
# 目标网址
url = "https://www.shanghairanking.cn/rankings/bcur/2021"
# 获取网页内容
response = urllib.request.urlopen(url)
web_content = response.read()
# 使用BeautifulSoup解析网页
soup = BeautifulSoup(web_content, 'html.parser')
# 查找包含排名信息的表格或元素
table = soup.find('table') # 假设排名信息在一个表格里
# 连接到SQLite数据库(如果数据库不存在,会自动创建)
conn = sqlite3.connect('ranking_data.db')
cursor = conn.cursor()
for row in table.find_all('tr')[1:]: # 跳过表头行
cols = row.find_all('td')
rank = cols[0].get_text(strip=True)
school_name = cols[1].get_text(strip=True)
province = cols[2].get_text(strip=True)
school_type = cols[3].get_text(strip=True)
score = cols[4].get_text(strip=True)
- 效果图展示
2、心得体会
在这次实践中,我尝试使用Python的urllib.request
和BeautifulSoup
库来抓取一个网页上的排名信息,并将这些信息存储到SQLite数据库中。这个过程不仅让我对Python的网络爬虫和数据存储技术有了更深入的了解,也让我在实践中遇到了一些挑战,并从中获得了宝贵的经验和教训