爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换

        当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。

  1. if img_url.startswith('//'):

    这个条件检查URL是否以//开头。这种形式的URL称为协议相对URL(protocol-relative URL),它意味着URL的协议(如http:https:)应该与当前页面的协议相同。代码通过将http:添加到URL的前面来将其转换为绝对URL。注意,这里假设页面是通过HTTP协议加载的;如果页面是通过HTTPS加载的,应该使用https:。在实际应用中,你可能需要根据页面的实际协议来动态确定这一点。
  2. elif img_url.startswith('/'):

    这个条件检查URL是否以/开头。这种形式的URL是相对于网站根目录的路径。代码通过将页面的基础URL(即不包含页面具体路径的URL)与相对路径拼接起来,从而生成绝对URL。
  3. elif not img_url.startswith('http'):

    这个条件检查URL是否不以http开头。这通常意味着URL是相对于当前页面路径的。代码通过在页面基础URL后面添加/(如果需要的话,即如果基础URL不以/结尾)和相对路径,从而生成绝对URL。
    # 处理相对路径,下面只考虑http
    if img_url.startswith('//'):
        img_url = 'http:' + img_url
    elif img_url.startswith('/'):
        img_url = url + img_url
    elif not img_url.startswith('http'):
        img_url = url + '/' + img_url

下面介绍不同的数据类型在python中的处理方法: 

JSON

  1. 获取 JSON 数据

    • 使用 requests.get(url) 获取 JSON 数据。
    • 使用 response.raise_for_status() 检查请求是否成功。
  2. 解析 JSON 数据

    • 使用 response.json() 将 JSON 数据解析为 Python 字典。
    • 假设 JSON 数据中有一个键(例如 images)包含图片 URL 列表。
  3. 提取图片 URL 列表

    • 从解析后的 JSON 数据中提取图片 URL 列表。
    • 创建保存图片的目录。如果目录不存在,使用 os.makedirs(save_dir) 创建目录。
  4. 下载图片并保存到本地

    • 处理图片 URL 的相对路径问题(例如,将协议相对 URL 转换为绝对 URL)。
    • 使用 requests.get(img_url) 下载图片。
    • 提取图片的文件名,并保存到指定目录。

        如果网页内容是以 JSON 格式返回的,你可以直接使用 requests 库来获取 JSON 数据,然后解析并保存其中的图片。以下是如何处理 JSON 数据并下载其中的图片的示例代码。

import requests
import os
import json

# 1. 获取 JSON 数据
url = 'https://api.example.com/data'  # 替换为你的 JSON API URL
response = requests.get(url)
response.raise_for_status()  # 检查请求是否成功

# 2. 解析 JSON 数据
data = response.json()

# 3. 提取图片 URL 列表
# 假设 JSON 数据中有一个 'images' 键,包含图片 URL 列表
image_urls = data.get('images', [])

# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 4. 下载图片并保存到本地
for img_url in image_urls:
    try:
        # 处理相对路径
        if img_url.startswith('//'):
            img_url = 'http:' + img_url
        elif not img_url.startswith('http'):
            img_url = url + '/' + img_url

        # 发送请求获取图片
        img_response = requests.get(img_url)
        img_response.raise_for_status()  # 检查请求是否成功

        # 提取文件名
        img_filename = os.path.join(save_dir, img_url.split('/')[-1])

        # 保存图片
        with open(img_filename, 'wb') as f:
            f.write(img_response.content)

        print(f'Saved image: {img_filename}')

    except Exception as e:
        print(f'Failed to download image {img_url}: {e}')

print('All images downloaded.')

XML(可扩展标记语言)

  • 特点:XML 是一种用于存储和传输数据的标记语言,结构类似于 HTML,但更灵活。
  • 处理方法:使用 Python 的 xml.etree.ElementTree 模块解析 XML 数据。
import xml.etree.ElementTree as ET
import requests
import os

# 获取 XML 数据
url = 'https://api.example.com/data.xml'
response = requests.get(url)
response.raise_for_status()

