資料採集與融合技術 實驗1
作業①:
-
要求:用urllib和re庫方法定向爬取給定網址(https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的資料
-
輸出資訊:
2020排名 全部層次 學校型別 總分 1 前2% 中國人民大學 1069.0 2......
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,種類更為多樣,可選擇所需的進行提取。