「數據采集」實驗一


一、作業①

2020排名 全部層次 學校類型 總分
1 前2% 中國人民大學 1069.0
2 .... ........... ......

1.獲取網頁源碼:getHTMLTextUrllib(url)

def getHTMLTextUrllib(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)
        resp=urllib.request.urlopen(req)
        data =resp.read()
        unicodeData =data.decode()
        #dammit = UnicodeDammit(data,["utf-8","gbk"])
        #unicodeData= dammit.unicode_markup
        return unicodeData
    except Exception as err:
        print(err)

2.構造正則表達式匹配所需內容

  • 2020排名:rank = re.findall(r'<td data-v-68e330ae><div class="ranking" data-v-68e330ae>(\n\s*?\d*\s*?)<\/div><\/td>',html)
  • 全部層次:level = re.findall(r'<td data-v-68e330ae>('r'\n\s*?.*\s*?)<!----><\/td>',html)
  • 學校類型:name = re.findall(r'class="name-cn" data-v-b80b4d60>(.*?)<\/a>',html)
  • 總分:score = re.findall(r'<td data-v-68e330ae>(\n\s*?.*\s*?)<\/td>',html)

3.將獲取信息存儲於ulist中:fillUnivList(ulist, html)

def fillUnivList(ulist, html):
    try:
        rank = re.findall(r'<td data-v-68e330ae><div class="ranking" data-v-68e330ae>(\n\s*?\d*\s*?)<\/div><\/td>',html)
        level = re.findall(r'<td data-v-68e330ae>(\n\s*?.*\s*?)<!----><\/td>',html)
        name = re.findall(r'class="name-cn" data-v-b80b4d60>(.*?)<\/a>',html)
        score = re.findall(r'<td data-v-68e330ae>(\n\s*?.*\s*?)<\/td>',html)

        for i in range(len(rank)):
            Rank = rank[i].strip()
            Level = level[i].strip()
            Name = name[i].strip()
            Score = score[i].strip()
            ulist.append([Rank,Level,Name,Score])

    except Exception as err:
        print(err)

4.打印列表信息printUnivList(ulist, 20)

def printUnivList(ulist, num):
    #中西文混排時,要使用中文字符空格填充chr(12288)
    tplt = "{:6}\t{:4}\t{:10}\t{:4}"
    #對中文輸出的列,用第6個參數即中文空格chr(12288)填充
    print(tplt.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)))

5.輸出結果

6.心得體會

  • 正則表達式使用還不夠熟練,匹配<div class="ranking" data-v-68e330ae=""> 1 </div>內容時,由於忽略了換行與空格,浪費了好多時間...
  • 要多多練習編寫正則表達式

二、作業②

  • 要求:用requestsBeautiful Soup庫方法設計爬取數據服務AQI實時報。
  • 輸出形式
序號 城市 AQI PM2.5 SO2 NO2 CO 首要污染物
1 北京 55 6 5 1.0 225 -
2 .... .... .... .... .... .... ....

1.獲取網頁源碼getHTMLText(url)

def getHTMLText(url):
    try:
        resp = requests.get(url,timeout=30)
        resp.raise_for_status()
        resp.encoding = resp.apparent_encoding
        return resp.text
    except:
        return '產生異常'

2.調用Beautiful Soup獲取信息

#html頁面數據存入ulist
def fillAQIList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    i = 1 #表示序號
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            #檢查tr標簽,排除tr為普通字符串,需要引入bs4庫
            tds = tr('td')
            # 列表中存入AQI信息
            ulist.append([str(i),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()])
            i += 1

3.打印列表信息printAQIList(ulist, num)

def printAQIList(ulist, num):
    #中西文混排時,要使用中文字符空格填充chr(12288)
    tplt = "{:6}\t{:4}\t{:10}\t{:4}\t{:6}\t{:4}\t{:10}\t{:4}"
    #對中文輸出的列,進行用第6個參數即中文空格chr(12288)填充
    print(tplt.format("序號", "城市", "AQI", "PM2.5", "SO2","NO2","CO","首要污染物",
                      chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], u[3], u[4],u[5],u[6],u[7],chr(
            12288)))

4.輸出結果

5.心得體會

  • 由於已做過類似爬蟲,此項作業快速完成,沒有遇到困難

三、作業③

  • 要求:使用urllibrequestsre爬取一個給定網頁福州大學新聞網下的所有圖片
  • 輸出形式:將自選網頁內的所有jpg文件保存在一個文件夾中

1.獲取網頁源碼getHTMLText(url)

  • Requests
def getHTMLText(url):
    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',
            }
    try:
        resp = requests.get(url,headers=headers,timeout=30)
        resp.raise_for_status()
        resp.encoding = resp.apparent_encoding
        return resp.text
    except Exception as err:
        return err
  • urllib.request
    try:
        req = urllib.request.Request(url, headers=headers)
        resp = urllib.request.urlopen(req)
        data = resp.read().decode()
        return data
    except Exception as err:
        return err

2.構造正則表達式匹配jpg圖片

reg = r'<img src="/(.*?).jpg"'

3.保存圖片至文件夾中SavePics(html)

def SavePics(html):
    reg = r'<img src="/(.*?).jpg"'
    img_list = re.findall(reg,html)
    i = 0 #記錄圖片數量
    for imgurl in img_list:
        i += 1
        imgurl = 'http://news.fzu.edu.cn/' + imgurl + '.jpg'
        print(i,imgurl)
        #利用requests庫下載圖片
        try:
            response = requests.get(imgurl)
            file_path = 'D:/PyCharm/InternetWorm/News/' + '第' + str(i) + '張圖片' + '.jpg' #圖片保存路徑
            with open(file_path, 'wb') as f:  # 圖片信息是二進制形式,所以要用wb寫入
                f.write(response.content)
                print('success')
        except Exception as err:
            print(err)

4.輸出結果


5.心得體會

  • 編碼過程中遇到以下報錯
1 http://attach/2021/09/26/433747.jpg
HTTPConnectionPool(host='attach', port=80): Max retries exceeded with url: /2021/09/26/433747.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000022D1D22DB50>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
  • 尋找多種解決方案無果后,嘗試復制圖片url在瀏覽器中打開,提示無法打開,於是將原url變為http://news.fzu.edu.cn/attach/2021/09/26/433747.jpg,成功解決...
  • 目前對於正則表達式的運用還不夠熟練,課下應多做練習,增強理解。

代碼地址:https://gitee.com/sevennnn/internet-worm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM