欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > 2023年数据采集与融合技术实践作业

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

日期:2023-10-03 16:17

作业①

爬行大学排名实验

  • 实验要求
    使用requests和BeautifulSoup库方法定向爬取给定URL(http://www.introzo.com/rankings/bcur/2020)的数据,并将爬取到的大学排名信息打印在屏幕上。

    输出信息:

    排名 学校名称 省市 学校类型 总分
    1 清华大学 北京 一般 852.5
    2 *** *** *** ***
  • 具体实现
    代码思路:

    1. 导入所需模块:urllib.request用于发送HTTP请求,bs4用于解析网页内容。
    2. 定义函数get_HTML(url),获取指定URL的网页内容。首先使用 urllib.request.Request() 创建一个请求对象,然后使用 urlopen() 方法发送 HTTP GET 请求并读取响应。最后将响应内容解码为字符串并返回。
    3. 观察页面标签元素,找到需要的标签(“tbody”、“a”、“td”、“tr”),并使用 .text.strip() 方法获取元素的文本内容。最后,提取的数据作为列表添加到传入列表中。
    4. 定义函数data_print(list1, num)来打印解析后的数据。使用格式字符串 tplt 定义输出的格式,然后使用 .format() 方法填充格式字符串。

    代码显示:

导入urllib.request
导入bs4
从 bs4 导入 BeautifulSoup

#获取网页信息
def get_HTML(url):url="http://www.introzo.com/rankings/bcur/2020"
    #访问网站
    请求 = urllib.request.Request(url)
    数据 = urllib.request.urlopen(req)
    #读取信息并转码
    数据 = www.introzo.com().decode()
    返回数据
#解析网页数据
def data_HTMl(列表,html):
    汤 = BeautifulSoup(html,"html.parser")
    #使用soup.find("tbody")查找HTML中的元素(大表)
    #使用children属性遍历元素的子元素(即表格的行)
    对于 soup.find("tbody").children 中的 tr:
        #首先使用tr("a")获取该行中的第元素(清华大学名),然后使用tr("td")获取该行中的所有元素。
        a = tr("a")
        #通过索引访问所需的元素,并使用.text.strip()方法获取元素的文本内容。 .strip() 方法用于从文本内容中删除前导和尾随空白字符。
        tds = tr("td")
        #将数据提取为列表 [tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(), tds[3].text.strip( ),tds[4].text.strip()]添加到传入list列表中
        list.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(),
                    tds[3].text.strip(), tds[4].text.strip()])
def data_print(list1,num):#定义一个格式字符串tplt,五个占位符
    #^:表示居中对齐 10、12:表示项目的宽度为 10 或 12 个字符。 \t:表示添加制表符(Tab) {0}、{1}、{2}、{3}、{4} 表示参数
    tplt = "{0:^10}\t{1:^10}\t{2:^12}{3:^10}\t{4:^10}"
    print(tplt.format("排名","学校名称","省份","学校类型","总分"))
    对于范围内的 i(num):
         u = 列表 1[i]
         打印(tplt.format(u [0],u [1],u [2],u [3],u [4]))
    打印()
    print("上面共有记录" + str(num) + "Bar.")

def main():
    u信息 = []
    url="http://www.introzo.com/rankings/bcur/2020"
    html = get_HTML(网址)
    data_HTMl(uinfo,html)
    数据打印(uinfo,30)
如果 __name__ == '__main__':
    主要的()

运行结果:

经验

第一次将理论知识运用到实践中,学会了掌握urllib.request模块和BeautifulSoup模块,了解了格式化输出。

作业②

爬取商城网站“书包”名称和价格的实验

  • 实验要求
    使用requests和re库方法,针对某商城(自己选择的)设计一个商品比价定向爬虫,抓取该商城,搜索关键词“书包”的页面数据,爬取商品名称和价格。
  • 具体实现
    代码思路:
  1. 通过requests库发送GET请求,获取网页内容。使用BeautifulSoup库来解析网页内容。
  2. 使用 soup.find_all() 方法查找所有产品价格标签 (div) 和产品名称标签 (em)。分别保存在两个变量中:ptl和tlt。
  3. 通过find()方法提取相关信息。