# 解析 XML 数据
root = ET.fromstring(response.content)

# 提取图片 URL 列表
image_urls = [elem.text for elem in root.findall('.//image')]

# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 下载图片并保存到本地
for img_url in image_urls:
    try:
        img_response = requests.get(img_url)
        img_response.raise_for_status()

        img_filename = os.path.join(save_dir, img_url.split('/')[-1])

        with open(img_filename, 'wb') as f:
            f.write(img_response.content)

        print(f'Saved image: {img_filename}')

    except Exception as e:
        print(f'Failed to download image {img_url}: {e}')

 CSV(逗号分隔值)

  • 特点:CSV 是一种简单的文件格式,用于存储表格数据。
  • 处理方法:使用 Python 的 csv 模块读取 CSV 文件,或者直接使用 pandas 库进行高级处理。
import csv
import requests
import os

# 获取 CSV 数据
url = 'https://api.example.com/data.csv'
response = requests.get(url)
response.raise_for_status()

# 解析 CSV 数据
csv_data = response.text
csv_reader = csv.reader(csv_data.splitlines())
next(csv_reader)  # 跳过表头

image_urls = [row[0] for row in csv_reader]

# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 下载图片并保存到本地
for img_url in image_urls:
    try:
        img_response = requests.get(img_url)
        img_response.raise_for_status()

        img_filename = os.path.join(save_dir, img_url.split('/')[-1])

        with open(img_filename, 'wb') as f:
            f.write(img_response.content)

        print(f'Saved image: {img_filename}')

    except Exception as e:
        print(f'Failed to download image {img_url}: {e}')

 Excel(.xls, .xlsx)

  • 特点:Excel 文件是一种用于存储表格数据的常见文件格式。
  • 处理方法:使用 openpyxl 或 pandas 库读取 Excel 文件。
import requests
import os
import openpyxl

# 获取 Excel 数据
url = 'https://api.example.com/data.xlsx'
response = requests.get(url)
response.raise_for_status()

# 保存 Excel 文件到本地
temp_filename = 'temp.xlsx'
with open(temp_filename, 'wb') as f:
    f.write(response.content)

# 读取 Excel 数据
workbook = openpyxl.load_workbook(temp_filename)
sheet = workbook.active

image_urls = [cell.value for cell in sheet['A']]

# 删除临时文件
os.remove(temp_filename)

# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 下载图片并保存到本地
for img_url in image_urls:
    try:
        img_response = requests.get(img_url)
        img_response.raise_for_status()

        img_filename = os.path.join(save_dir, img_url.split('/')[-1])

        with open(img_filename, 'wb') as f:
            f.write(img_response.content)

        print(f'Saved image: {img_filename}')

    except Exception as e:
        print(f'Failed to download image {img_url}: {e}')

 HTML

  • 特点:HTML 是网页的标准标记语言,常用于展示网页内容。
  • 处理方法:使用 BeautifulSoup 或 lxml 库解析 HTML 内容。
import requests
from bs4 import BeautifulSoup
import os

# 获取 HTML 数据
url = 'https://example.com'
response = requests.get(url)
response.raise_for_status()

# 解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')

# 提取图片 URL 列表
image_tags = soup.find_all('img')
image_urls = [img['src'] for img in image_tags if 'src' in img.attrs]

# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 下载图片并保存到本地
for img_url in image_urls:
    try:
        img_response = requests.get(img_url)
        img_response.raise_for_status()

        img_filename = os.path.join(save_dir, img_url.split('/')[-1])

        with open(img_filename, 'wb') as f:
            f.write(img_response.content)

        print(f'Saved image: {img_filename}')

    except Exception as e:
        print(f'Failed to download image {img_url}: {e}')

其他数据格式

  • YAML:使用 PyYAML 库解析 YAML 数据。
  • SQLite:使用 sqlite3 库连接和查询 SQLite 数据库。
  • 二进制文件:使用 struct 模块解析二进制数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值