作业①

1)

–          要求:用urllib和re库方法定向爬取给定网址(https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据。

–          输出信息:

             2020排名

             2019排名

             全部层次

             学校类型

             总分

             1

             2

             前2%

             中国人民大学

             1069.0

             2......

              

              

              

              

 

代码如下:

import urllib.request
import re
#获取
url = 'https://www.shanghairanking.cn/rankings/bcsr/2020/0812 '
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
#print(html)

#tdList = re.findall(r'<td[^>]*>(.*?)</td>',html, re.I | re.M)
#print(tdList)
#爬取总的信息
detail_data = re.findall(r'class="rk-table"(.*?)</table>', html, re.S)[0]
#匹配学校名称
tdList1 = re.findall(r'class="name-cn"[^>]*>(.*?)</a>',html, re.I | re.M)
#匹配2020学校排名
tdList2 = re.findall(r'div class="ranking"(.*?) </div>',detail_data,re.S)
tdList2=''.join(tdList2)
tdList2 = re.findall(r"\d+\.?\d*", tdList2)
data1 = []
for i in range(0,len(tdList2)):
    if i % 3 == 2:
        data1.append(tdList2[i])
#print(detail_data)
#匹配学科层次
tdList3 = re.findall(r'前\d+%',detail_data,re.S)
data2 = []
for i in range(0,len(tdList3)):
    if i >6 :
        data2.append(tdList3[i])
#学科总分
tdList4 = re.findall(r'\d+\.\d+',detail_data,re.S)
#print(tdList4)


#print(data1)
#按格式输出
print("{:^10}\t{:^8}\t{:^10}\t{:^20}".format("排名","全部层次","学校名称","总分"))
for i in range(0,len(data1)):
    print("{:^10}\t{:^10}\t{:^10}\t{:^20}".format(data1[i],data2[i],tdList1[i],tdList4[i]))

运行结果如下:

 码云地址:作业1/task1.py · 刘洋/2019数据采集与融合 - 码云 - 开源中国 (gitee.com)

 

 

2)、心得体会

  分析网页,体会urllib库和re匹配的使用方法,在爬取网页的时候,总分一开始匹配很久都没有找到,问了舍友,直接使用\d+.\d+来匹配,对这些方法的体会加深,也算是爬虫初入门。

 

作业②

1)

–          要求:用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。

–          输出信息:

             序号

             城市

             AQI

             PM2.5

             SO2

             No2

             Co

             首要污染物

             1

             北京

             55

             6

             5

             1.0

             225

             —

 

代码如下:

import requests
from bs4 import BeautifulSoup
#获取
def getHTMLText(url, loginheaders):
    try:
        r = requests.get(url, headers=loginheaders, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
#url与header
url = 'https://datacenter.mee.gov.cn/aqiweb2/'
loginheaders = {
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36',
            }
#获取数据
data = getHTMLText(url,loginheaders)
s = BeautifulSoup(data,"html.parser")
l = s.select('tbody[id="legend_01_table"] tr')
#序号
num = 1
#输出
print("{:^10}\t{:^10}\t{:^6}\t{:^10}\t{:^10}\t{:^10}\t{:^6}\t{:^6}\t{:^6}\t{:^6}".format("序号","city","AQI","PM2.5","PM10","SO2","NO2","CO","O3","main_pollution"))
for i in l :
    city = i.select('td')[0].text
    AQI = i.select('td')[1].text
    PM2 = i.select('td')[2].text
    PM10 = i.select('td')[3].text
    SO2 = i.select('td')[4].text
    NO2 = i.select('td')[5].text
    CO = i.select('td')[6].text
    O3 = i.select('td')[7].text
    main_pollution = i.select('td')[8].text.strip()
    print("{:^8}\t{:^8}\t{:^6}\t{:^10}\t{:^10}\t{:^10}\t{:^6}\t{:^6}\t{:^6}\t{:^6}".format(num,city,AQI,PM2,PM10,SO2,NO2,CO,O3,main_pollution))
    num += 1

 


运行结果如下:

 码云地址:作业1/task2.py · 刘洋/2019数据采集与融合 - 码云 - 开源中国 (gitee.com)

2)、心得体会

感觉beautifulsoup和requests更加方便

作业③

1)、

–          要求:使用urllib和requests和re爬取一个给定网页(https://news.fzu.edu.cn/)爬取该网站下的所有图片

–          输出信息:将自选网页内的所有jpg文件保存在一个文件夹中

代码如下:

import requests
import re
#获取
def getHTMLText(url, loginheaders):
    try:
        r = requests.get(url, headers=loginheaders, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
#url与header
url = 'http://news.fzu.edu.cn/'
loginheaders = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36',
}
data = getHTMLText(url,loginheaders)
tdlist1 = re.findall(r'src=".*.jpg', data)
#print(tdlist1)
#去掉前面的src,最后与网页组成图片的正确路径
data1 = []
for i in range(len(tdlist1)):
    flag = 'http://news.fzu.edu.cn'+tdlist1[i][5:]
#    print(flag)
    res = requests.get(flag)
    with open("picture/{}.jpg".format(i), "wb") as f:
        f.write(res.content)
    print("成功下载")
#print(data1)

 码云地址:作业1/task3.py · 刘洋/2019数据采集与融合 - 码云 - 开源中国 (gitee.com)


运行结果如下:

 

 

 

 2)、心得体会

 

 图片的路径需要加上本身的网页组成,要将匹配到的字符串去掉前面的src,在第一次写的时候不知道为什么同样的网址拒绝访问,然后重启之后又允许访问了。