当前位置: 首页 > news >正文

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录

  • 一、代理的设置
    • 1.1 urllib 的代理设置
    • 1.2 requests 的代理设置
    • 1.3 httpx 的代理设置
    • 1.4 aiohttp 的代理设置
    • 1.4 Selenium 的代理设置
    • 1.6 Playwright 的代理设置
  • 二、代理池的构建和维护
    • 2.1 代理池的模块构成
    • 2.2 代理池的实现

网站为了避免爬虫采集数据可能会采取一些反爬虫的措施,例如服务器会检测某个 IP 在单位时间内的请求次数,如果这个次数超过了指定的阈值,就直接拒绝服务器,并返回一些错误信息,这种情况称为 封IP

封IP 的流程是:开始可以正常运行,正常爬取数据,一段时间过后出现错误,比如返回 403 Forbidden,这时打开网页,可能会看到 “您的 IP 访问频率太高” 这样的提示,或者跳出一个验证码让我们识别,通过之后才可以正常访问,但是过一会儿又会变成这样;

代理通过将 IP 伪装起来,让服务器识别不出是由我们本机发起的请求,就可以成功防止封 IP了;

一、代理的设置

代理是 IP 地址和端口的组合,格式是 <ip>:<port>,如果代理需要访问认证,则还需要额外的用户名和密码两个信息;

1.1 urllib 的代理设置

首先我们以最基础的 urllib 为例,来看一下代理的设置方法,代码如下:

from urllib.error import URLError
from urllib.request import ProxyHandler, build_openerproxy = '127.0.0.1:9743'
proxy_handler = ProxyHandler({'http': 'http://' + proxy,'https': 'https://' + proxy
})
opener = build_opener(proxy_handler)
try:response = opener.open('http://httpbin.org/get')print(response.read().decode('utf-8'))
except URLError as e:print(e.reason)

运行结果如下:

{"args": {}, "headers": {"Accept-Encoding": "identity", "Connection": "close", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.6"}, "origin": "106.185.45.153", "url": "http://httpbin.org/get"
}

这里我们需要借助 ProxyHandler 设置代理,参数是字典类型,键名为协议类型,键值是代理。注意,此处代理前面需要加上协议,即 http 或者 https。当请求的链接是 http 协议的时候,ProxyHandler 会调用 http 代理。当请求的链接是 https 协议的时候,会调用 https 代理。此处生效的代理是:http://127.0.0.1:9743。

创建完 ProxyHandler 对象之后,我们需要利用 build_opener 方法传入该对象来创建一个 Opener,这样就相当于此 Opener 已经设置好代理了。接下来直接调用 Opener 对象的 open 方法,即可访问我们所想要的链接。

运行输出结果是一个 JSON,它有一个字段 origin,标明了客户端的 IP。验证一下,此处的 IP 确实为代理的 IP,并不是真实的 IP。这样我们就成功设置好代理,并可以隐藏真实 IP 了。

如果遇到需要认证的代理,我们可以用如下的方法设置:

from urllib.error import URLError
from urllib.request import ProxyHandler, build_openerproxy = 'username:password@127.0.0.1:9743'
proxy_handler = ProxyHandler({'http': 'http://' + proxy,'https': 'https://' + proxy
})
opener = build_opener(proxy_handler)
try:response = opener.open('http://httpbin.org/get')print(response.read().decode('utf-8'))
except URLError as e:print(e.reason)

这里改变的只是 proxy 变量,只需要在代理前面加入代理认证的用户名密码即可,其中 username 就是用户名,password 为密码,例如 username 为 foo,密码为 bar,那么代理就是 foo:bar@127.0.0.1:9743。

如果代理是 SOCKS5 类型,那么可以用如下方式设置代理:

import socks
import socket
from urllib import request
from urllib.error import URLErrorsocks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 9742)
socket.socket = socks.socksocket
try:response = request.urlopen('http://httpbin.org/get')print(response.read().decode('utf-8'))
except URLError as e:print(e.reason)

此处需要一个 socks 模块,可以通过如下命令安装:

pip3 install PySocks

本地我有一个 SOCKS5 代理,运行在 9742 端口,运行成功之后和上文 HTTP 代理输出结果是一样的:

