[新人求助] 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爬取网站图片时,其他链接正常输出,但其中一个链接报错原因及解决方法
求大佬帮忙看一下啊
这个问题我遇到过,典型的爬虫链接处理问题。报错原因通常是以下几种情况:
- 链接格式问题:有些图片链接可能是相对路径、协议相对路径(//开头)或者包含特殊字符
- 服务器限制:某些链接可能有反爬机制,需要添加请求头
- 网络问题:链接可能暂时不可访问或需要重定向
- 编码问题: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)
关键点说明:
- 链接标准化:使用
urljoin处理相对链接,自动补全完整URL - 协议处理:单独处理
//开头的协议相对链接 - 错误处理:使用try-except捕获所有可能的异常
- 内容验证:检查返回的Content-Type确保是图片
- 文件名提取:从URL路径中提取文件名,避免重复
常见问题排查:
- 如果报SSL错误,添加
verify=False参数(仅用于测试) - 如果报连接超时,调整
timeout参数 - 如果网站有反爬,需要添加更多请求头或使用session
把你报错的链接贴出来,我帮你具体分析。
一句话建议:检查链接格式,用urljoin标准化处理。
这么多 if 格式也都是错的,爱莫能助啊,建议你好好排版一下也许会有人帮你看看
感谢大佬

