本项目主要是为了通过requests爬取验证码图片,便于通过文本识别绕过验证码。
但是通过requests无法下载保存验证码图片,无法交给第三方识别。
通过工具能够成功定位到图片元素的位置,并确认图片链接。如下图
验证码图片出现时,通过抓包得到如下结果。其中validateimage即为图片,详细请求信息如下图。预览为图片,响应为空
尝试通过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文件其实根本无法打开,其本质为图中展示的代码
点击该链接,可以在新页面打开图片。图片可以通过右键“另存为”’保存。
该链接网址的元素组成如下图
如果继续访问元素中的链接,仍将会跳转到此页面,只是会刷新验证码。
已排除问题:
感觉可能问题:(只是猜测,本人不太了解相关知识)
其他:
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
欢迎私信一起交流学习
用requests 加上cookies更好
讯飞星火提供:
要使用Python的requests库爬取网站验证码图片,你需要首先分析网站的验证码图片请求URL,然后使用requests库发送请求获取图片数据,最后将图片保存到本地。以下是一个简单的示例:
1.安装所需库
pip install requests
pip install beautifulsoup4
2.代码实现:
import requests
from bs4 import BeautifulSoup
# 分析验证码图片请求URL
def get_captcha_url(site_url):
response = requests.get(site_url)
soup = BeautifulSoup(response.text, 'html.parser')
img_tag = soup.find('img', {'class': 'captcha'}) # 根据实际网站结构修改
if img_tag:
return img_tag['src']
else:
return None
# 下载验证码图片并保存到本地
def download_captcha(url, save_path):
response = requests.get(url)
with open(save_path, 'wb') as f:
f.write(response.content)
if __name__ == '__main__':
site_url = 'https://www.example.com/login' # 替换为实际的登录页面URL
save_path = 'captcha.png'
captcha_url = get_captcha_url(site_url)
if captcha_url:
download_captcha(captcha_url, save_path)
print(f'验证码图片已保存到:{save_path}')
else:
print('未找到验证码图片')
注意:请根据实际的网站结构修改get_captcha_url函数中的img_tag查找条件。
应该是动态加载的 验证码一直在变化的
引用 皆我百晓生 小程序回复内容作答:
根据你提供的信息,通过抓包分析和代码片段查看,可以尝试以下方法解决无法通过 requests 下载验证码图片的问题:
模拟请求网页源码:尝试使用 requests 发起请求,获取整个网页的源码。然后在源码中查找图片链接,提取出正确的图片链接并进行请求。
采用会话保持机制:使用 requests.Session() 创建一个会话对象,可以在多个请求之间保持会话状态。可能需要在会话对象中设置其他的请求头参数和 cookies,以便与服务器保持更一致的状态。
使用正则表达式匹配图片链接:在网页源码中,使用正则表达式进行匹配,找出验证码图片的链接地址。然后通过 requests 请求该链接来获取图片。
下面是一个示例代码,演示如何使用 requests 库获取验证码图片:
import re
import requests
# 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36",
# 其他头部参数...
}
# 创建会话对象
session = requests.Session()
# 发起首页请求,获取源码
url = "http://yuyue.seu.edu.cn/eduplus/validateimage"
response = session.get(url, headers=headers)
# 使用正则表达式匹配验证码图片链接
pattern = r'<img src="(.*?)" alt="captcha"'
captcha_url = re.findall(pattern, response.text)[0]
# 发起验证码图片请求,保存图片
response_captcha = session.get(captcha_url, headers=headers)
image_path = 'captcha.jpg'
with open(image_path, 'wb') as f:
f.write(response_captcha.content)
# 关闭会话
session.close()
# 其他操作...
请根据你的具体情况和网页源码进行适当修改。如果以上方法无法解决问题,可能需要进一步研究网页的动态加载和请求机制,或者尝试其他工具或库,例如 pyppeteer、selenium 等。
你把一个 js 写入到文件中,当然是打不开图片的
你用Requests再请求一次,这里面的url试试,将content存到文件中看看
你应该先向这个url发起get请求,拿到这个网页的源代码也就是r1.text,在通过对源码的解析,定位到验证码的img节点,在这个节点的里面url才是你要的验证码的地址
建议捕获截图的方式,再去识别
可以很明确的告诉你,验证码图片的url肯定会重定向,而且可能还是多次,你每次发了get请求,它响应给你不仅是一个js,还会有一些特定标识符。你就简简单单的发一个get连header都不带一下,怎么可能能拿到数据
这个验证码是后端生成的,服务器并没有存储图片,所以无法通过你这种方式保存图片,而且每次请求这个链接,后端都会重新刷新验证码,所以只能使用无头浏览器使用
问题已解决。产生问题的原因在于,访问网址时,会跳转到学校登录界面。
因此需要合理的设置cookies才能进入正确的网址。
通过抓包的形式只能抓取获取图片时的一部分cookies信息,想要避开界面跳转需要完整的cookies信息。
因此采用selenium模拟登录,随后收集完整的cookies信息交给requests便可以解决该问题。
详细的解决方案及项目我已发布,可点击链接查看selenium+requests 实现网页跳转登录及爬取