{"args": {}, "headers": {"Accept-Encoding": "identity", "Connection": "close", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.6"}, "origin": "106.185.45.153", "url": "http://httpbin.org/get"
}

结果的 origin 字段同样为代理的 IP。现在,代理设置成功。

1.2 requests 的代理设置

对于 requests 来说,代理设置更加简单,我们只需要传入 proxies 参数即可。

还是以上例中的代理为例,我们来看下 requests 的代理的设置:

import requestsproxy = '127.0.0.1:9743'
proxies = {'http': 'http://' + proxy,'https': 'https://' + proxy,
}
try:response = requests.get('http://httpbin.org/get', proxies=proxies)print(response.text)
except requests.exceptions.ConnectionError as e:print('Error', e.args)

运行结果:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.1"}, "origin": "106.185.45.153", "url": "http://httpbin.org/get"
}

可以发现,requests 的代理设置比 urllib 简单很多,它只需要构造代理字典,然后通过 proxies 参数即可,而不需要重新构建 Opener。

其运行结果的 origin 也是代理的 IP,这证明代理已经设置成功。

如果代理需要认证,同样在代理的前面加上用户名密码即可,代理的写法就变成如下所示:

proxy = 'username:password@127.0.0.1:9743'

和 urllib 一样,这里只需要将 username 和 password 替换即可。

如果需要使用 SOCKS5 代理,则可以使用如下方式来设置:

import requestsproxy = '127.0.0.1:9742'
proxies = {'http': 'socks5://' + proxy,'https': 'socks5://' + proxy
}
try:response = requests.get('http://httpbin.org/get', proxies=proxies)print(response.text)
except requests.exceptions.ConnectionError as e:print('Error', e.args)

在这里,我们需要额外安装一个模块,这个模块叫作requests[socks],命令如下所示:

pip3 install "requests[socks]"

运行结果是完全相同的:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.1"}, "origin": "106.185.45.153", "url": "http://httpbin.org/get"
}

另外,还有一种设置方式,和 urllib 中的方法相同,使用 socks 模块,也需要像上文一样安装 socks 库。这种设置方法如下所示:

import requests
import socks
import socketsocks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 9742)
socket.socket = socks.socksocket
try:response = requests.get('http://httpbin.org/get')print(response.text)
except requests.exceptions.ConnectionError as e:print('Error', e.args)

使用这种方法也可以设置 SOCKS5 代理,运行结果完全相同。相比第一种方法,此方法是全局设置。我们可以在不同情况下选用不同的方法。

1.3 httpx 的代理设置

httpx 的用法本身就与 requests 的非常相似,所以也是通过 proxies 参数设置的代理,不同之处在于 proxies 参数的键名不能再是 http 和 https,需要改为 \http:// 和 \https://;

设置 HTTP 代理的方式如下

import httpxproxy = '127.0.0.1:7890'
proxies = {"http://": 'http://' + proxy,"https://": 'http://' + proxy,
}with httpx.Client(proxies=proxies) as client:response = client.get('https://www.httpbin.org/get')print(response.text)

对于需要认证的代理,也是在代理地址的前面加上用户名和密码,在使用的使用替换 usename 和 password 字段;

proxy = 'username:password@127.0.0.1:7890'

对于 SOCKS 代理,需要安装 httpx-socks[asyncio] 库,安装方法如下

pip3 install "httpx-socks[asyncio]"

与此同时,我们需要设置同步模式和异步模式,同步模式的设置方法如下:

import httpx
from httpx_socks import SyncProxyTransporttransport = SyncProxyTransport.from_url('sock5://127.0.0.1:7891')with httpx.Client(transport=transport) as client:response = client.get('https://www.httpbin.org/get')print(response.text)

异步模式的设置方法如下:

import httpx
import asyncio
from httpx_socks import AsyncProxyTransporttransport = AsyncProxyTransport.from_url('sock5://127.0.0.1:7891')async def main():async with httpx.AsyncClient(transport=transport) as client:response = await client.get('https://www.httpbin.org/get')print(response.text)if __name__ == '__main__':asyncio.get_event_loop().run_until_complete(main())

和同步模式不同,此时我们用的 Transport 对象是 AsyncProxyTransport 而不是 SyncProxyTransport,同时需要将 Client 对象更改为 AsyncClient 对象,其他的和同步模式一样,运行结果也是一样的;

