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

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

作業①:

  • 要求:用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)))
    
    4.編寫主函式
    點選檢視程式碼
    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實時報。
    • 輸出資訊:
    • 序號 城市 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 ""
      
      2.開始對頁面需要爬取的元素進行檢查,用beautiful soup篩選出有用資訊(如下):
      點選檢視程式碼
      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()])
      
      3.列印結果:
      點選檢視程式碼
      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,獲取資訊,與之前的作業並無太大差別。

      作業③:

      • 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/),並爬取該網站下的所有圖片
      • 輸出資訊:將網頁內的所有圖片檔案儲存在一個資料夾中
        • 實驗過程:
          1.獲取網頁原始碼html檔案:
        點選檢視程式碼
        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
        
        2.查詢li 下的img節點
        點選檢視程式碼
        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')
        
        3.提取src
        點選檢視程式碼
        img = r'img.+?src="(.*?)"'
        for i in imagelist:
            src.append(re.findall(img, str(i)))
            print(src)
        
        4.列印圖片:
        點選檢視程式碼
        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進行下載。