作业①
(1)实验内容
要求:用urllib和re库方法定向爬取给定网址(https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据。
输出信息:
2020排名 | 全部层次 | 学校类型 | 总分 |
---|---|---|---|
1 | 前2% | 中国人民大学 | 1069.0 |
2...... |
python实现:
① 从网络上获取大学排名网页内容
url = "https://www.shanghairanking.cn/rankings/bcsr/2020/0812"
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"}
req = urllib.request.Request(url, headers=headers)
data = urllib.request.urlopen(req)
data = data.read()
data = data.decode()
data = data.replace('\n', '') # 去除换行符,以免影响后续的爬取
② 查找所需节点和内容
rank = re.findall(r'<div class="ranking" data-v-[0-9a-z]*>.*?(\d+).*?</div>', data)
level = re.findall(r'</span></td><td data-v-[0-9a-z]*>(.*?)<!----></td>', data)
name = re.findall(r'img alt="(.*?)"', data)
score = re.findall(r'</div></td><td data-v-[0-9a-z]*>(.*?)</td></tr>', data)
college = [] # 将获得的结果存入列表中
for i in range(len(rank)):
college.append([rank[i].strip(), level[i].strip(), name[i].strip(), score[i].strip()])
③ 将结果输出出来
tplt = "{0:^10}\t{1:^10}\t{2:^15}\t{3:^15}" # 定义输出格式
print(tplt.format("2020排名", "全部层次", "学校类型", "总分", chr(12288)))
for i in range(len(college)):
u = college[i]
print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
④ 结果
⑤ 完整代码链接:https://gitee.com/yzayr/DataMining/blob/master/Ex1/1.1.py
(2)心得体会
这道题运用的爬取网页的一种方式,urllib和re结合,其中遇到的问题是获得的data存在换行符,通过正则式无法找到。可以通过把换行符去掉再进行查找。
作业②
要求:用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。
序号 | 城市 | AQI | PM2.5 | SO2 | No2 | Co | 首要污染物 |
---|---|---|---|---|---|---|---|
北京 | 55 | 6 | 5 | 225 | — | ||
python实现
① 从网络上获取网页内容。
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
url = "https://datacenter.mee.gov.cn/aqiweb2/"
data = getHTMLText(url)
soup = BeautifulSoup(data, 'html.parser')
② 查找所需节点及内容
AQI = []
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
AQI.append(
[tds[0].text, tds[1].text, tds[2].text, tds[3].text, tds[4].text, tds[5].text, tds[6].text, tds[7].text, tds[8].text.strip()])
③ 输出结果
tplt = "{0:^10}\t{1:^10}\t{2:^15}\t{3:^15}\t{4:^15}\t{5:^15}\t{6:^15}\t{7:^15}\t{8:^15}\t{9:^15}"
print(tplt.format("序号", "城市", "AQI", "PM2.5", "PM10", "SO2", "NO2", "CO", "O3", "首要污染物", chr(12288)))
for i in range(len(AQI)):
u = AQI[i]
print(tplt.format(i, u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8], chr(12288)))
④ 结果(展示前20条数据)
⑤ 完整代码链接:https://gitee.com/yzayr/DataMining/blob/master/Ex1/1.2.py
这道题运用了爬取网页的另一种方式,requests和BeautifulSoup相结合。较上一题容易的是,这道题爬取的内容都在一个目录之下。
作业③
要求:使用urllib和requests爬取(http://news.fzu.edu.cn),并爬取该网站下的所有图片
输出信息:将网页内的所有图片文件保存在一个文件夹中。
python实现
① 从网站获取网页内容
def getHTMLText(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",
"cookie": "JSESSIONID=0000iqGM2FybXfY5_BdwHPKATox:18f1dopuc"
}
resp = requests.get(url, headers=headers)
return resp.content.decode()
except:
return ""
url = "http://news.fzu.edu.cn/"
data = getHTMLText(url)
pictures = re.findall(r'<img src="(.*?)"', data)
③ 将图片保存下来
def SavePic(img_path, pic):
try:
r = requests.get(pic)
with open(img_path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
except Exception as err:
print("执行出错", err)
rootpath = r'image'
i = 1
for pic in pictures:
picUrl = "http://news.fzu.edu.cn" + pic
img_name = picUrl.split('/')[-1]
img_path = rootpath + r'.\{}.jpg'.format(i)
SavePic(img_path, picUrl)
i += 1