gbcmakehsht

导航

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

作业1

实验要求

要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:
排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2......

作业内容

import requests  
import urllib.request  
from bs4 import BeautifulSoup  
import bs4  
 
def main():  
    uinfo = []  
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"  
     
    try:  
        res = requests.get(url)  
        res.raise_for_status()  
        res.encoding = res.apparent_encoding  
        html = res.text  
    except Exception as err:  
        print(err)        

    try:  
        req = urllib.request.Request(url)  
        html = urllib.request.urlopen(req).read.decode()  
    except Exception as err:  
        print(err)  
          
    soup = BeautifulSoup(html, "html.parser")  

    for tr in soup.find('tbody').children:  
        if isinstance(tr, bs4.element.Tag):  
            a = tr('a')  
            tds = tr('td')  
            uinfo.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(), tds[3].text.strip(), tds[4].text.strip()])  
    
    tplt = "{0:^10}\t{1:^10}\t{2:^12}\t{3:^12}\t{4:^10}"  
    print(tplt.format("排名", "学校名称", "省份", "学校类型", "总分"))  

    for i in range(30):  
        u = uinfo[i]  
        print(tplt.format(u[0], u[1], u[2], u[3], u[4]))  
  
if __name__ == '__main__':  
    main()

心得体会

主要是bs4+request的使用爬取排名网站,没有什么反爬虫的机制,代码运行的速度也很快

作业2

实验要求

要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
输出信息:
序号 价格 商品名
1 65.00 xxx
2......

作业内容

import re
import urllib3
# 创建urllib3的PoolManager对象
http = urllib3.PoolManager()
# 定义要爬取的页面URL
url = "https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306"
# 发起请求,获取页面内容
response = http.request('GET', url)
html = response.data.decode('utf-8')
# 将页面内容写入本地静态HTML文件
with open('taobao_page.html', 'w', encoding='utf-8') as f:
    f.write(html)
# 使用正则表达式提取商品名称和价格
# 商品名称的正则表达式
item_name_pattern = r'"title":"(.*?)"'
# 商品价格的正则表达式
item_price_pattern = r'"price":"(.*?)"'
# 提取商品名称和价格
item_names = re.findall(item_name_pattern, html)
item_prices = re.findall(item_price_pattern, html)
# 打印商品名称和价格
for name, price in zip(item_names, item_prices):
    print(f'商品名称: {name}, 价格: {price}')

心得体会

1.对于淘宝网,可以手动保存页面为本地静态页面,之后就好解决了
2.可能是浏览器的原因,用2345右击保存的静态页面什么内容也没有,用Chrome的插件Save Page保存就可以

作业3

实验要求

要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件
输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中

作业内容

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse

# 定义要爬取的网页URL
url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"

# 创建一个文件夹来保存图片
folder_path = "images"
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 获取网页的HTML内容
response = requests.get(url)
html_content = response.text

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(html_content, "html.parser")

# 找到所有的img标签,并筛选出JPEG和JPG文件
img_tags = soup.find_all("img")
image_urls = []
for img in img_tags:
    src = img.get("src")
    if src and src.endswith((".jpeg", ".jpg")):
        # 使用urlparse检查并修正URL的协议
        url_parts = urlparse(src)
        if not url_parts.scheme:
            # 如果协议不存在,添加默认的http://协议
            src = "https://xcb.fzu.edu.cn" + src
        image_urls.append(src)

    # 下载图片并保存到文件夹中
for i, image_url in enumerate(image_urls):
    image_response = requests.get(image_url)
    image_name = f"{i}.jpeg"  # 简单的命名规则,可以根据需要修改
    image_path = os.path.join(folder_path, image_name)
    with open(image_path, "wb") as f:
        f.write(image_response.content)

心得体会

1.过程出现了一个问题:图片的url报错,显示协议头不正确,之后我手动加上https://xcb.fzu.edu.cn的头部,解决了这个问题
2.可以通过导入urllib.parse,筛选带有jpg,jpeg的数据并检查url,如果没有https://的头部,则要加上
3.图片下载的过程非常缓慢,不知道是什么原因。。。

posted on 2023-09-21 15:47  柚子湖  阅读(60)  评论(0编辑  收藏  举报