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

作业①:

  • 要求:用urllib和re库方法定向爬取给定网址 (https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据
  • 输出信息:
    2020排名 全部层次 学校类型 总分
    1 前2% 中国人民大学 1069.0
    2......

    (1.1)爬取大学排名实验

    • 实验过程:

    1.获取网页源码html文件:

    def getHTMLTextUrllib(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 Edg/94.0.992.31"}
            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:
            return ""
    

    2.开始对页面需要爬取的元素进行检查,编写正则表达式筛选出有用信息(如下):

    • 检查展示:
      数据采集与融合技术-实验1
      <-------------------------------------------------------------------------------------------->
      数据采集与融合技术-实验1
      <-------------------------------------------------------------------------------------------->
      数据采集与融合技术-实验1
      <-------------------------------------------------------------------------------------------->
      数据采集与融合技术-实验1
      <-------------------------------------------------------------------------------------------->
      数据采集与融合技术-实验1
        rank=r'class="ranking" data-v-68e330ae>\n.*?\n                        </div>'     #匹配排名
        level=r'<td data-v-68e330ae>\n.*?%' #匹配层次
        name=r'class="name-cn" data-v-b80b4d60>(.*?)</a>' #匹配学校
        score=r'<td data-v-68e330ae>\n.*?\n                    </td>' #匹配总分
    
    

    3.编写打印函数

    def printList(ulist, num):
        #中西文混排时,要使用中文字符空格填充chr(12288)
        tplt = "{0:^10}\t{1:{4}^8}\t{2:{4}^15}\t{3:^5}"
        print("{0:^9}\t{1:^10}\t{2:{4}^15}\t{3:^1}".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)))
    

    4.编写主函数

    def main():
        rank = []
        url = 'https://www.shanghairanking.cn/rankings/bcsr/2020/0812'
        html = getHTMLTextUrllib(url)
        fillList(rank, html)
        printList(rank, 20)
    
    main()
    
    • 结果展示:数据采集与融合技术-实验1

    (1.2)心得

    此题之前是是通过beautiful soup的方法做,比较简单,尝试用正则之后发现在本题中“\n”与一连串的空格是我们使用re查找数据的难点,在正则中引入换行符,后面split(\n)来处理。

    作业②:

    • 要求:用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。
    • 输出信息:
    • 序号 城市 AQI PM2.5 SO2 No2 Co 首要污染物
      1 北京 55 6 5 1.0 225
      2......

      (2.1)爬取AQI实验

      • 实验过程:

      1.获取网页源码html文件:

      def getHTMLText(url):
           try:
               r = requests.get(url, timeout=30)
               r.raise_for_status()
               r.encoding = r.apparent_encoding
               return r.text
           except:
               return ""
      

      2.开始对页面需要爬取的元素进行检查,用beautiful soup筛选出有用信息(如下):

      def fillUnivList(ulist, html):
          soup = BeautifulSoup(html, "html.parser")
          for tr in soup.find('tbody').children:
              if isinstance(tr, bs4.element.Tag):
              #检查tr标签,排除tr为普通字符串,需要引入bs4库
                  tds = tr('td')
                  ulist.append([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()])
      

      3.打印结果:

      def printUnivList(ulist, num):
      
          # 中西文混排时,要使用中文字符空格填充chr(12288)
          print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format("序号","城市", "AQI", "PM2.5",  "SO2", "NO2", "CO", "首要污染物"))
          # 对中文输出的列,进行用第6个参数即中文空格chr(12288)填充
          for i in range(num):
              u = ulist[i]
              print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format(i+1, u[0], u[1], u[2], u[3], u[4], u[5], u[6]))
      
      • 结果展示:
        数据采集与融合技术-实验1

      (2.2)心得

      此题是通过beautiful soup的方法做,比较简单,直接采用循环方法找到tbody下的所有tr节点,再找到td,获取信息,与之前的作业并无太大差别。

      作业③:

      • 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/),并爬取该网站下的所有图片
      • 输出信息:将网页内的所有图片文件保存在一个文件夹中
        • 实验过程:
          1.获取网页源码html文件:
        def getHtml(url):
            header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/92.0"}
            r = requests.get(url, headers=header)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        

        2.查找li 下的img节点

        url='http://news.fzu.edu.cn/'
            # data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
        html = getHtml(url)
        soup = BeautifulSoup(html, "html.parser")
        imagelist = []
        src = []
        imagelist = soup.select('li img')
        

        3.提取src

        img = r'img.+?src="(.*?)"'
        for i in imagelist:
            src.append(re.findall(img, str(i)))
            print(src)
        

        4.打印图片:

        for j in range(0, len(src)):
                address = src[j][0]
                print("第"+str(j+1)+"张爬取成功")
                newurl = "http://news.fzu.edu.cn"+str(address)
                print(newurl)
                file="E:/测试/tupian/"+"第"+str(j+1)+"张"+".jpg"#file指先在指定文件夹里建立相关的文件夹才能爬取成功
                urllib.request.urlretrieve(newurl, filename=file)
        

        结果如下:
        数据采集与融合技术-实验1

        (2.2)心得

        此题与之前做的爬取商城图片类型相似(甚至不要翻页处理),主要是构造出正则表达式输出imgz中的src,然后用urllib.request.urlretrieve进行下载。

上一篇:爬虫练习2:爬取省市信息(增加地址信息)


下一篇:Android 多线程处理之多线程用法大集合