天天看点

数据采集与融合技术第一次作业

作业①

(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