针对 “python爬取免费代理并验证代理是否可用” 这个话题,我来给您详细讲解一下攻略。
1. 爬取免费代理
要爬取免费代理,我们可以利用 requests
库来发起网络请求。我们可以以 快代理 为例,代码如下所示:
import requests
from bs4 import BeautifulSoup
def get_proxies(url):
# 发起请求
response = requests.get(url)
# 解析html
soup = BeautifulSoup(response.text, 'html.parser')
# 获取代理table对象
table = soup.find('table', attrs={'class': 'table table-bordered table-striped'})
trs = table.find_all('tr')
# 列表推导式获取代理IP和端口号
proxies = [':'.join([td.text.strip() for td in tr.select('td.text-center')[0:2]])
for tr in trs[1:]]
return proxies
if __name__ == '__main__':
url = 'https://www.kuaidaili.com/free/'
proxies = get_proxies(url)
print(proxies)
以上代码中,我们先调用 requests.get(url)
方法发起网络请求,然后使用 BeautifulSoup
将页面的 html 格式进行解析,然后获取代理table对象,再进行解析。
2. 验证代理是否可用
通常情况下,爬取到的代理并不能保证都是可用的,所以需要对代理进行验证。我们可以使用 requests.get()
来发起一个基于代理的请求,来验证当前代理是否可用。代码如下所示:
import requests
def check(ip_port):
print('checking: ', ip_port)
proxies = {
'http': 'http://' + ip_port,
'https': 'https://' + ip_port,
}
try:
response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
if response.status_code == 200:
print(ip_port, 'works')
return True
except:
print(ip_port, 'does not work')
return False
if __name__ == '__main__':
ip_port = '119.84.84.49:80'
check(ip_port)
以上代码中,我们首先构造了一个代理字典 proxies
,然后调用 requests.get()
方法发送一个基于代理的请求。如果返回的状态码为 200,则说明代理可用。
示例说明
我们使用上述两个方法来爬取免费代理,并验证代理是否可用,完整代码如下:
import requests
from bs4 import BeautifulSoup
import threading
def get_proxies(url):
# 发起请求
response = requests.get(url)
# 解析html
soup = BeautifulSoup(response.text, 'html.parser')
# 获取代理table对象
table = soup.find('table', attrs={'class': 'table table-bordered table-striped'})
trs = table.find_all('tr')
# 列表推导式获取代理IP和端口号
proxies = [':'.join([td.text.strip() for td in tr.select('td.text-center')[0:2]])
for tr in trs[1:]]
return proxies
def check(ip_port):
proxies = {
'http': 'http://' + ip_port,
'https': 'https://' + ip_port,
}
try:
response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
if response.status_code == 200:
print(ip_port, 'works')
return True
except:
print(ip_port, 'does not work')
return False
if __name__ == '__main__':
threading_list = []
# 爬取所有页码的代理
for i in range(1, 10):
url = 'https://www.kuaidaili.com/free/inha/' + str(i) + '/'
proxies = get_proxies(url)
# 验证代理是否可用
for proxy in proxies:
threading_list.append(threading.Thread(target=check, args=(proxy,)))
# 启动所有线程
for t in threading_list:
t.start()
# 等待所有线程执行完毕
for t in threading_list:
t.join()
以上代码中,我们定义了两个方法 get_proxies()
和 check()
,并创建了多个线程,用于爬取多页代理信息,以及验证代理是否可用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬取免费代理并验证代理是否可用 - Python技术站