数据采集与融合技术实践作业一

发布时间 2023-09-23 13:27:32作者: leo102102119

作业一:

要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。

输出信息:

排名 学校名称 省市 学校类型 总分
1 清华大学 北京 852.5 综合
2......

实验:

import requests  # 方式1获取URL信息
import urllib.request  # 方式2获取URL信息
from bs4 import BeautifulSoup
import bs4
# 从网络上获取大学排名网页内容。
def getHTMLText(url):  # 获取URL信息,输出内容
    # =========================方式1获取=========================
    try:
        res = requests.get(url)  # 使用requests库爬取
        res.raise_for_status()  # 产生异常信息
        res.encoding = res.apparent_encoding  # 修改编码
        return res.text  # 返回网页编码
    except Exception as err:
        print(err)
    # =========================方式2获取=========================
    try:
        req = urllib.request.Request(url)
        # 打开URL网站的网址,读出二进制数据,二进制数据转为字符串
        data = urllib.request.urlopen(req).read.decode()
        return data
    except Exception as err:
        print(err)
# 提取网页内容中信息到合适的数据结构.
def fillUnivList(ulist, html):  # 将html页面放到ulist列表中(核心)
    # 解析网页文件(使用html解释器)
    soup = BeautifulSoup(html, "html.parser")
    # soup.prettify()  # 把soup对象的文档树变换成一个字符串
    # 数据结构:所用数据都封装在一个表格(标签tbody)中,单个学校信息在tr标签中,详细信息在td标签中
    # 学校名称在a标签中,定义一个列表单独存放a标签内容
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):  # 如果tr标签的类型不是bs4库中定义的tag类型,则过滤掉
            a = tr('a')  # 把所用的a标签存为一个列表类型
            tds = tr('td')  # 将所有的td标签存为一个列表类型
            ulist.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(),
                          tds[3].text.strip(), tds[4].text.strip()])
            # 使用strip()函数,它的作用是用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
# 利用数据结构展示并输出结果:定义函数
def printUnivList(ulist1, num):  # 打印出ulist列表的信息,num表示希望将列表中的多少个元素打印出来
    # 格式化输出
    tplt = "{0:^10}\t{1:^10}\t{2:^12}\t{3:^12}\t{4:^10}"
    print(tplt.format("排名", "学校名称", "省份", "学校类型", "总分"))
    for i in range(num):
        u = ulist1[i]
        print(tplt.format(u[0], u[1], u[2], u[3], u[4]))
def main():
    uinfo = []  # 将大学信息放到列表中
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 25)  # 一个界面的数据
if __name__ == '__main__':
    main()

结果:

心得体会:

本次实验我使用了urllib和bs4库完成对大学排名信息的爬取,难点在于多页爬取。主要的解决方法是:一是查找数据接口,找到不同数据页面所需要的请求格式,二是使用selenium找到解析html源码,找到按钮标签。

作业二:

要求:

用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。

输出信息:

序号 价格 商品名
1 65.00 xxx
2......

实验:

import re
import requests
from bs4 import BeautifulSoup
from pprint import pprint
def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"view_price\"\:\"{\d.}*\"', html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(plt):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[1].split(':')[1])
            ilt.append([price, title])
    except:
        print("")
    print("")
def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序号", "价格", "商品名称"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1]))
def main():
    depth = 2
    infoList = []  # 输出结果保存
    for i in range(depth):
        try:
            url = 'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input' + '&page_index={}'.format(i+1)
            zymk = requests.get(url)
            html=zymk.text
            html1 = BeautifulSoup(html, "lxml")
            html2 = html1.select("ul[class='bigimg cloth_shoplist'] li")
            parsePage(infoList, html2)
            for i in html2:
                name = i.a.attrs['title']
                price = i.select('p[class="price"]')[0].text
                infoList.append((name, price))
        except:
            continue
    printGoodsList(infoList)
main()

结果:

心得体会:

本次任务用requests和re库方法爬取当当商品比价,以关键词“书包”搜索页面的数据,爬取商品名称和价格。通过这个任务,我掌握了REQUEST库和BEAUTIFULSOUP,还掌握了一些翻页知识。我开始觉得任务十分困难,后来,在同学的帮助下,我成功爬取了网页。

作业三:

要求:

爬取一个给定网页(https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件

输出信息:

将自选网页内的所有JPEG和JPG文件保存在一个文件夹中

实验:

import requests
import urllib.request
from bs4 import BeautifulSoup
import os
import re
def pku():
    url = 'https://xcb.fzu.edu.cn/info/1071/4481.htm'
    filename = r'C:\Users\zlf\Desktop\作业\image'
    html = requests.get(url)
    html1 = html.text
    soup = BeautifulSoup(html1,'html.parser')
    soup1 = soup.findAll('img')
    img_re = re.compile(r'src="(.*?)" ')
    soup2 = img_re.findall(str(soup1))
    x = 1
    for i in soup2:
        if not i.startswith('http'):
            i = 'http://xcb.fzu.edu.cn'+i
        zymk = requests.get(i).content
        with open(os.path.join(filename, str(x)+'.jpg'), 'wb') as f:
            try:
                f.write(zymk)
                print('下载第%d张' % x)
            except:
                print("URLError")
        x += 1
    print('**下载完成!**')
pku()

结果:

心得体会:

本次任务将网页(https://xcb.fzu.edu.cn/info/1071/4481.htm)所有JPEG和JPG格式文件下载。
通过这个任务,我学习了正则表达式re的引用。作业其实不是特别难,但是寻找图片是最困难的一步。我试了很多种方法,终于成功了。