資料採集實踐第二次作業
目錄
點選展開/收起
- 作業①:定向爬取7日天氣預報
- 作業②:定向爬取股票相關資訊
- 作業③:定向爬取中國大學2021主榜資訊
- 總結
● 碼雲連結 作業1 · xh102202145/crawl_project
作業①:定向爬取7日天氣預報
1.1 實驗要求
在中國氣象網(http://www.weather.com.cn)上爬取給定城市的7日天氣預報,並將資料儲存到資料庫中。
1.2 實驗思路
- 使用
requests
向中國氣象網傳送請求,獲取城市天氣預報資料。 - 利用
BeautifulSoup
解析返回的HTML內容,提取目標天氣資訊。 - 將資料儲存至SQLite資料庫。
1.3 主要程式碼塊
點選檢視程式碼
# 爬取天氣資料類
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"}
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()
soup = BeautifulSoup(data, "lxml")
lis = soup.select("ul[class='t clearfix'] li")
for li in lis:
try:
date = li.select('h1')[0].text if li.select('h1') else "N/A"
weather = li.select('p[class="wea"]')[0].text if li.select('p[class="wea"]') else "N/A"
temp_high = li.select('p[class="tem"] span')[0].text if li.select('p[class="tem"] span') else "N/A"
temp_low = li.select('p[class="tem"] i')[0].text if li.select('p[class="tem"] i') else "N/A"
temp = temp_high + "/" + temp_low
print(city, date, weather, temp)
self.db.insert(city, date, weather, temp)
except Exception as err:
print("Error parsing data:", err)
except Exception as err:
print("Error accessing URL:", err)
def process(self, cities):
self.db = WeatherDB()
for city in cities:
self.forecastCity(city)
self.db.close()
1.4 執行結果
1.5 心得體會
作業②:定向爬取股票相關資訊
2.1 實驗要求
使用 requests
和 BeautifulSoup
定向爬取股票相關資訊,並將資料儲存在資料庫中。
2.2 實驗思路
- 使用谷歌瀏覽器的F12除錯模式分析股票資訊載入的API。
- 使用
requests
向API傳送請求,獲取股票資料。 - 使用
BeautifulSoup
解析網頁,提取公司名稱、股票程式碼、最新價格等資訊。 - 將提取的資料儲存至SQLite資料庫。
2.3 主要程式碼塊
點選檢視程式碼
# 獲取頁面輸入
keypage = input("請輸入要搜尋的頁面:")
searchlist = list(map(int, keypage.split()))
# 遍歷每一頁進行資料爬取
for page in searchlist:
url = f'http://76.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405166990298085778_1696666115151&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1696666115152'
response = requests.get(url, headers=headers)
data = response.text
# 提取括號中的JSON資料
start = response.text.find('(')
end = response.text.rfind(')')
data = response.text[start + 1:end]
data = json.loads(data)
# 提取股票資訊
data = data['data']['diff']
plist = ['f12', 'f14', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f15', 'f16', 'f17', 'f18', 'f10', 'f8', 'f9', 'f23']
for stock in data:
row = tuple(stock[field] for field in plist)
cursor.execute('''INSERT INTO my_table (code, name, latest_price, change_percent, change_amount,
volume, turnover, amplitude, high, low, opening_price, yesterday_close,
volume_ratio, turnover_rate, pe_ratio, pb_ratio)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', row)
# 提交更改並關閉資料庫連線
conn.commit()
2.4 執行結果
股票資料成功儲存至資料庫中,包含股票程式碼、公司名稱、最新價格、漲跌幅等資訊。
2.5 心得體會
作業③:定向爬取中國大學2021主榜資訊
3.1 實驗要求
爬取中國大學2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)
所有院校資訊,並儲存在資料庫中。將瀏覽器F12除錯分析的過程錄製為Gif並加入部落格中。
3.2 實驗思路
- 使用F12除錯模式分析網頁的發包情況,查詢用於載入資料的API。
- 使用
requests
向API傳送請求,獲取返回的大學排名資料。 - 使用
BeautifulSoup
或json
解析返回的資料,提取學校名稱、排名、所在省市等資訊。 - 將資料儲存到SQLite資料庫,並錄製除錯分析的過程。
3.3 主要程式碼塊
點選檢視程式碼
url = "https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2021/payload.js"
resquest = requests.get(url=url)
name = re.findall(',univNameCn:"(.*?)",',resquest.text)#獲取學校名稱
score = re.findall(',score:(.*?),',resquest.text)#獲取學校總分
category = re.findall(',univCategory:(.*?),',resquest.text)#獲取學校型別
province = re.findall(',province:(.*?),',resquest.text)#獲取學校所在省份
3.4 執行結果
3.5 執行結果瀏覽器F12除錯分析的過程
3.6 心得體會
總結
本次作業透過 requests
和 BeautifulSoup
實現了對7日天氣預報、股票資訊以及中國大學排名的爬取和儲存任務。透過F12除錯分析,我們能深入瞭解網頁發包情況並高效獲取資料。