- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为我的爬虫设置代理。我正在使用请求模块和美丽的汤。
我找到了一个 API 链接列表,这些链接提供具有 4 种类型协议(protocol)的免费代理。
所有使用 3/4 协议(protocol)的代理(HTTP、SOCKS4、SOCKS5)都可以工作,除了一个,那就是使用 HTTPS 协议(protocol)的代理。
这是我的代码:
from bs4 import BeautifulSoup
import requests
import random
import json
# LIST OF FREE PROXY APIS, THESE PROXIES ARE LAST TIME TESTED 50 MINUTES AGO, PROTOCOLS: HTTP, HTTPS, SOCKS4 AND SOCKS5
list_of_proxy_content = ["https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=CH&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=FR&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=DE&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=1500&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=AT&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=IT&protocols=http%2Chttps%2Csocks4%2Csocks5"]
# EXTRACTING JSON DATA FROM THIS LIST OF PROXIES
full_proxy_list = []
for proxy_url in list_of_proxy_content:
proxy_json = requests.get(proxy_url).text
proxy_json = json.loads(proxy_json)
proxy_json = proxy_json["data"]
full_proxy_list.extend(proxy_json)
# CREATING PROXY DICT
final_proxy_list = []
for proxy in full_proxy_list:
#print(proxy) # JSON VALUE FOR ALL DATA THAT GOES INTO PROXY
protocol = proxy['protocols'][0]
ip_ = proxy['ip']
port = proxy['port']
proxy = {protocol : protocol + '://' + ip_ + ':' + port}
final_proxy_list.append(proxy)
# TRYING PROXY ON 3 DIFERENT WEBSITES
for proxy in final_proxy_list:
print(proxy)
try:
r0 = requests.get("https://edition.cnn.com/", proxies=proxy, timeout = 15)
if r0.status_code == 200:
print("GOOD PROXY")
else:
print("BAD PROXY")
except:
print("proxy error")
try:
r1 = requests.get("https://www.buelach.ch/", proxies=proxy, timeout = 15)
if r1.status_code == 200:
print("GOOD PROXY")
else:
print("BAD PROXY")
except:
print("proxy error")
try:
r2 = requests.get("https://www.blog.police.be.ch/", proxies=proxy, timeout = 15)
if r2.status_code == 200:
print("GOOD PROXY")
else:
print("BAD PROXY")
except:
print("proxy error")
print()
我的问题是,为什么 HTTPS 代理不起作用,我做错了什么?
{'socks4': 'socks4://185.168.173.35:5678'}
{'http': 'http://62.171.177.80:3128'}
{'https': 'http://159.89.28.169:3128'}
我看到有时人们会像这样传递代理:
proxies = {"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080"}
但是这个 dict 有 2 个协议(protocol),但在链接中它只有 http,为什么?
最佳答案
您的代码有几处错误。我将首先解决悬而未决的果实。
首先,您的 SOCKS 代理也不起作用。这是为什么。
编写代理字典的正确方法可以在requests documentation中找到。 .
# your way
proxy = {'socks4': 'socks4://ip:port'}
# the correct way
proxy = {'https': 'socks4://ip:port'} # note the s in https
# or another correct way
proxy = {'http': 'socks4://ip:port'} # Note the http with no s
# best correct way if your urls are mixed http:// https://
proxies = {
'http': 'socks4://ip:port',
'https': 'socks4://ip:port',
}
http
和
https
在这些条目中,不是代理服务器的协议(protocol),而是您的 url。
https://www.example.com
对比
http://www.example.com
.
https://
的请求url 将转到
https
条目,而对
http://
的请求url 将通过
http
入口。如果您只提供一个条目
{'http': 'socks4://ip:port'}
, 并且 url 请求是针对
https://
url,那个请求
不会被代理,你自己的IP就会暴露出来。因为没有
socks4://www.example.com
这样的东西浏览时,您提出的请求没有被代理。
{'socks4': 'socks4://ip:port'}
而不是正确的
{'https': 'socks4://ip:port'}
,您仍然收到 200 个状态代码,并且您的代码返回误报。它返回 200 是因为您确实连接了,但是使用您自己的 IP 而不是通过代理。
Python 3.8.12
上测试.有关代理连接错误的一些信息在其下方。
country=CH
第一个应该说
country=CN
和
country=AT
应该说
country=AR
.我的代码反射(reflect)了这一点。
from bs4 import BeautifulSoup
import requests
import json
import time
# LIST OF FREE PROXY APIS, THESE PROXIES ARE LAST TIME TESTED 50 MINUTES AGO
# PROTOCOLS: HTTP, HTTPS, SOCKS4 AND SOCKS5
list_of_proxy_content = [
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=CN&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=FR&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=DE&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=1500&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=AR&protocols=http%2Chttps%2Csocks4%2Csocks5",
"https://proxylist.geonode.com/api/proxy-list?limit=150&page=1&sort_by=lastChecked&sort_type=desc&filterLastChecked=50&country=IT&protocols=http%2Chttps%2Csocks4%2Csocks5",
]
# EXTRACTING JSON DATA FROM THIS LIST OF PROXIES
full_proxy_list = []
for proxy_url in list_of_proxy_content:
proxy_json = requests.get(proxy_url).text
proxy_json = json.loads(proxy_json)
proxy_json = proxy_json["data"]
full_proxy_list.extend(proxy_json)
if not full_proxy_list:
print("No proxies to check. Exiting...")
exit
else:
print(f"Found {len(full_proxy_list)} proxy servers. Checking...\n")
# CREATING PROXY DICT
final_proxy_list = []
for proxy in full_proxy_list:
# print(proxy) # JSON VALUE FOR ALL DATA THAT GOES INTO PROXY
protocol = proxy["protocols"][0]
ip_ = proxy["ip"]
port = proxy["port"]
proxy = {
"https": protocol + "://" + ip_ + ":" + port,
"http": protocol + "://" + ip_ + ":" + port,
}
final_proxy_list.append(proxy)
# TRYING PROXY ON 3 DIFERENT WEBSITES
for proxy in final_proxy_list:
print(proxy)
try:
# Use ipinfo.io to test proxy ip
url = "https://ipinfo.io/json?token=67e01402d14101"
r0 = requests.get(url, proxies=proxy, timeout=15)
if r0.status_code == 200:
# The 3-line block below only works on ipinfo.io
output = r0.json()
real_ip = output["ip"]
print(f"GOOD PROXY [IP = {real_ip}] {proxy}\n")
# Do something with the response
html_page = r0.text
soup = BeautifulSoup(r0.text, "html.parser")
print(soup, "\n")
r0.close() # close the connection so it can be reused
# Break out of the proxy loop so we do not send multiple successful
# requests to the same url. Info needed was already obtained.
# Comment out to check all possible proxies during testing.
break
else:
# If the response code is something other than 200,
# it means the proxy worked, but the website did not.
print(f"BAD URL: [status code: {r0.status_code}]\n{r0.headers}\n")
r0.close()
time.sleep(5) # Don't overload the server
except Exception as error:
print(f"BAD PROXY: Reason: {str(error)}\n")
您看到的大多数错误都是超时错误,这应该是不言自明的。
Remote end closed connection without response
是服务器端407 Proxy Authentication Required
是我的错误之一[Errno 111] Connection refused
是我的错误之一check_hostname requires server_hostname
,
EOF occurred in violation of protocol
, 或
SSL: WRONG_VERSION_NUMBER
运行上述代码后,降级您的 urllib3 库。在某些最新版本中存在代理错误以及其他一些错误。您可以使用命令
pip install -U urllib3==1.25.11
来执行此操作。或
python3 -m pip install -U urllib3==1.25.11
.
关于python - 使用 Python 抓取网站时设置代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69064792/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!