数据采集与融合技术作业二
数据采集与融合技术作业二
总仓库链接
(每题后面附带具体的两个链接)
作业1:
要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。
代码和结果
思路:
设计数据库,用于存储爬取的天气预报数据。这个模型包括城市、日期、天气状况和温度等字段。
class WeatherDB:
def __init__(self):
self.con = sqlite3.connect("weathers.db")
self.cursor = self.con.cursor()
self.cursor.execute(
"CREATE TABLE weathers (wCity VARCHAR(16), wDate VARCHAR(16), Weather VARCHAR(64), wTemp VARCHAR(32), PRIMARY KEY (wCity, wDate))")
编写爬虫
try:
req = urllib.request.Request(url, headers=self.headers)
data = urllib.request.urlopen(req).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)
运行结果:
心得体会:
通过这次作业,我不仅学会了如何使用Python进行网页爬取和数据提取,还学会了如何设计数据库此外,遇到的问题是我想下载navicat以方便查看数据库但是没有找到可行的破解版。
作业2
要求:用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中。
代码和结果
思路:
先进行抓包
设计数据库模型
根据API返回的数据结构,我设计了一个SQLite数据库模型,包括股票的ID、名称、价格、涨跌幅、成交量等字段。这些字段能够全面地描述一只股票的基本信息。
class EquityMarketDB:
def openDB(self):
self.con = sqlite3.connect("equity_market.db")
self.cursor = self.con.cursor()
try:
self.cursor.execute(
"CREATE TABLE IF NOT EXISTS equity (
sID VARCHAR(16),
sName VARCHAR(64),
sPrice VARCHAR(16),
sRFExtent VARCHAR(16),
sRFQuota VARCHAR(16),
sNum VARCHAR(16),
sQuota VARCHAR(16),
sExtent VARCHAR(16),
sHigh VARCHAR(16),
sLow VARCHAR(16),
sToday VARCHAR(16),
sYesterday VARCHAR(16),
PRIMARY KEY (sID, sName)
)"
)
except Exception as e:
print(f"Error creating table: {e}")
编写爬虫逻辑,我使用了requests库来发送HTTP请求,获取API返回的数据。然后,使用re模块中的正则表达式来解析这些数据,提取出所需的信息。
def getHTMLText(url, loginheaders):
try:
r = requests.get(url, headers=loginheaders, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except Exception as e:
print(f"Error fetching data from {url}: {e}")
return ""
运行结果:
心得体会:
加深了我对抓包的理解,现在能比较快地找到所需要的url,学习了使用正则表达式解析数据,以及如何设计和操作SQLite数据库
作业3:
要求:爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。
代码和结果
抓包
编写爬虫逻辑
def fetch_data(self, url):
print("正在获取数据...")
response = requests.get(url)
if response.status_code != 200:
print("Failed to retrieve data")
return ""
print("数据获取成功")
return response.text
我使用了正则表达式来匹配和提取大学排名的关键信息。
def parse_data(self, text):
print("正在解析数据...")
matches = re.findall(r'"Rank"\s*:\s*(\d+),\s*"Name"\s*:\s*"(.*?)",\s*"Province"\s*:\s*"(.*?)",\s*"Score"\s*:\s*(\d+\.\d+)', text)
universities = [(int(match[0]), match[1], match[2], float(match[3])) for match in matches]
print(f"解析完成,共找到 {len(universities)} 条数据")
return universities
运行结果
心得体会:
发现没有打印出数据的情况,将已创建好的数据库删掉后就出现了,应该是不能覆盖,加深了我对数据库的处理