作業系統 經典同步問題
阿新 • • 發佈:2021-10-08
碼雲地址:https://gitee.com/a2625113421/data-acquisition-practice-i
-
作業①:
1)、大學軟工排名資訊的爬取
– 要求:用urllib和re庫方法定向爬取給定網址https://www.shanghairanking.cn/rankings/bcsr/2020/0812的資料。
– 輸出資訊:
2020排名 | 全部層次 | 學校名稱 | 總分 |
---|---|---|---|
1 | 前2% | 清華大學 | 1661.0 |
過程:
1.向頁面傳送請求,獲取原始碼:
def get_html(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) data = urllib.request.urlopen(req) data = data.read() data = data.decode() return data except Exception as err: print(err)
2.利用正則表示式匹配資料並存入相應列表:
def fill_univ_list(ulist,html): while True: reg = r'(<div class="ranking" data-v-68e330ae>\s+)(\d+)' rank = re.search(reg,html) reg = r'(<td data-v-68e330ae>\s+)([\u4e00-\u9fa5]\d+%)' level = re.search(reg,html) reg = r'(data-v-b80b4d60>)([\u4e00-\u9fa5]+)' name = re.search(reg,html) reg = r'(<td data-v-68e330ae>\s+)(\d+.\d)' ponits = re.search(reg, html) if rank != None: ulist.append([rank.group(2),level.group(2),name.group(2),ponits.group(2)]) html = html[name.end():] else: break
3.輸出
def print_ulist(ulist):
tplt = "{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}"
print(tplt.format("2020排名", "全部層次", "學校名稱","總分", chr(12288)))
for u in ulist:
u[1] = strB2Q(u[1])
print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
4.結果
2)、心得體會
此次作業只允許使用urllib和re庫定向爬取網址,所以通過這次實驗我進一步學習和鞏固Re知識,運用正則表示式也更加得心應手了
-
作業②
1)、 城市實時空氣質量資訊的爬取
– 要求:用requests和Beautiful Soup庫方法設計爬取https://datacenter.mee.gov.cn/aqiweb2/AQI實時報。
– 輸出資訊:
序號 | 城市 | AQI | PM2.5 | SO2 | NO2 | CO | 首要汙染物 |
---|---|---|---|---|---|---|---|
1 | 北京市 | 55 | 6 | 5 | 1.0 | 225 | —— |
過程:
1.向頁面傳送請求,獲取原始碼:
def get_html(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"}
r = requests.get(url, timeout = 30, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
return "產生異常"
return r.text
2.用BS4匹配相應td標籤
def myFilter(tag):
return (tag.name=="tbody" and tag.has_attr("id") and tag["id"]=="legend_01_table")
def get_AQI(html):
AQI_list = []
soup = BeautifulSoup(html, "lxml")
for tr in soup.find(myFilter).children:
if isinstance(tr, bs4.element.Tag):
for td in tr.find_all("td"):
AQI_list.append(td.text.strip())
return AQI_list
3.輸出
def print_AIQ(AQI_list):
tplt = tplt = "{0:^10}\t{1:{8}^10}\t{2:^10}\t{3:^10}\t{4:^10}\t{5:^10}\t{6:^10}\t{7:{8}^10}"
print(tplt.format("序號", "城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要汙染物", chr(12288)))
for i in range(int(len(AQI_list)/9)):
print(tplt.format(i, AQI_list[i*9], AQI_list[i*9+1], AQI_list[i*9+2], AQI_list[i*9+4],
AQI_list[i*9+5], AQI_list[i*9+6], AQI_list[i*9+8], chr(12288)))
4.結果
2)、心得體會
本題主要是對Requests和BeautifulSoup的再複習,與之前的做過練習很相似,內容更多了。採用將爬取到的資訊統統添入列表,最後按照對應位置讀取需要的資料。
-
作業③
1)、福大新聞網圖片的爬取
– 要求:使用urllib和requests和re爬取一個給定網頁https://news.fzu.edu.cn/爬取該網站下的所有圖片
– 輸出資訊:將自選網頁內的所有jpg檔案儲存在一個資料夾中
過程:
1.向頁面傳送請求,獲取網頁原始碼:
def get_html_request(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"}
r = requests.get(url, timeout = 30, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
return "產生異常"
return r.text
def get_html_urllib(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)
data = urllib.request.urlopen(req)
data = data.read()
data = data.decode()
return data
except Exception as err:
print(err)
2.利用正則表示式匹配圖片下載連結:
def download_jps(html):
reg = '<img src="/([a-zA-z]+[^\s"]*)'
imagelist = re.compile(reg).findall(html)
i = 1
for image in imagelist:
imageurl = "http://news.fzu.edu.cn/" + image
response = requests.get(imageurl)
img = response.content
with open("./picture/第" + str(i) +"張圖片.jpg", "wb" ) as f:
f.write(img)
i += 1
print("下載完成")
3.結果:
2)、心得體會
此題要求使用urllib和requests和re庫爬取一個給定網址的圖片資訊。通過這次作業使我對urllib和requests庫有更清晰的認識,進一步體會二者區別,同時也是又一次對正則表示式的練習。