1. 程式人生 > 其它 >作業系統 經典同步問題

作業系統 經典同步問題

碼雲地址:https://gitee.com/a2625113421/data-acquisition-practice-i
  • 作業①:

1)、大學軟工排名資訊的爬取

– 要求:用urllib和re庫方法定向爬取給定網址https://www.shanghairanking.cn/rankings/bcsr/2020/0812的資料。
– 輸出資訊:

2020排名 全部層次 學校名稱 總分
1 前2% 清華大學 1661.0

過程:
1.向頁面傳送請求,獲取原始碼:

def get_html(url):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        req = urllib.request.Request(url, headers=headers)
        data = urllib.request.urlopen(req)
        data = data.read()
        data = data.decode()
        return data
    except Exception as err:
        print(err)

2.利用正則表示式匹配資料並存入相應列表:

def fill_univ_list(ulist,html):
    while True:
        reg = r'(<div class="ranking" data-v-68e330ae>\s+)(\d+)'
        rank = re.search(reg,html)
        reg = r'(<td data-v-68e330ae>\s+)([\u4e00-\u9fa5]\d+%)'
        level = re.search(reg,html)
        reg = r'(data-v-b80b4d60>)([\u4e00-\u9fa5]+)'
        name = re.search(reg,html)
        reg = r'(<td data-v-68e330ae>\s+)(\d+.\d)'
        ponits = re.search(reg, html)
        if rank != None:
            ulist.append([rank.group(2),level.group(2),name.group(2),ponits.group(2)])
            html = html[name.end():]
        else:
            break

3.輸出

def print_ulist(ulist):
    tplt = "{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}"
    print(tplt.format("2020排名", "全部層次", "學校名稱","總分", chr(12288)))
    for u in ulist:
        u[1] = strB2Q(u[1])
        print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))

4.結果

2)、心得體會

此次作業只允許使用urllib和re庫定向爬取網址,所以通過這次實驗我進一步學習和鞏固Re知識,運用正則表示式也更加得心應手了

  • 作業②

1)、 城市實時空氣質量資訊的爬取

– 要求:用requests和Beautiful Soup庫方法設計爬取https://datacenter.mee.gov.cn/aqiweb2/AQI實時報。
– 輸出資訊:

序號 城市 AQI PM2.5 SO2 NO2 CO 首要汙染物
1 北京市 55 6 5 1.0 225 ——

過程:
1.向頁面傳送請求,獲取原始碼:

def get_html(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        r = requests.get(url, timeout = 30, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
    except:
        return "產生異常"
    return r.text

2.用BS4匹配相應td標籤

def myFilter(tag):
    return (tag.name=="tbody" and tag.has_attr("id") and tag["id"]=="legend_01_table")

def get_AQI(html):
    AQI_list = []
    soup = BeautifulSoup(html, "lxml")
    for tr in soup.find(myFilter).children:
        if isinstance(tr, bs4.element.Tag):
            for td in tr.find_all("td"):
                AQI_list.append(td.text.strip())
    return AQI_list

3.輸出

def print_AIQ(AQI_list):
    tplt = tplt = "{0:^10}\t{1:{8}^10}\t{2:^10}\t{3:^10}\t{4:^10}\t{5:^10}\t{6:^10}\t{7:{8}^10}"
    print(tplt.format("序號", "城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要汙染物", chr(12288)))
    for i in range(int(len(AQI_list)/9)):
        print(tplt.format(i, AQI_list[i*9], AQI_list[i*9+1], AQI_list[i*9+2], AQI_list[i*9+4],
                          AQI_list[i*9+5], AQI_list[i*9+6], AQI_list[i*9+8], chr(12288)))

4.結果

2)、心得體會

本題主要是對Requests和BeautifulSoup的再複習,與之前的做過練習很相似,內容更多了。採用將爬取到的資訊統統添入列表,最後按照對應位置讀取需要的資料。

  • 作業③

1)、福大新聞網圖片的爬取

– 要求:使用urllib和requests和re爬取一個給定網頁https://news.fzu.edu.cn/爬取該網站下的所有圖片
– 輸出資訊:將自選網頁內的所有jpg檔案儲存在一個資料夾中

過程:
1.向頁面傳送請求,獲取網頁原始碼:

def get_html_request(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        r = requests.get(url, timeout = 30, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
    except:
        return "產生異常"
    return r.text

def get_html_urllib(url):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        req = urllib.request.Request(url, headers=headers)
        data = urllib.request.urlopen(req)
        data = data.read()
        data = data.decode()
        return data
    except Exception as err:
        print(err)

2.利用正則表示式匹配圖片下載連結:

def download_jps(html):
    reg = '<img src="/([a-zA-z]+[^\s"]*)'
    imagelist = re.compile(reg).findall(html)
    i = 1
    for image in imagelist:
        imageurl = "http://news.fzu.edu.cn/" + image
        response = requests.get(imageurl)
        img = response.content
        with open("./picture/第" + str(i) +"張圖片.jpg", "wb" ) as f:
            f.write(img)
        i += 1
    print("下載完成")

3.結果:

2)、心得體會

此題要求使用urllib和requests和re庫爬取一個給定網址的圖片資訊。通過這次作業使我對urllib和requests庫有更清晰的認識,進一步體會二者區別,同時也是又一次對正則表示式的練習。