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

作业一

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

import urllib.request
from bs4 import BeautifulSoup
url = "http://www.shanghairanking.cn/rankings/bcur/2020"
#用response.urllib打开url
response = urllib.request.urlopen(url)
#读取数据
html_content = response.read()
#对数据进行解析
soup = BeautifulSoup(html_content, "html.parser")
#通过查阅网页源代码找到我们所需要的元素位置
table = soup.find("table", {"class": "rk-table"})
print("排名\t学校名称\t省市\t学校类型\t总分")
#因为学号是27,因此遍历tr元素的前27行
for row in table.find_all("tr")[1:28]:
    columns = row.find_all("td")
    rank = columns[0].text.strip()
    school_name = columns[1].text.strip()
    province_city = columns[2].text.strip()
    school_type = columns[3].text.strip()
    total_score = columns[4].text.strip()
    print(f"{rank}\t{school_name}\t{province_city}\t{school_type}\t{total_score}")

结果显示如下:

心得体会:在完成这项任务的过程中,对爬取静态页面的数据有了一定的了解,在实践的过程中对老师在课堂上所讲的理论知识有了更深的体会

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

本次作业选择爬取当当商城,爬取出搜索结果为书包的第一页商品名称和价格

import urllib.request
from bs4 import BeautifulSoup
import chardet

# 获取网页内容
def getHTMLText(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
    try:
        req = urllib.request.Request(url, headers=headers)  # 创建请求对象并设置请求头
        data = urllib.request.urlopen(req).read()  # 发送请求并读取响应数据
        encoding = chardet.detect(data)['encoding']  # 使用chardet库检测网页编码
        data = data.decode(encoding, 'ignore')  # 解码网页内容
        return data
    except Exception as err:
        print("Error:", err)
        return None

# 解析网页内容
def parsePage(data):
    uinfo = []
    soup = BeautifulSoup(data, 'html.parser')  # 使用BeautifulSoup解析网页内容
    items = soup.find_all("li", class_=lambda x: x and x.startswith('line'))  # 查找包含商品信息的<li>元素
    for i, item in enumerate(items):
        price = item.find("p", class_="price").span.get_text(strip=True)  # 提取商品价格
        name = item.find("p", class_="name").a["title"]  # 提取商品名称
        uinfo.append([i + 1, price, name])  # 将商品信息添加到列表
    return uinfo

# 打印商品列表
def printGoodsList(uinfo):
    tplt = "{0:^5}\t{1:^10}\t{2:^20}"
    print(tplt.format("序号", "价格", "商品名称"))
    for i in uinfo:
        print(tplt.format(i[0], i[1], i[2]))

# 主函数
def main():
    url = 'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input'
    data = getHTMLText(url)
    if data:
        uinfo = parsePage(data)
        printGoodsList(uinfo)

if __name__ == '__main__':
    main()

结果显示如下:

心得体会:加深了对urllib.request和Beautifulsoup这些库的了解和使用,以及认识到网站中好爬取的数据是比较少的,大部分都有复杂的反爬机制

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

代码如下所示:

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import re
url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"
response = requests.get(url)
if response.status_code == 200:
    # 使用Beautiful Soup解析网页内容
    soup = BeautifulSoup(response.text, "html.parser")
    # 创建一个文件夹来保存JPEG和JPG文件
    os.makedirs("C:\\Users\\佘培强\\Desktop\\数据融合与采集技术作业\\images", exist_ok=True)
    # 查找所有图片标签(<img>)并下载JPEG和JPG文件
    img_tags = soup.find_all("img")
    for img_tag in img_tags:
        img_url = img_tag.get("src")
        if img_url and (img_url.endswith(".jpg") or img_url.endswith(".jpeg")):
            img_url = urljoin(url, img_url)
            img_data = requests.get(img_url).content
            img_name = re.sub(r'[\/:*?"<>|]', '_', os.path.basename(img_url))
            with open(os.path.join("C:\\Users\\佘培强\\Desktop\\数据融合与采集技术作业\\images", img_name), "wb") as img_file:
                img_file.write(img_data)
    print("所有JPEG和JPG文件已保存在images文件夹中。")
else:
    print("无法获取网页内容。")

结果如下所示:

心得体会:图片爬取速度太慢了

posted @ 2023-09-23 14:38  SPQ  阅读(64)  评论(0)    收藏  举报