请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

图片下载到本地无法打开,大小都为1KB

图片下载到本地无法打开,大小都为1KB.
图片描述
打印link出来的链接是能正确在线访问图片的,
但image_response = requests.get(link, headers=headers)这步,打印image_response.status_code返回403,是网站已经无法扒图片了吗?
headers中Referer已加。

打印日志:
link的链接能正常打开,status_code返回403
图片描述

txt文件:
图片描述

本地图片仅为1KB,无法打开:
图片描述
图片描述

from lxml import etree

import requests

url = "http://angelimg.spbeen.com"
headers = {
    "Referer" : "http://angelimg.spbeen.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
}
response = requests.get(url=url, headers=headers)

html = etree.HTML(response.text)
image_links = html.xpath(".//img/@src")
# 限制数量,方便测试
size = 10
for index, link in enumerate(image_links, start=1):
    if index > size:
        break
    # 写入目录文件
    with open("images/index.txt", mode="a", encoding="utf8") as index_file:
        index_file.write(link + "\n")

    # 写入图片文件
    image_name = link.split("/")[-1]
    file_name = "images/{}_{}".format(index, image_name)
    try:
        image_response = requests.get(url=link, headers=headers)
        print("发送的Referer:", image_response.request.headers.get('Referer'))
        print("返回状态码:", image_response.status_code)
        print("内容类型:", image_response.headers.get('Content-Type'))
        with open(file_name, mode="wb") as image_file:
            image_file.write(image_response.content)
        print(index, "success", link)
    except Exception as e:
        print(index, "error", link, e)

正在回答

2回答

from lxml import etree
import requests
url = "http://angelimg.spbeen.com"
headers = {
"Referer" : "http://angelimg.spbeen.com/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36",
}
response = requests.get(url=url, headers=headers)
html = etree.HTML(response.text)
image_links = html.xpath(".//img/@src")
size = 10
for index, link in enumerate(image_links, start=1):
if index > size:
break
# 写入目录文件
with open("images/index.txt", mode="w", encoding="utf8") as index_file:
index_file.write(link + "\n")

# 写入图片文件
image_name = link.split("/")[-1]
file_name = "images/{}_{}".format(index, image_name)
try:
image_response = requests.get(url=link, headers=headers)
print('Link:', link)
print("Request Header:", image_response.request.headers)
print("Status Code:", image_response.status_code)
print("Content Type:", image_response.headers.get('Content-Type'))
with open(file_name, mode="wb") as image_file:
image_file.write(image_response.content)
print(index, "success", link)
except Exception as e:
print(index, "error", link, e)

我搞定了,你换上我的headers试试,貌似是 / 的问题,最后补上 /

https://img1.sycdn.imooc.com/szimg/60cf1a6909b5769926800878.jpg

https://img1.sycdn.imooc.com/szimg/e7a2916909b5769926180556.jpg

https://img1.sycdn.imooc.com/szimg/283a1d6909b5769930640894.jpg


0 回复 有任何疑惑可以回复我~
  • 提问者 LouQinyu #1
    确实都可以了,谢谢老师!原来这么细节!
    我看视频里没有斜杠啊,是目标网站的服务器修改了精准匹配的逻辑么?
    回复 有任何疑惑可以回复我~ 4小时前
  • 小布_老师 回复 提问者 LouQinyu #2
    这是资源站的规则,不需要刻意去记,只需要去比对,浏览器能行,则爬虫也可以。爬虫本质就是浏览器中的一个请求记录,去仔细对比网络栏的请求记录信息。
    回复 有任何疑惑可以回复我~ 4小时前
小布_老师 6小时前

贴一下终端输出日志和txt连接文本。


打开目标网站没问题,图片加载正常,爬虫应该也是没问题的
https://img1.sycdn.imooc.com/szimg/7f07866909b55a8930920954.jpg

0 回复 有任何疑惑可以回复我~
  • 提问者 LouQinyu #1
    日志已贴,link返回的图片链接确实能打开。但我尝试直接复制老师的源码做测试也扒不下图片。
    回复 有任何疑惑可以回复我~ 6小时前
  • 小布_老师 回复 提问者 LouQinyu #2
    浏览器打开了网页,然后单独打开图片,前几次打开是缓存,多刷新几次,如果权限不够后面会直接失效。权限够的话可以一直刷新
    回复 有任何疑惑可以回复我~ 5小时前
  • 看了下代码,没啥问题,referer也加了。你把ua加到请求头,再试一次
    回复 有任何疑惑可以回复我~ 5小时前
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号