[新人求助] Python爬取网站图片时,其他链接正常输出,但其中一个链接报错原因及解决方法

报错地段在 59 行,报错提示为:Unterminated string starting at: line 1 column 1 (char 0)
主要想不通,为啥别的链接不报错,每次一到这个链接就报错
import requests
from urllib.parse import urlencode
from requests.exceptions import RequestException
import random
import json
from bs4 import BeautifulSoup
import re

headers_chi = [
‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0’,
‘Mozilla/5.0 (Windows NT 6.1; rv:49.0) Gecko/20100101 Firefox/49.0’,
‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36’,
‘Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0’
]
def shouye_dizhi():
data = {
‘offset’: ‘0’,
‘format’: ‘json’,
‘keyword’: ‘美女’,
‘autoload’: ‘true’,
‘count’: ‘20’,
‘cur_tab’: ‘3’,
‘from’: ‘gallery’
}
url = ‘https://www.toutiao.com/search_content/?’ + urlencode(data)
try:
headers = {}
headers[‘User-Agent’] = random.choice(headers_chi)
dizhi = requests.get(url,headers = headers)
if dizhi.status_code == 200:
return dizhi.text
except RequestException:
print(‘首页加载出错’)
return None

def shouye_xiangqing(html):
data = json.loads(html)
if data and ‘data’ in data.keys():
for item in data.get(‘data’):
yield item.get(‘article_url’)

def xiangqingye_dizhi(url):
try:
headers = {}
headers[‘User-Agent’] = random.choice(headers_chi)
dizhi = requests.get(url,headers = headers)
if dizhi.status_code == 200:
return dizhi.text
except RequestException:
print(‘详情页加载出错’)
return None

def xiangqingye_jiexi(html,url):
jiexi = BeautifulSoup(html,‘lxml’)
title = jiexi.select(‘title’)[0].get_text()
print(title)
zhengze = re.compile(‘JSON.parse(([\s\S]*?))’)
jieguo = re.search(zhengze,html)
data = json.loads(json.loads(jieguo.group(1)))
if data and ‘sub_images’ in data.keys():
sub_images = data.get(‘sub_images’)
items = [item.get(‘url’)for item in sub_images]
return {
‘title’:title,
‘url’:url,
‘items’:items
}


def main():
html = shouye_dizhi()
for url in shouye_xiangqing(html):
html = xiangqingye_dizhi(url)
tupian = xiangqingye_jiexi(html,url)
print(tupian)

if name == “main”:
main()
[新人求助] Python爬取网站图片时,其他链接正常输出,但其中一个链接报错原因及解决方法


4 回复

求大佬帮忙看一下啊


这个问题我遇到过,典型的爬虫链接处理问题。报错原因通常是以下几种情况:

  1. 链接格式问题:有些图片链接可能是相对路径、协议相对路径(//开头)或者包含特殊字符
  2. 服务器限制:某些链接可能有反爬机制,需要添加请求头
  3. 网络问题:链接可能暂时不可访问或需要重定向
  4. 编码问题:URL中包含非ASCII字符

给你个通用的解决方案:

import requests
from urllib.parse import urljoin, urlparse
import os

def download_image(img_url, base_url, save_path, headers=None):
    """
    下载图片的通用函数
    
    Args:
        img_url: 图片链接(可能是相对或绝对路径)
        base_url: 基础URL,用于补全相对链接
        save_path: 保存路径
        headers: 请求头,默认为None
    """
    if headers is None:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
    
    try:
        # 处理相对链接
        if not img_url.startswith(('http://', 'https://')):
            if img_url.startswith('//'):
                img_url = 'https:' + img_url
            else:
                img_url = urljoin(base_url, img_url)
        
        # 发送请求
        response = requests.get(img_url, headers=headers, timeout=10)
        response.raise_for_status()
        
        # 检查是否为图片
        content_type = response.headers.get('content-type', '')
        if 'image' not in content_type:
            print(f"警告: {img_url} 返回的不是图片 (Content-Type: {content_type})")
            return False
        
        # 从URL提取文件名
        parsed_url = urlparse(img_url)
        filename = os.path.basename(parsed_url.path)
        if not filename:
            filename = f"image_{hash(img_url)}.jpg"
        
        # 保存图片
        filepath = os.path.join(save_path, filename)
        with open(filepath, 'wb') as f:
            f.write(response.content)
        
        print(f"成功下载: {filename}")
        return True
        
    except requests.exceptions.RequestException as e:
        print(f"下载失败 {img_url}: {e}")
        return False
    except Exception as e:
        print(f"处理错误 {img_url}: {e}")
        return False

# 使用示例
if __name__ == "__main__":
    # 你的图片链接列表
    image_urls = [
        "https://example.com/image1.jpg",  # 正常链接
        "//cdn.example.com/image2.jpg",    # 协议相对链接
        "/images/pic3.jpg",                # 相对链接
        "https://特殊字符.com/图片.jpg"     # 包含中文的链接
    ]
    
    base_url = "https://example.com"
    save_dir = "./downloads"
    
    # 创建保存目录
    os.makedirs(save_dir, exist_ok=True)
    
    # 下载所有图片
    for url in image_urls:
        download_image(url, base_url, save_dir)

关键点说明:

  1. 链接标准化:使用urljoin处理相对链接,自动补全完整URL
  2. 协议处理:单独处理//开头的协议相对链接
  3. 错误处理:使用try-except捕获所有可能的异常
  4. 内容验证:检查返回的Content-Type确保是图片
  5. 文件名提取:从URL路径中提取文件名,避免重复

常见问题排查:

  • 如果报SSL错误,添加verify=False参数(仅用于测试)
  • 如果报连接超时,调整timeout参数
  • 如果网站有反爬,需要添加更多请求头或使用session

把你报错的链接贴出来,我帮你具体分析。

一句话建议:检查链接格式,用urljoin标准化处理。

这么多 if 格式也都是错的,爱莫能助啊,建议你好好排版一下也许会有人帮你看看

感谢大佬

回到顶部