数据采集与融合技术 实验1

作业①:

1)、大学学科排名数据爬取

作业1码云链接
-1.打开网页对需要爬取的数据进行检查




-2.首先采用urllib.request方法爬取html内容

def getHTMLTextUrllib(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 10.0 x104; 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()
        return unicodeData
    except:
        return ""
# 使用urllib方法打开url并进行解码获取html内容

-3.对第一步查看到的结点写出所匹配的正则表达式,并进行初步的匹配和检查,进行修改
以下是最终的代码

list = re.findall(r'<td data-v-68e330ae>\n.*?\n.*?',html)# 用正则表达式获取td结点的内容
levellist = []
scorelist = []
for i in range(0,len(list),2):# 层次数据包含在列表中的偶数位置
    levellist.append(re.findall(r'前\d+%', list[i])[0])
for i in range(1,len(list),2):# 总分数据包含在列表中的奇数位置
    scorelist.append(re.findall(r'\d+\.\d', list[i])[0])
namelist = re.findall(r'"name-cn" data-v-b80b4d60.*?>(.*?) </a>',html)

-4.对先前作业所使用的printUniList函数进行修改后输出

def printUnivList(ulist, num):
    #中西文混排时,要使用中文字符空格填充chr(12288)
    tplt = "{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^12}"
    print("{0:^9}\t{1:^10}\t{2:{4}^14}\t{3:^2}".format("2020排名", "全部层次", "学校名称", "总分",chr(12288)))
    for i in range(num):
        print(tplt.format(i+1, levellist[i], namelist[i], scorelist[i],chr(12288)))

结果如下:

2)、心得体会

作业1其实是要求利用re库对先前的作业进行复现,之前作业所用的是BeautifulSoup库,较为简练;而使用re库进行匹配时需要不断编写和测试自己写的正则表达式,目前对正则表达式还是不够熟练,在这一题上花费了较多的时间,还需要多加练习

作业②:

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

  • 输出信息:

    序号 城市 AQI PM2.5 SO2 NO2 CO2 首要污染物
    1 北京 55 6 5 1.0 255 ——
    2......

1)、AQI实时报爬取

作业2码云链接
-1.打开网页对需爬取的数据进行检查


-2.用requests库获取html信息

# requests获取url的html代码信息
import requests
def getHTMLText(url):
     try:
         r = requests.get(url, timeout=30)
         r.raise_for_status()
         r.encoding = r.apparent_encoding
         return r
     except:
         return ""

-3.分析第一步所查看的结点,对tbody的子结点进行遍历

for tr in soup.find('tbody').children:# 遍历tbody的子结点
        if isinstance(tr, bs4.element.Tag):# 需提取的内容均在tr结点当中,进行遍历
            for td in tr.children:
                tds = td.text.strip()
                if (tds != ''):# 若文本内容非空则存入列表
                    ulist.append(tds)

最后将列表中对应位置的数据存入结果列表

for i in range(0,len(ulist),9):
    res.append([ulist[i], ulist[i+1], ulist[i+2], ulist[i+4],ulist[i+5],ulist[i+6],ulist[i+8]])# 检查列表后将相应位置的内容存入结果列表

-4.改写print函数后进行输出

def printUnivList(res,num):
    tplt = "{0:^4}\t{1:{8}^4}\t{2:{8}^5}\t{3:{8}^4}\t{4:{8}^5}\t{5:{8}^5}\t{6:{8}^4}\t{7:{8}^4}"
    print(tplt.format("序号", "城市", "AQI", "PM2.5", "SO2","NO2","CO","首要污染物",chr(12288)))
    for i in range(num):
        u = res[i]
        print("{0:^4}\t{1:{8}^4}\t{2:{8}^4}\t{3:{8}^4}\t{4:{8}^4}\t{5:{8}^4}\t{6:{8}^4}\t{7:{8}^4}".format(i+1,u[0], u[1], u[2], u[3], u[4],u[5],u[6],chr(12288)))

结果如下:

2)、心得体会

这个作业要求用bs方法进行爬取,而该网站的html内容中需爬取的部分也较为简洁,实现起来不难,其中对tr的子结点进行遍历时出现了一些空的内容,最后加入了判断解决。

作业③:

  • 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/) ,并爬取该网站下的所有图片
  • 输出信息:将网页内的所有图片文件保存在一个文件夹中

1)、图片爬取

作业3码云链接
-1.首先对网页中的图片进行检查

-2.同第2步调用requests方法获取html内容
-3.利用soup.select,找到所有img结点并利用正则表达式提取src地址
获取img结点

images = soup.select("a")
for i in images:
    im = i.find("img")
    if (im != None):
        imglist.append(im)

遍历列表匹配出src地址

img_url_pattern = r'.+?src="(\S+)"'# 设定正则表达式
for i in imglist:
    res = re.findall(img_url_pattern, str(i))[0]# 用正则表达式匹配出包含src地址的结点
    if (str(res).endswith("jpg")|str(res).endswith("png")):# 进行判断提取出以.png和.jpg结尾的地址
        srclist.append(res)

-4.遍历储存src地址的列表进行下载

for i in range(0,len(srclist)):
    address = srclist[i]
    downloadurl = "http://news.fzu.edu.cn"+address
    file = "C:/Users/86180/Desktop/Data Collection/pics/"+" pic no."+str(i+1)+".jpg"
    urllib.request.urlretrieve(downloadurl,filename=file)
    print(" pic no."+str(i+1)+" download completed")

其中过滤了.gif动图文件
最后得到结果:

2)、心得体会

作业3和上次要求爬取书包图片的作业较为类似,稍作修改即可。其中不同的地方是此次网页的下载地址前缀与上次不同,需要加上网址。网页中包含的图片包括png、jpg和动图gif,种类更为多样,可选择所需的进行提取。

posted @ 2021-10-05 13:15  paulncle  阅读(106)  评论(0编辑  收藏  举报