代码显示:

进口重新
导入请求
从 bs4 导入 BeautifulSoup
#网站地址
url = 'https://www.introzo.com/Search?keyword=%E4%B9%A6%E5%8C%85&enc=utf-8&wq=shu%27bao&pvid=d692d49a9e864669b9fd7961c3e722db'
标题={
    'referer': 'https://www.introzo.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&spm=2.1.1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 如 Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.31',
    'cookie': 'shshshfpa=b5f36314-1742-1b85-8dcc-7045fdb3b4b5-1667349047; shshshfp = d547487362f8a6082adcbdf3f8748720; __jdu=364192152;shshshfpx=b5f36314-1742-1b85-8dcc-7045fdb3b4b5-1667349047;区域ID=16; ipLoc-djd=16-1303-0-0; PCSYCityID=CN_350000_350100_0; _pst=jd_72bed13713c96; unick=jd_72bed13713c96;引脚=jd_72bed13713c96; _tp=N5vAmU920Z0wbF6I0MxZgBYl7tjV9aBt19PUT89D7lY%3D; qrsc=3;unpl=JF8EAJdnNSttXUxTAh5SGEEXTlxcW11bGB9WPW9VUA5cSVQDSQUZEhB7XlVdXxRKHx9sZxRUWVNKXA4aBysSEXteU11bD00VB2xXXAQDGhUQR09SWEBJJVlQXl4ITxUBbWQ1ZF5Ye1QEKwAcFxB DXlRaXjhKJwRfVzVWVVBJVQEraystiakJCFdbD08QAyJlAlFdUEhUARgyGiIT; 3AB9D23F7A4B3CSS=jdd03PVSUU54GGAR7IS32R4IMPHTLBYLZSAZD5OE4XPILF3NP7UMO6R5KVGJ23F42ULJUR5M64BDWTJ6R6FW5EINCGAYPCEAAAAMKW2JCNXQAAAAACBN7HRYKVQ76XQX; _gia_d=1;雷神=5D81B6E91112E015439696EBF36804B9BA3575017FF5A1DB5D1C752992A994FF23F66A3491AB073A37FA95F9B6099554E9EC7E9768AA7A511D0E4719926A6C7 DB3B0A0C8AD63D58E7639DB5A0078F36100B40784E68DDB163E845E5F846EDAB899AF970438D505EA47B4F724280BE76ADE7304910DAB139363E26E681C3C9E177F7020 4B047D56A4BA948E7960D9E80FA851F6EFC41547D93646AE0C9A802711;闪存=2_cZgzxUebndUc2BIE6Acj7tuSV1jzlKb2rb_lYf7BNH55y0-MHXWsEK3dDScGBuc9i_lpTHcOsBRvrK4djPmkhazG7-MLGdPivVAoj7_2qzh*; pinId=ekKCf6hCeW6dex9nNIEGKLV9-x-f3wj7; __jdv=76161171|haosou-search|t_262767352_haosousearch|cpc|5512153332_0_46664a2b640941bb9dc9a5b5317c6311|1695280167076; xapieid=jdd03PVSUU54GGAR7IS32R4IMPHTLBYLZSAZD5OE4XPILF3NP7UMO6R5KVGJ23F42ULJUR5M64BDWTJ6R6FW5EINCGAYPCEAAAAMKW2JCNXQAAAAACBN7HRYKVQ76XQX; jsavif=0; j 保存=0; rkv=1.0; shshshsID=95a68db43c9719f530669ed6bebed6c7_3_1695280175229; __jda=122270672.364192152.1693390633.1694944463.1695280146。 4; __jdb=122270672.4.364192152|4.1695280146; __jdc=122270672; IS32R4IMPHTLBYLZSAZD5OE4XPILF3NP7UMO6R5KVGJ23F42ULJUR5M64BDWTJ6R6FW5EINCGAYPCE }

r = requests.get(url, headers=header)
汤 = BeautifulSoup(r.text, "html.parser")
#查找所有产品价格标签
ptl = soup.find_all('div', 'p-价格')
#查找所有产品名称标签
tlt = soup.find_all('div', 'p-name p-name-type-2')
#{:<6s}表示将第一个字符串(序号)左对齐,占用6个字符的宽度。
#{:<40s}表示将第二个字符串(产品名称)左对齐,占用40个字符的宽度。
#{:^10s}表示第三个字符串(价格)居中对齐,占10个字符的宽度。
# print('{:<6s}{:<80s}{:^30s}'.format('序列号', '产品名称', '价格'))
对于范围内的 i(len(tlt)):
    #提取产品名称产品标签标题 = tlt[i].find('em').text
    价格=“”
    如果 len(ptl) > 0:
        #提取商品价格![](https://www.introzo.com/blog/3286129/202309/3286129-20230922112629020-380225735.png)

        价格标签 = ptl[i].strong.i
        如果价格标签:
            #提取价格标签内的文本内容,并使用.strip()方法删除前导和尾随空格。
            价格 = Price_tag.text.strip()
    print(f"产品名称:{标题}")
    print(f"产品价格:{price}")
    打印(” -  -  -  -  -  -  -  -  -  -  -  - -”)
    # print('{:<6d}{:<80s}{:^10s}'.format(i+1, 标题, 价格))

运行结果:

经验

这个实验和上一个实验的区别在于CSS选择器的使用。通过使用 soup.find_all() 方法结合 CSS 选择器,您可以轻松定位和提取 HTML 文档中的特定标签和内容。这种方式更加灵活高效。

作业③

爬取网站照片实验

  • 实验要求
    抓取给定网页(https://www.introzo.com/info/1071/4481.htm)或自选网页的所有JPEG、JPG格式文件。
    输出信息:将所选网页中的所有 JPEG 和 JPG 文件保存在一个文件夹中。
  • 具体实现
    代码思路:
  1. 获取网页内容并使用BeautifulSoup进行解析。
  2. 创建文件夹来保存图片。
  3. 查找所有“img”标签,获取图片链接,并根据后缀保存在一起。

代码显示:

导入操作系统
导入请求
从 bs4 导入 BeautifulSoup
从 urllib.parse 导入 urljoin, urlparse

# 定义要抓取的网页URL
url = 'https://www.introzo.com/info/1071/4481.htm'

#发送HTTP GET请求获取网页内容
响应 = requests.get(url)
汤 = BeautifulSoup(response.text, 'html.parser')

#创建一个文件夹来保存图片
folder_path = 'image_folder' # 文件夹路径
如果不是 os.path.exists(folder_path):
    os.makedirs(文件夹路径)

# 查找所有img标签
img_tags = soup.find_all('img')
对于 img_tags 中的 img_tag:
    # 获取图片链接
    img_url = img_tag.get('src')
    如果 img_url 和 (img_url.endswith('.jpeg') 或 img_url.endswith('.jpg')):
        # 构造图片的完整URL
        full_img_url = urljoin(url, img_url)
        #提取图像文件名
        img_filename = os.path.basename(urlparse(full_img_url).path)
        # 拼接图片保存路径
        save_path = os.path.join(文件夹路径, img_文件名)
        #发送HTTP GET请求获取图片内容img_response = requests.get(full_img_url)
        # 将图像保存到本地
        打开(save_path,'wb')作为f:
            f.write(img_response.content)

        print(f'保存图像:{img_filename}')

print('所有 JPEG 和 JPG 文件已保存在该文件夹中。')

运行结果:

经验

这次主要是URL处理。例如,使用urljoin()将相对URL转换为绝对URL,使用urlparse()提取URL的各个部分,然后根据后缀名拼接图像路径。这部分知识点是我需要加强学习的地方。

关灯