使用特定 URL 和脚本构建代理轮换器

Posted

技术标签:

【中文标题】使用特定 URL 和脚本构建代理轮换器【英文标题】:Building a proxy rotator with specific URL and script 【发布时间】:2019-12-05 05:18:17 【问题描述】:

我正在努力使用针对不同 url 构建的现有代码构建代理旋转器。

下面的代码示例中提供了我想要的 URL。当代理类型为“HTTPS”时,我试图让提供的脚本调用所需的 URL 并获取 ALL 'IP:PORT'(当前脚本限制为十个)。 它可以在 xpath 或 bs4 中完成。不过我更熟悉bs4。

我理解其中的逻辑,但我不知道如何构建它。 首先,我尝试剥离字符串并尝试调用特定的 td 元素,但它不起作用。

#URLs I want 
url_list = ['http://spys.one/free-proxy-list/US/','http://spys.one/free-proxy-list/US/1/']

#code I have 
 from lxml.html import fromstring
 import requests
 from itertools import cycle
 import traceback

 def get_proxies():
 url = 'https://free-proxy-list.net/'
 response = requests.get(url)
 parser = fromstring(response.text)
 proxies = set()
 for i in parser.xpath('//tbody/tr')[:10]:
     if i.xpath('.//td[7][contains(text(),"yes")]'):
        proxy = ":".join([i.xpath('.//td[1]/text()')[0], i.xpath('.//td[2]/text()')[0]])
        proxies.add(proxy)
return proxies

proxies = get_proxies()
proxy_pool = cycle(proxies)
proxy = next(proxy_pool)
response = requests.get(url,proxies="http": proxy, "https": proxy)

我希望了解所提供的代码是如何为 2 个所需 URL 构建的,当代理类型为 HTTPS 时返回所有 IP:PORT 编号

【问题讨论】:

您可以使用请求模块从http://spys.one/free-proxy-list/US/http://spys.one/free-proxy-list/US/1/ 站点获取IP,但您无法获取PORT,因为它们是动态生成的。 这不是我们谈论代理旋转器时的意思。代理轮换器是转发到随机上游代理的代理。 我很抱歉,我试图从 2 个 URL 中列出“代理地址:端口”,以便在代理类型 = https 时放入函数中。此数据可作为 html 中的文本进行抓取 【参考方案1】:

一种方法是循环发出特定于端口的 POST 请求。您可以修改以添加到一个最终列表中。端点已经是 https 特定的。

import requests
from bs4 import BeautifulSoup as bs

def get_proxies(number, port, p):
    r = requests.post('http://spys.one/en/https-ssl-proxy/', data = 'xpp': 5, 'xf4': number)
    proxies = [':'.join([str(i),port]) for i in p.findall(r.text)]
    return proxies

ports = ['3128', '8080', '80']
p = re.compile(r'spy14>(\d1,3\.\d1,3\.\d1,3\.\d1,3)<script')
proxies = []

for number, port in enumerate(ports,1):
    proxies+=get_proxies(number, port, p)

print(proxies)

示例结果:


针对特定国家/地区:

import requests
from bs4 import BeautifulSoup as bs

def get_proxies(number, port, p, country):
    r = requests.post('http://spys.one/en/https-ssl-proxy/',  data = 'xpp': 5, 'xf4': number)
    soup = bs(r.content, 'lxml')
    proxies = [':'.join([p.findall(i.text)[0], port]) for i in soup.select('table table tr:has(.spy14:contains("' + country + '")) td:has(script) .spy14')]
    return proxies

ports = ['3128', '8080', '80']
p = re.compile(r'(\d1,3\.\d1,3\.\d1,3\.\d1,3)document')
proxies = []

for number, port in enumerate(ports,1):
    proxies+=get_proxies(number, port, p, 'United States')

print(proxies)

你说的已经写好了,我会参考我原来的回答:

from bs4 import BeautifulSoup as bs
import requests

def get_proxies(): 
    r = requests.get('https://free-proxy-list.net/')
    soup = bs(r.content, 'lxml')
    proxies = tr.td.text + ':' + tr.td.next_sibling.text for tr in soup.select('tr:has(.hx:contains(yes))') 
    return proxies 

get_proxies()

【讨论】:

您好,该 url 的代码已经编写好了,我正在尝试为 url_list = ['spys.one/free-proxy-list/US/','http://spys.one/… 构建 创意,你如何处理新端口,我在现场看到其他端口有 https。当代理类型 = https with 'td'[1] text contains "S" 时,我们不能捕获“proxyaddress:port”吗?不知何故? 我已经添加了 xpp 参数,它允许最多 500 个服务器的结果。美国的代理列表最多为 81 个代理,然后是三个指定端口。 代码需要修改才能获取 https。所以这是另一种方式。因为我们只关心 https,所以我选择使用 https,然后在一个脚本中过滤国家,并在另一个脚本中提供所有国家 这两个 url 只是我认为我的代码可以使用的完整集的子集。

以上是关于使用特定 URL 和脚本构建代理轮换器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R 和 rvest 轮换代理和 IP 地址

如何从 bash 脚本将消息记录到特定路径中的日志文件

sh bash备份轮换脚本

sh bash脚本运行循环以从文件中读取随机URL和用户代理,并使用cURL运行请求。这可以从任何系统运行

jmeter入门 设置代理服务器和录制脚本

如何在构建脚本中指定链接器标志/参数?