1.4 aiohttp 的代理设置

对于 aiohttp,可以通过 proxy 参数直接设置代理,http 代理的设置方式如下:

import asyncio
import aiohttpproxy = 'http://127.0.0.1:7890'async def main():async with aiohttp.ClientSession() as session:async with session.get('https://www.httpbin.org/get', proxy=proxy) as response:print(await response.text())if __name__ == '__main__':asyncio.get_event_loop().run_until_complete(main())

如果需要代理认证,就把代理地址改一下

proxy = 'http://username:password@127.0.0.1:7890'

对于 SOCKS 代理,需要安装一个支持库 aiohttp-socks ,安装命令如下

pip3 install aiohttp-socks

可以借助这个库的 ProxyConnector 方法来设置 SOCKS 代理,代码如下:

import asyncio
import aiohttp
from aiohttp_sock5 import ProxyConnectorconnector = ProxyConnector.from_url('socks5://127.0.0.1:7890')
async def main():async with aiohttp.ClientSession(connector=connector) as session:async with session.get('http://www.httpbin.org/get') as response:print(await response.text())if __name__ == '__main__':asyncio.get_event_loop().run_until_complete(main())

运行结果和之前一样;

1.4 Selenium 的代理设置

Selenium 同样也可以设置代理,对于 Chrome 来说,用 Selenium 设置代理的方法也非常简单,对于无认证的代理,设置方法如下所示:

from selenium import webdriverproxy = '127.0.0.1:9743'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

在这里我们通过 ChromeOptions 来设置代理,在创建 Chrome 对象的时候用 chrome_options 参数传递即可。

运行代码之后便会弹出一个 Chrome 浏览器,我们访问目标链接之后输出结果如下所示:

{"args": {}, "headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.8", "Connection": "close", "Host": "httpbin.org", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}, "origin": "106.185.45.153", "url": "http://httpbin.org/get"
}

代理设置成功,origin 同样为代理 IP 的地址。如果代理是认证代理,则设置方法相对比较麻烦,设置方法如下所示:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import zipfileip = '127.0.0.1'
port = 7890
username = 'foo'
password = 'bar'manifest_json = """{"version":"1.0.0","manifest_version": 2,"name":"Chrome Proxy","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]}
}
"""background_js ="""
var config = {mode: "fixed_servers",rules: {singleProxy: {scheme: "http",host: "%(ip) s",port: %(port) s}}}chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});function callbackFn(details) {return {authCredentials: {username: "%(username) s",password: "%(password) s"}}
}chrome.webRequest.onAuthRequired.addListener(callbackFn,{urls: ["<all_urls>"]},['blocking']
)
""" % {'ip': ip, 'port': port, 'username': username, 'password': password}plugin_file = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_file, 'w') as zp:zp.writestr("manifest.json", manifest_json)zp.writestr("background.js", background_js)
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_extension(plugin_file)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

这里需要在本地创建一个 manifest.json 配置文件和 background.js 脚本来设置认证代理。运行代码之后本地会生成一个 proxy_auth_plugin.zip 文件来保存当前配置。

得到运行结果和上面一样,origin 字段为客户端的 IP,证明代理设置成功;SOCKS 代理的设置方式也比较简单,把对应的协议修改为 socks5 即可,如无密码认证的代理设置方法为:

from selenium import webdriverproxy = '127.0.0.1:7890'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=socks5://' + proxy)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

运行结果和上面一样;

1.6 Playwright 的代理设置

相对 Selenium 和 Pyppeteer,Playwright 的代理设置更加的方便,因为其预留了一个 proxy 参数,在启动的时候就可以设置。

