1. 程式人生 > 其它 >資料採集與融合技術 實驗1

資料採集與融合技術 實驗1

作業①:

1)、大學學科排名資料爬取

作業1碼雲連結
-1.開啟網頁對需要爬取的資料進行檢查




-2.首先採用urllib.request方法爬取html內容

def getHTMLTextUrllib(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 10.0 x104; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        req=urllib.request.Request(url,headers=headers)
        resp=urllib.request.urlopen(req)
        data =resp.read()
        unicodeData =data.decode()
        return unicodeData
    except:
        return ""
# 使用urllib方法開啟url並進行解碼獲取html內容

-3.對第一步檢視到的結點寫出所匹配的正則表示式,並進行初步的匹配和檢查,進行修改
以下是最終的程式碼

list = re.findall(r'<td data-v-68e330ae>\n.*?\n.*?',html)# 用正則表示式獲取td結點的內容
levellist = []
scorelist = []
for i in range(0,len(list),2):# 層次資料包含在列表中的偶數位置
    levellist.append(re.findall(r'前\d+%', list[i])[0])
for i in range(1,len(list),2):# 總分資料包含在列表中的奇數位置
    scorelist.append(re.findall(r'\d+\.\d', list[i])[0])
namelist = re.findall(r'"name-cn" data-v-b80b4d60.*?>(.*?) </a>',html)

-4.對先前作業所使用的printUniList函式進行修改後輸出

def printUnivList(ulist, num):
    #中西文混排時,要使用中文字元空格填充chr(12288)
    tplt = "{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^12}"
    print("{0:^9}\t{1:^10}\t{2:{4}^14}\t{3:^2}".format("2020排名", "全部層次", "學校名稱", "總分",chr(12288)))
    for i in range(num):
        print(tplt.format(i+1, levellist[i], namelist[i], scorelist[i],chr(12288)))

結果如下:

2)、心得體會

作業1其實是要求利用re庫對先前的作業進行復現,之前作業所用的是BeautifulSoup庫,較為簡練;而使用re庫進行匹配時需要不斷編寫和測試自己寫的正則表示式,目前對正則表示式還是不夠熟練,在這一題上花費了較多的時間,還需要多加練習

作業②:

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

  • 輸出資訊:

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

1)、AQI實時報爬取

作業2碼雲連結
-1.開啟網頁對需爬取的資料進行檢查


-2.用requests庫獲取html資訊

# requests獲取url的html程式碼資訊
import requests
def getHTMLText(url):
     try:
         r = requests.get(url, timeout=30)
         r.raise_for_status()
         r.encoding = r.apparent_encoding
         return r
     except:
         return ""

-3.分析第一步所檢視的結點,對tbody的子結點進行遍歷

for tr in soup.find('tbody').children:# 遍歷tbody的子結點
        if isinstance(tr, bs4.element.Tag):# 需提取的內容均在tr結點當中,進行遍歷
            for td in tr.children:
                tds = td.text.strip()
                if (tds != ''):# 若文字內容非空則存入列表
                    ulist.append(tds)

最後將列表中對應位置的資料存入結果列表

for i in range(0,len(ulist),9):
    res.append([ulist[i], ulist[i+1], ulist[i+2], ulist[i+4],ulist[i+5],ulist[i+6],ulist[i+8]])# 檢查列表後將相應位置的內容存入結果列表

-4.改寫print函式後進行輸出

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

結果如下:

2)、心得體會

這個作業要求用bs方法進行爬取,而該網站的html內容中需爬取的部分也較為簡潔,實現起來不難,其中對tr的子結點進行遍歷時出現了一些空的內容,最後加入了判斷解決。

作業③:

  • 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/) ,並爬取該網站下的所有圖片
  • 輸出資訊:將網頁內的所有圖片檔案儲存在一個資料夾中

1)、圖片爬取

作業3碼雲連結
-1.首先對網頁中的圖片進行檢查

-2.同第2步呼叫requests方法獲取html內容
-3.利用soup.select,找到所有img結點並利用正則表示式提取src地址
獲取img結點

images = soup.select("a")
for i in images:
    im = i.find("img")
    if (im != None):
        imglist.append(im)

遍歷列表匹配出src地址

img_url_pattern = r'.+?src="(\S+)"'# 設定正則表示式
for i in imglist:
    res = re.findall(img_url_pattern, str(i))[0]# 用正則表示式匹配出包含src地址的結點
    if (str(res).endswith("jpg")|str(res).endswith("png")):# 進行判斷提取出以.png和.jpg結尾的地址
        srclist.append(res)

-4.遍歷儲存src地址的列表進行下載

for i in range(0,len(srclist)):
    address = srclist[i]
    downloadurl = "http://news.fzu.edu.cn"+address
    file = "C:/Users/86180/Desktop/Data Collection/pics/"+" pic no."+str(i+1)+".jpg"
    urllib.request.urlretrieve(downloadurl,filename=file)
    print(" pic no."+str(i+1)+" download completed")

其中過濾了.gif動圖檔案
最後得到結果:

2)、心得體會

作業3和上次要求爬取書包圖片的作業較為類似,稍作修改即可。其中不同的地方是此次網頁的下載地址字首與上次不同,需要加上網址。網頁中包含的圖片包括png、jpg和動圖gif,種類更為多樣,可選擇所需的進行提取。