資料採集與融合技術-實驗1
阿新 • • 發佈:2021-10-05
作業①:
- 要求:用urllib和re庫方法定向爬取給定網址 (https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的資料
- 輸出資訊:
2020排名 全部層次 學校型別 總分 1 前2% 中國人民大學 1069.0 2...... (1.1)爬取大學排名實驗
- 實驗過程:
1.獲取網頁原始碼html檔案:
點選檢視程式碼
def getHTMLTextUrllib(url): try: headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31"} req=urllib.request.Request(url,headers=headers) resp=urllib.request.urlopen(req) data =resp.read() unicodeData =data.decode() #dammit = UnicodeDammit(data,["utf-8","gbk"]) #unicodeData= dammit.unicode_markup return unicodeData except: return ""
2.開始對頁面需要爬取的元素進行檢查,編寫正則表示式篩選出有用資訊(如下):
- 檢查展示:
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
點選檢視程式碼
rank=r'class="ranking" data-v-68e330ae>\n.*?\n </div>' #匹配排名 level=r'<td data-v-68e330ae>\n.*?%' #匹配層次 name=r'class="name-cn" data-v-b80b4d60>(.*?)</a>' #匹配學校 score=r'<td data-v-68e330ae>\n.*?\n </td>' #匹配總分
3.編寫列印函式
點選檢視程式碼
def printList(ulist, num): #中西文混排時,要使用中文字元空格填充chr(12288) tplt = "{0:^10}\t{1:{4}^8}\t{2:{4}^15}\t{3:^5}" print("{0:^9}\t{1:^10}\t{2:{4}^15}\t{3:^1}".format("2020排名", "全部層次", "學校名稱", "總分", chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0], u[1], u[2], u[3],chr(12288)))
點選檢視程式碼
def main(): rank = [] url = 'https://www.shanghairanking.cn/rankings/bcsr/2020/0812' html = getHTMLTextUrllib(url) fillList(rank, html) printList(rank, 20) main()
- 結果展示:
(1.2)心得
此題之前是是通過beautiful soup的方法做,比較簡單,嘗試用正則之後發現在本題中“\n”與一連串的空格是我們使用re查詢資料的難點,在正則中引入換行符,後面split(\n)來處理。
作業②:
- 要求:用requests和Beautiful Soup庫方法設計爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI實時報。
- 輸出資訊:
- 實驗過程:
- 結果展示:
- 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/),並爬取該網站下的所有圖片
- 輸出資訊:將網頁內的所有圖片檔案儲存在一個資料夾中
- 實驗過程:
1.獲取網頁原始碼html檔案:
序號 城市 AQI PM2.5 SO2 No2 Co 首要汙染物 1 北京 55 6 5 1.0 225 — 2...... (2.1)爬取AQI實驗
1.獲取網頁原始碼html檔案:
點選檢視程式碼
def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""
點選檢視程式碼
def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find('tbody').children: if isinstance(tr, bs4.element.Tag): #檢查tr標籤,排除tr為普通字串,需要引入bs4庫 tds = tr('td') ulist.append([tds[0].text.strip(), tds[1].text.strip(), tds[2].text.strip(), tds[4].text.strip(), tds[5].text.strip(), tds[6].text.strip(), tds[8].text.strip()])
點選檢視程式碼
def printUnivList(ulist, num): # 中西文混排時,要使用中文字元空格填充chr(12288) print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format("序號","城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要汙染物")) # 對中文輸出的列,進行用第6個引數即中文空格chr(12288)填充 for i in range(num): u = ulist[i] print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format(i+1, u[0], u[1], u[2], u[3], u[4], u[5], u[6]))
(2.2)心得
此題是通過beautiful soup的方法做,比較簡單,直接採用迴圈方法找到tbody下的所有tr節點,再找到td,獲取資訊,與之前的作業並無太大差別。
作業③:
點選檢視程式碼
def getHtml(url): header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/92.0"} r = requests.get(url, headers=header) r.raise_for_status() r.encoding = r.apparent_encoding return r.text
點選檢視程式碼
url='http://news.fzu.edu.cn/' # data=urllib.request.urlopen(url).read().decode("utf-8","ignore") html = getHtml(url) soup = BeautifulSoup(html, "html.parser") imagelist = [] src = [] imagelist = soup.select('li img')
點選檢視程式碼
img = r'img.+?src="(.*?)"' for i in imagelist: src.append(re.findall(img, str(i))) print(src)
點選檢視程式碼
for j in range(0, len(src)): address = src[j][0] print("第"+str(j+1)+"張爬取成功") newurl = "http://news.fzu.edu.cn"+str(address) print(newurl) file="E:/測試/tupian/"+"第"+str(j+1)+"張"+".jpg"#file指先在指定資料夾裡建立相關的資料夾才能爬取成功 urllib.request.urlretrieve(newurl, filename=file)
結果如下:
(2.2)心得
此題與之前做的爬取商城圖片型別相似(甚至不要翻頁處理),主要是構造出正則表示式輸出imgz中的src,然後用urllib.request.urlretrieve進行下載。