一、作業①
- 要求:用
urllib
和re
庫方法定向爬取給定網址中國最好學科排名(計算機科學與技術)的數據。 - 輸出形式:
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>
內容時,由於忽略了換行與空格,浪費了好多時間... - 要多多練習編寫正則表達式
二、作業②
- 要求:用
requests
和Beautiful 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.心得體會
- 由於已做過類似爬蟲,此項作業快速完成,沒有遇到困難
三、作業③
- 要求:使用
urllib
和requests
及re
爬取一個給定網頁福州大學新聞網下的所有圖片 - 輸出形式:將自選網頁內的所有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
,成功解決... - 目前對於正則表達式的運用還不夠熟練,課下應多做練習,增強理解。