对于 HTTP / SOCKS 代理来说,可以这样设置

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.Chromium.launch(proxy:{'server': 'http://127.0.0.1:7890',	# 'server': 'socks5://127.0.0.1:7890',	})page = browser.new_page()page.goto('http://www.httpbin.org/get')print(page.content())browser.close()

二、代理池的构建和维护

2.1 代理池的模块构成

基本模块分为 4 块:存储模块、获取模块、检测模块、接口模块。

![[9-1.jpg]]

  • 存储模块:负责存储抓取下来的代理。首先要保证代理不重复,要标识代理的可用情况,还要动态实时处理每个代理,所以一种比较高效和方便的存储方式就是使用 Redis 的 Sorted Set,即有序集合。

  • 获取模块:需要定时在各大代理网站抓取代理。代理可以是免费公开代理也可以是付费代理,代理的形式都是 IP 加端口,此模块尽量从不同来源获取,尽量抓取高匿代理,抓取成功之后将可用代理保存到数据库中。

  • 检测模块:需要定时检测数据库中的代理。这里需要设置一个检测链接,最好是爬取哪个网站就检测哪个网站,这样更加有针对性,如果要做一个通用型的代理,那可以设置百度等链接来检测。另外,我们需要标识每一个代理的状态,如设置分数标识,100 分代表可用,分数越少代表越不可用。检测一次,如果代理可用,我们可以将分数标识立即设置为 100 满分,也可以在原基础上加 1 分;如果代理不可用,可以将分数标识减 1 分,当分数减到一定阈值后,代理就直接从数据库移除。通过这样的标识分数,我们就可以辨别代理的可用情况,选用的时候会更有针对性。

  • 接口模块:需要用 API 来提供对外服务的接口。其实我们可以直接连接数据库来取对应的数据,但是这样就需要知道数据库的连接信息,并且要配置连接,而比较安全和方便的方式就是提供一个 Web API 接口,我们通过访问接口即可拿到可用代理。另外,由于可用代理可能有多个,那么我们可以设置一个随机返回某个可用代理的接口,这样就能保证每个可用代理都可以取到,实现负载均衡。

2.2 代理池的实现

文章中的实现在 Github 上创建了项目:Python3WebSpider/ProxyPool: An Efficient ProxyPool with Getter, Tester and Server (github.com)

其主要项目在 ProxyPool 中的 proxypool 文件夹中,

TodoList

相关文章:

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...

西安电子科技大学萌新智慧指南(校区篇)

本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…...

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件

鼠标滚轮滚动事件&#xff1a;onwheel 获取鼠标滚轮滚动的方向&#xff1a;wheelDelta 比如&#xff1a;向上滚动&#xff1a;109 &#xff08;所有正值都是向上&#xff09; 向下滚动&#xff1a;-109&#xff08;所有负值都是向下&#xff09; 注意&#xff1a;当…...

怎样做网站推广

拥有一个精致而富有吸引力的网站是成功商业运营的关键。然而&#xff0c;仅仅拥有一个网站是不够的&#xff0c;您还需要通过有效的推广策略吸引更多的访问者。以下是一些成功的网站推广策略&#xff0c;帮助您提升流量并增加知名度。 1. 优化SEO&#xff1a; 搜索引擎优化&am…...

Unity引擎加密方案解析

据悉&#xff0c;Unity引擎的全球市场占有率已经超过50%&#xff0c;而在全球排名前1000的手游当中&#xff0c;这一数据更是高达73%。不止如此&#xff0c;Unity在中国拥有高达350万的注册用户&#xff0c;《崩坏星穹铁道》、《王者荣耀》等爆款游戏均为Unity引擎开发。 庞大…...

遇到的几个iOS问题

1 unable to boot the simulator 跑模拟器的时候遇到这个报错&#xff0c; 解决方法 处理办法&#xff1a; 删除升级之前的模拟器缓存&#xff0c;重启模拟器。删除路径&#xff1a;~/Library/Developer/CoreSimulator/Cache 注意&#xff1a;后面可能还会复现这个报错&#x…...

掌握ChatGPT写作艺术:从入门到精通的四个层次

这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作&#xff0c;我归纳了以下规律&#xff0c;希望能为你带来启发。 一、写作步骤 撰写一篇文章&#xff0c;思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…...

虚幻UE5安装报错误代码:SU-PQR5

找到图标的快捷方式 “Epic Games Launcher”右键属性&#xff0c;在目标最后添加-SkipBuildPatchPrereq&#xff0c;如下图&#xff1a; 最后&#xff0c;见证奇迹成功打开软件&#xff0c;可以继续安装啦。 参考资料&#xff1a; 【图片】求教各位大佬--错误代码SU-PQR5【ep…...

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用

Gemma 模型 Gemma模型是谷歌发布的一个开源模型&#xff0c;任何人都可以免费下载预训练模型&#xff0c;进行使用。而谷歌最近也发布了Gemma 2 模型&#xff0c;模型参数超过了 200 亿大官&#xff0c;果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…...

人工智能与机器学习原理精解【12】

文章目录 分级聚类理论分级聚类的详细说明1. 定义2. 算法3. 计算4. 例子5. 例题 皮尔逊相关系数 julia实现 参考文献 分级聚类 理论 分级聚类的详细说明 1. 定义 分级聚类&#xff08;Hierarchical Clustering&#xff09;&#xff0c;又称为层次聚类&#xff0c;是一种通过…...

openEuler系统安装Visual Studio Code

openEuler系统安装Visual Studio Code 背景安装密钥和存储库更新包缓存并使用dnf安装包Fedora 22及以上版本旧版本使用yum 安装过程截图安装成功看桌面效果 背景 openEuler(openEuler-24.03-LTS)安装了麒麟UKUI桌面但是没有麒麟软件商店想安装Visual Studio Code 安装密钥和…...

Qt 系统相关 - 事件

目录 1. 事件介绍 2. 事件的处理 示例1&#xff1a;处理鼠标进入和离开 示例2&#xff1a;当鼠标点击时&#xff0c;获取对应的坐标值&#xff1b; 3. 按键事件 3.1 单个按键 3.2 组合按键 4. 鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标…...

Ubuntu最小化命令行系统 安装GUI 远程桌面

Ubuntu 服务器 安装GUI 更新、升级 sudo apt update && sudo apt upgrade安装桌面环境 sudo apt install taskselsudo apt install ubuntu-desktop安装显示登录管理器 sudo apt install lightdm安装 lightdm 时系统会让选择默认的显示管理器&#xff0c;选择lightd…...

Web前端:CSS篇(二)背景,文本,链接

CSS 背景 背景颜色 background-color 属性定义了元素的背景颜色. 页面的背景颜色使用在body的选择器中: body {background-color:#b0c4de;} CSS中&#xff0c;颜色值通常以以下方式定义: 十六进制 - 如&#xff1a;"#ff0000"RGB - 如&#xff1a;"rgb(255,0…...

ubuntu 24.04 软件源配置,替换为国内源

ubuntu 默认的官网源下载速度非常慢&#xff0c;新装 ubuntu 系统首先把 apt 软件源替换成国内源。 1、使用软件和更新设置国内源 打开软件和更新&#xff0c;选择位于中国的服务器&#xff1a; 外链图片转存失败&#xff0c;源站可能有防盗链机制&#xff0c;建议将图片保存…...

【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理

并发编程 三大问题 在并发编程中&#xff0c;原子性、有序性和可见性是三个重要的问题&#xff0c;解决这三个问题是保证多线程程序正确性的基础。原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.有序性: 有序性是指程序的执行顺序与…...

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…...

Elasticsearch Nested类型详解与实战

Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene的全文搜索引擎&#xff0c;它提供了强大的搜索能力以及对数据的高效索引和查询。在ES中&#xff0c;数据通常以JSON格式存储&#xff0c;并且可以采用多种数据类型。其中&#xff0c;nested类型是一种特殊的对象数…...

网络编程,网络协议,UDP协议

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...

每日一题——第六十三题

题目&#xff1a;判断一个数是否为合数 #include <stdio.h> #include <stdbool.h> // 为了使用bool类型 // 函数声明&#xff0c;用于判断是否为合数 bool isComposite(int x); int main() { int x; printf("请输入一个正整数: "); scanf(&quo…...

人工智能算法,图像识别技术;基于大语言模型的跨境商品识别与问答系统;图像识别

目录 一 .研究背景 二,大语言模型介绍 三,数据采集与预处理 商品识别算法 四. 跨境商品问答系统设计 五.需要源码联系 一 .研究背景 在当今全球化的背景下&#xff0c;跨境电商行业迅速发展&#xff0c;为消费者提供了更广泛的购物选择和更便利的购物方式。然而&#xf…...

数据库系统 第18节 数据库安全

数据库安全是确保数据库管理系统&#xff08;DBMS&#xff09;中存储的数据的保密性、完整性和可用性的过程。以下是一些关键的数据库安全措施&#xff1a; 用户身份验证&#xff08;Authentication&#xff09;&#xff1a; 这是确定用户或系统是否有权访问数据库的第一步。通…...

Golang | Leetcode Golang题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; func countBits(n int) []int {bits : make([]int, n1)for i : 1; i < n; i {bits[i] bits[i&(i-1)] 1}return bits }...

【Python变量简析】

Python变量简析 在 Python 中&#xff0c;变量是用于存储和操作数据的命名内存位置。变量的概念类似于代数中的方程变量&#xff0c;比如对于方程式 y x * x &#xff0c;x 就是变量。 Python 变量具有以下特点&#xff1a; 变量名可以由字母、数字和下划线组成&#xff0c…...

智慧零售模式下物流优化与开源AI智能名片S2B2C商城系统的深度融合

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;智慧零售模式正逐步成为零售业的新常态。该模式通过深度融合物联网、大数据、人工智能等先进技术&#xff0c;实现了线上线下无缝衔接&#xff0c;为消费者提供了更加便捷、个性化的购物体验。物流作为智慧零售的重要支撑&…...

socket和websocket 有什么区别

Socket 和 WebSocket 都用于网络通信&#xff0c;但它们的用途、协议、以及使用方式有所不同。以下是两者的主要区别&#xff1a; ### 1. **基础协议** - **Socket**: - Socket 是网络通信的一个抽象概念&#xff0c;通常基于传输层协议&#xff0c;如 TCP&#xff08…...

亿玛科技:TiDB 6.1.5 升级到 7.5.1 经验分享

作者&#xff1a; foxchan 原文来源&#xff1a; https://tidb.net/blog/6e628afd 为什么要升级&#xff1f; 本次升级7.5的目的如下&#xff1a; 1、tidb有太多的分区表需要归档整理。7.5版本这个功能GA了。 2、之前集群tikv节点的region迁移过慢&#xff0c;影响tikv节…...

8.16-ansible的应用

ansible ansible是基于模块工作的&#xff0c;本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块&#xff0c;ansible只是提供一种框架。 格式 ansible 主机ip|域名|组名|别名 -m ping|copy|... 参数 1.ping模块 m0 # 查看有没有安装epel ​ [rootm0 ~]#…...

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …...

初识FPGA

大学的时候有一门verilog语言&#xff0c;觉得很难&#xff0c;不愿学。有学习套件是黑金的一块FPGA开发板&#xff0c;可能当时点灯和点数码管了。全都忘了。 今项目需要&#xff0c;使用FPGA中的ZYNQ&#xff0c;需要c语言开发&#xff0c;随即开始学习相关知识。 ZYNQ内部…...

探索 JavaScript:从入门到精通

目录 1. JavaScript 的介绍与基础 示例&#xff1a;弹出欢迎信息 JavaScript&#xff0c;作为网络时代最流行的脚本语言之一&#xff0c;赋予了网页生动活泼的动态功能。无论是新手还是经验丰富的开发者&#xff0c;掌握 JavaScript 的核心概念和技能都是开启网络编程之门的钥…...

这4款视频压缩软件堪称是压缩界的神器!

视频在我们的日常设备当中会占用相对较多的空间&#xff0c;尤其是喜欢用视频记录的朋友。但是过多过大的视频不仅会给我们的设备带来了压力&#xff0c;也不利于分享和管理。今天我就要给大家分享几个视频压缩的小妙招。 1、福昕压缩 直通车&#xff1a;www.foxitsoftware.cn…...

【ARM 芯片 安全与攻击 5.6 -- 侧信道与隐蔽信道的区别】

文章目录 侧信道与隐蔽信道的区别侧信道攻击(Side-channel Attack)侧信道攻击简介侧信道攻击 使用方法侧信道攻击示例隐蔽信道(Covert Channel)隐蔽信道简介隐蔽信道使用方法隐蔽信道代码示例侧信道与隐蔽信道在芯片及系统安全方面的使用侧信道的应用隐蔽信道的应用Summary…...

C#:Bitmap类使用方法—第4讲

大家好&#xff0c;今天接着上一篇文章继续讲。 下面是今天的方法&#xff1a; &#xff08;1&#xff09;Bitmap.MakeTransparent 方法&#xff1a;使此 Bitmap的默认透明颜色透明。 private void MakeTransparent_Example1(PaintEventArgs e) { // Create a Bitmap object…...

Vue是如何实现nextTick的?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue.js 的 nextTick 函数是一个非常重要的功能&#xff0c;它用于延迟执行代码块到下次 DOM 更新循环之后。这在 Vue.js 的异步更新队列机制中非常有用&#xff0c;尤其是在你需要基于更新后的 DOM 来…...

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…...

《c++并发编程实战》 笔记

《c并发编程实战》 笔记 1、你好&#xff0c;C的并发世界为什么要使用并发 第2章 线程管理2.1.1 启动线程2.2 向线程函数传递参数2.5 识别线程 第3章 线程间共享数据3.2.1 C中使用互斥量避免死锁的进阶指导保护共享数据的替代设施 第4章 同步并发操作4.1 等待一个事件或其他条件…...

57qi5rW35LqRZUhS pc.mob SQL注入漏洞复现

0x01 产品简介 57qi5rW35LqRZUhS是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 57qi5rW35LqRZUhS pc.mob 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例…...

微信小程序--27(自定义组件4)

一、父子组件之间通信的3种方式 1、属性绑定 用于父组件向子组件的只当属性设置数据&#xff0c;但只能设置JSON兼容的数据 2、事件绑定 用于子组件向父组件传递数据&#xff0c;可以传递任意数据 3、获取组件实例 父组件还可以通过this.select Component()获取子组件的实…...

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考&#xff1a;为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构&#xff1f; 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…...

VBA技术资料MF184:图片导入Word添加说明文字设置格式

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

在函数设计中应用单一职责原则:函数分解与职责分离

在函数设计中应用单一职责原则&#xff1a;函数分解与职责分离 引言 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;是面向对象设计原则中的核心原则之一&#xff0c;强调一个类或函数应该只有一个责任或理由去改变。在函数设计中&#xff0c;应…...

多线程锁机制面试

目录 乐观锁的底层原理 ReentrantLock的实现原理 读写锁 ReentrantReadWriteLock synchronized 底层原理 Lock和synchronized的区别 乐观锁的底层原理 版本号机制 在数据库表中添加一个版本号字段&#xff08;如 version&#xff09;&#xff0c;每次更新数据时都会将版本号…...

《SQL 中计算地理坐标两点间距离的魔法》

在当今数字化的世界中&#xff0c;地理数据的处理和分析变得越来越重要。当我们面对一个包含地理坐标数据的表时&#xff0c;经常会遇到需要计算两点之间距离的需求。无论是在物流配送路线规划、地理信息系统应用&#xff0c;还是在基于位置的服务开发中&#xff0c;准确计算两…...

微服务可用性设计

一、隔离 对系统或资源进行分割&#xff0c;实现当系统发生故障时能限定传播范围和影响范围。进一步的&#xff0c;通过隔离能够降低系统之间得耦合度&#xff0c;使得系统更容易维护和扩展。某些业务场景下合理使用隔离技巧也能提高整个业务的性能。我理解隔离本质就是一种解…...

【扒代码】dave readme文档翻译

jerpelhan/DAVE (github.com) 摘要 低样本计数器估算选定类别对象的数量&#xff0c;即使在图像中只有少量或没有标注样本的情况下。目前最先进的技术通过对象位置密度图的总和来估算总数量&#xff0c;但这种方法无法提供单个对象的位置和大小&#xff0c;这对于许多应用来说…...

c语言---文件

这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识&#xff1a; 首先在了解文件之前&#xff0c;我们需要了解C/C程序内存…...

Windows系统下Go安装与使用

step1&#xff1a; 下载go语言SDK 下载地址&#xff1a;https://go.dev/dl/ 下载后选择合适位置安装即可&#xff0c;我选择D盘 在安装完成后&#xff0c;可以通过go env 命令检测是否安装成功。在“命令提示符”界面输入“go env”命令&#xff0c;如果显示如下类似结果则说明…...

day24-测试之接口测试基础

目录 一、接口的定义 二、接口的优点 三、API接口 四、接口测试流程 五、网络基础概念 六、HTTP和RURL 七、get和post请求 八、数据格式 九、状态码 十、restful风格 十一、接口工具 一、接口的定义 程序之间协作所要遵循的一套规范、标准 二、接口的优点 2.1.责任…...