东南方的某硕 2023-09-20 10:34 采纳率: 100%
浏览 17
已结题

requests 无法通过链接爬取照片

本项目主要是为了通过requests爬取验证码图片,便于通过文本识别绕过验证码。
但是通过requests无法下载保存验证码图片,无法交给第三方识别。
通过工具能够成功定位到图片元素的位置,并确认图片链接。如下图

img

验证码图片出现时,通过抓包得到如下结果。其中validateimage即为图片,详细请求信息如下图。预览为图片,响应为空

img

尝试通过requests获取图片

r1 = requests.get(r'http://yuyue.seu.edu.cn/eduplus/validateimage', headers=headers, allow_redirects= False)
print(r1.content)

image_path = 'test_'+str(random.randint(0, 9999))+'.jpg'
print(image_path)
with open(image_path, 'wb') as f:
    f.write(r1.content)
    f.close()

input('输入结束')

输出结果如下,链接可以成功访问,但是得到的不是图片。图中得到.jpg文件其实根本无法打开,其本质为图中展示的代码

img

点击该链接,可以在新页面打开图片。图片可以通过右键“另存为”’保存。

img

该链接网址的元素组成如下图

img

如果继续访问元素中的链接,仍将会跳转到此页面,只是会刷新验证码。
已排除问题:

  • header、cookies、referer设置都没有问题
  • 在requests.get()中设置了allow_redirects= False,以防止页面跳转。但是没有效果

感觉可能问题:(只是猜测,本人不太了解相关知识)

  • 网页采用了动态加载,掩盖了图片的源地址。但是该如何访问图片原地址?
  • 是否采用js逆向?

其他

  • 虽然可以通过selenium 库获得该图片,但是selenium调用速度太慢。本项目讲求速度
  • 最好能通过requests库解决该问题,如果有其他更好的方案,本人十分愿意虚心学习交流。
  • 写回答

11条回答 默认 最新

  • IT小辉同学 Java领域优质创作者 2023-09-20 11:08
    关注

    1.根据我的后端经验,有可能返回的是一个base64的字节,并不是真实的图片,经过前端组件渲染才形成的图片
    2.非常不建议爬取学校官网图片,服务器本来就有那么多人访问,而且保护很强,自己也拿捏不住尺度,容易造成对于服务器的攻击
    3.可以试试彼岸图网或者豆瓣里面的图片,但是适度,不要过分爬取
    4.这里提供部分代码作为参考:
    案例一:

    import requests
    from bs4 import BeautifulSoup as bs
    import os
    url="http://pic.people.com.cn/"
    resp=requests.get(url=url)
    resp.encoding="gbk"
    page=bs(resp.text,"html.parser")
    ul=page.find("ul",class_="swiper-wrapper")
    li=ul.find_all("li")[1:]
    # print(li)
    for l in li:
        a=l.find_all("a")
        for a in a:
            img=a.find_all("img")
            for img in img:
                src=img.get("src")
                name=img.get("alt")
                print(name)
                img_down=url+src
                img_down=requests.get(img_down)
                img_down.encoding="utf-8"
                with open("../data/img/"+name+".png","wb") as f:
                    f.write(img_down.content)
                    print(name,":","下载完成!!!")
    print("全部下载完成!")
    
    

    案例二:

    import requests as re
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from lxml import etree
    import time
    driver=webdriver.Chrome()
    start_url="https://cc0.cn/"
    driver.get(url=start_url)
    time.sleep(3)
    driver.find_element_by_xpath("/html/body/div[1]/div/form/input[4]").send_keys("风景",Keys.ENTER)
    time.sleep(1)   
    img_list=[]
    for i in range(5):
        path=f'/html/body/div[4]/div[{i}]/a/img'
        img=driver.find_element_by_xpath(str(path))
        img_list.append(img)
        time.sleep(2)
    img_list
    
    

    案例三:

    import warnings  
    import openpyxl
    import requests as rq
    import pandas as pd
    import numpy as np
    from bs4 import BeautifulSoup as bs
    from matplotlib.pyplot import plot as plt
    warnings.filterwarnings("ignore") #忽略警告
    
    # 爬取目标
    base_url="https://pic.netbian.com/new/"
    #设置请求头
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
    #进行访问
    rep_html=rq.get(base_url,headers=headers)
    #字符集设置
    rep_html.encoding="gbk"
    #显示获取到的网页内容
    # print(rep_html.text)
    #网页数据解析
    page=bs(rep_html.text,"html.parser")
    #获取ul标签
    ul=page.find('ul',class_="clearfix")
    #在ul标签中获取图片地址
    img_list=ul.find_all("img")
    print(img_list[1])
    #在ul标签中获取图片名称
    name_list=ul.find_all("b")
    print(name_list[1])
    # 爬取目标
    base_url="https://pic.netbian.com/new/"
    #设置请求头
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
    #进行访问
    rep_html=rq.get(base_url,headers=headers)
    #字符集设置
    rep_html.encoding="gbk"
    #显示获取到的网页内容
    # print(rep_html.text)
    #网页数据解析
    page=bs(rep_html.text,"html.parser")
    #获取ul标签
    ul=page.find('ul',class_="clearfix")
    #在ul标签中获取图片地址
    img_list=ul.find_all("img")
    #在ul标签中获取图片名称
    name_list=ul.find_all("b")
    img_list_clean=[]
    name_list_clean=[]
    for img in img_list:
        #获取img标签中的url,并且进行拼接
        img="https://pic.netbian.com"+img["src"]
        img_list_clean.append(img)
        #获取图片名称
    for name in name_list:
        name_list_clean.append(name.text)
    print(img_list_clean[1])
    print(name_list_clean[1])
    #构造数据字典
    data={"img_name":name_list_clean,"img_url":img_list_clean}
    #喂入DataFrame
    pd_data=pd.DataFrame(data)
    #数据保存
    pd_data.to_excel("../data/xlsx/img.xlsx",index_label=None)
    #数据读取
    data=pd.read_excel("../data/xlsx/img.xlsx")
    data
    
    

    欢迎私信一起交流学习

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 已采纳回答 9月20日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项