数据采集与融合技术第一次作业
作业1
1)用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
import urllib.request
from bs4 import BeautifulSoup
# 定义 URL
url = 'http://www.shanghairanking.cn/rankings/bcur/2020'
# 发起请求并获取网页内容
response = urllib.request.urlopen(url)
html = response.read()
# 解析网页内容
soup = BeautifulSoup(html, 'html.parser')
# 找到排名表格
table = soup.find('table')
# 提取表格中的数据
rows = table.find_all('tr')
# 打印表头
print(f"{'排名':<5} {'学校名称':<20} {'省市':<10} {'学校类型':<10} {'总分':<5}")
# 遍历每一行并打印数据
for row in rows[1:]: # 跳过表头行
cols = row.find_all('td')
name_tag = row.find_all('span')
rank = cols[0].text.strip()
name = name_tag[0].text.strip()
city = cols[2].text.strip()
type_ = cols[3].text.strip()
score = cols[4].text.strip()
print(f"{rank:<5} {name:<20} {city:<10} {type_:<10} {score:<5}")
运行结果:
2)实验心得
在完成作业一的过程中,我深刻体会到了 Python 网络爬虫的强大功能。通过使用 requests 和 BeautifulSoup 库,能够轻松地从网页中提取所需的信息。
首先,requests 库使得发送 HTTP 请求变得非常简单。只需要几行代码,就可以获取到网页的内容,为后续的数据分析和处理奠定了基础。
BeautifulSoup 库则在解析 HTML 文档方面表现出色。它提供了直观的方法来定位和提取特定的元素,如表格中的数据。在这个作业中,通过找到特定的表格,并遍历其中的行和列,成功地提取了大学排名信息。
这个过程也让我更加熟悉了 HTML 结构和 CSS 选择器的使用。了解如何根据网页的结构来定位所需的信息是非常重要的技能。
此外,通过格式化输出,使得数据更加清晰易读。这也提醒了我在数据处理和展示方面要注重用户体验。
总的来说,作业一让我对网络爬虫有了更深入的理解和实践经验,为今后处理更多复杂的网页数据提取任务打下了坚实的基础。
作业2
1)用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
import re
import urllib.parse
import urllib.request
def getHTMLText(url): # 获取URL信息,输出内容
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}
try:
req = urllib.request.Request(url, headers=headers)
data = urllib.request.urlopen(req).read().decode()
return data
except Exception as err:
return err
# 正则表达式获取商品名称和商品价格:定义函数parsePage()
def parsePage(uinfo, data):
plt = re.findall(r'"sku_price":"[\d.]*"', data)
tlt = re.findall(r'"ad_title_text":".*?"', data) # *?表示最小匹配
for i in range(len(tlt)):
price = eval(plt[i].split(':')[1])
name = eval(tlt[i].split(':')[1])
# 序号 价格 商品名称追加到uinfo列表
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 ='https://re.jd.com/search?keyword=%E4%B9%A6%E5%8C%85&enc=utf-8'
uinfo = [] # 将爬取信息放到列表中
data = getHTMLText(url)
parsePage(uinfo, data)
printGoodslist(uinfo)
if __name__ == '__main__':
main()
实验结果:
2)心得体会
在进行作业二时,选择使用 requests 和 re 库来设计商品比价定向爬虫是一个有趣的挑战。
通过选择一个商城并以特定关键词进行搜索,我学会了如何模拟用户的搜索行为,并获取搜索结果页面的内容。
requests 库再次发挥了重要作用,确保能够顺利地与商城的服务器进行交互。而 re 库则在提取商品名称和价格信息时提供了灵活的正则表达式匹配功能。
在这个过程中,我需要仔细分析商城页面的 HTML 结构,确定商品名称和价格所在的位置,并设计合适的正则表达式来准确地提取这些信息。
这个作业让我意识到,不同的商城可能具有不同的页面结构和数据呈现方式,因此在进行爬虫开发时,需要根据具体情况进行调整和优化。
同时,也让我更加关注数据的准确性和完整性。在提取信息时,需要进行适当的验证和处理,以确保数据的质量。
总的来说,作业二让我深入了解了正则表达式在数据提取中的应用,以及如何针对特定的商城进行定向爬虫开发,为实际的数据分析和决策提供了有价值的信息。
作业3
1)爬取一个给定网页(https://news.fzu.edu.cn/yxfd.htm)的所有JPEG和JPG格式文件
import requests
from bs4 import BeautifulSoup
import os
import concurrent.futures
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"Error fetching data from {url}: {e}")
return ""
def find_image_urls(html):
soup = BeautifulSoup(html, 'html.parser')
image_urls = []
for img_tag in soup.find_all('img'):
src = img_tag.get('src')
if src and (src.endswith('.jpg') or src.endswith('.jpeg')):
# 如果图片链接不是完整的 URL,添加页面的协议和域名构建完整 URL
if not src.startswith('http'):
base_url = 'https://xcb.fzu.edu.cn'
src = f'{base_url}{src}'
image_urls.append(src)
return image_urls
def download_image(img_url, save_folder):
try:
img_data = requests.get(img_url).content
img_name = os.path.basename(img_url)
save_path = os.path.join(save_folder, img_name)
os.makedirs(save_folder, exist_ok=True)
with open(save_path, 'wb') as handler:
handler.write(img_data)
print(f"Downloaded {img_name}")
except Exception as e:
print(f"Error downloading {img_url}: {e}")
def main():
target_url = 'https://news.fzu.edu.cn/yxfd.htm'
html_content = get_html(target_url)
if html_content:
image_urls = find_image_urls(html_content)
save_folder = r"D:\python\上课\数据采集实践\1\image"
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
executor.map(lambda url: download_image(url, save_folder), image_urls)
if __name__ == '__main__':
os.makedirs(r"D:\python\上课\数据采集实践\1\image", exist_ok=True)
main()
实验结果:
下载到3张图片
2)心得体会
作业三要求爬取给定网页中的 JPEG 和 JPG 格式文件,这是一个非常实用的任务。
在这个过程中,我首先需要了解如何分析网页的结构,以确定图片文件的链接位置。通过查看网页的源代码和使用浏览器的开发者工具,可以找到图片的 URL。
然后,使用 requests 库来下载这些图片文件,并保存到指定的文件夹中。这个过程需要注意文件命名和路径的处理,以确保文件能够正确地保存。
这个作业让我认识到,网络上有大量的多媒体资源可以通过爬虫来获取和利用。同时,也需要注意遵守法律法规和网站的使用条款,确保合法地获取和使用这些资源。
此外,在处理文件下载和保存时,还需要考虑错误处理和异常情况。例如,如果文件下载失败或保存过程中出现问题,需要有相应的处理机制来保证程序的稳定性。
总的来说,作业三让我学会了如何从网页中提取特定格式的文件,并加深了对文件操作和网络爬虫的理解,为今后处理多媒体资源的任务提供了宝贵的经验。