資料採集第二次作業

xingheer發表於2024-10-15

資料採集實踐第二次作業

目錄

點選展開/收起
  • 作業①:定向爬取7日天氣預報
  • 作業②:定向爬取股票相關資訊
  • 作業③:定向爬取中國大學2021主榜資訊
  • 總結

● 碼雲連結 作業1 · xh102202145/crawl_project


作業①:定向爬取7日天氣預報

1.1 實驗要求

在中國氣象網(http://www.weather.com.cn)上爬取給定城市的7日天氣預報,並將資料儲存到資料庫中。

1.2 實驗思路

  1. 使用 requests 向中國氣象網傳送請求,獲取城市天氣預報資料。
  2. 利用 BeautifulSoup 解析返回的HTML內容,提取目標天氣資訊。
  3. 將資料儲存至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 執行結果

image

1.5 心得體會


作業②:定向爬取股票相關資訊

2.1 實驗要求

使用 requestsBeautifulSoup 定向爬取股票相關資訊,並將資料儲存在資料庫中。

2.2 實驗思路

  1. 使用谷歌瀏覽器的F12除錯模式分析股票資訊載入的API。
  2. 使用 requests 向API傳送請求,獲取股票資料。
  3. 使用 BeautifulSoup 解析網頁,提取公司名稱、股票程式碼、最新價格等資訊。
  4. 將提取的資料儲存至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 執行結果

image

股票資料成功儲存至資料庫中,包含股票程式碼、公司名稱、最新價格、漲跌幅等資訊。

2.5 心得體會


作業③:定向爬取中國大學2021主榜資訊

3.1 實驗要求

爬取中國大學2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)
所有院校資訊,並儲存在資料庫中。將瀏覽器F12除錯分析的過程錄製為Gif並加入部落格中。

3.2 實驗思路

  1. 使用F12除錯模式分析網頁的發包情況,查詢用於載入資料的API。
  2. 使用 requests 向API傳送請求,獲取返回的大學排名資料。
  3. 使用 BeautifulSoupjson 解析返回的資料,提取學校名稱、排名、所在省市等資訊。
  4. 將資料儲存到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 執行結果

image

3.5 執行結果瀏覽器F12除錯分析的過程

3.6 心得體會


總結

本次作業透過 requestsBeautifulSoup 實現了對7日天氣預報、股票資訊以及中國大學排名的爬取和儲存任務。透過F12除錯分析,我們能深入瞭解網頁發包情況並高效獲取資料。

相關文章