简单制作属于自己的代理池
简单制作属于自己的代理池
今天做一个简单的ip代理池,从免费代理平台抓取代理ip、端口,做一个可以使用的代理池,用来做爬虫等。
整体很简单:
- 1、抓取免费代理网站
- 2、提取代理信息
- 3、测试代理能否正常使用
需求明确,那就,开始吧!
抓取代理的地址:链接
网页截图:
代码如下,仅供参考,这个网站提供的都不太好用,下一次换一个再写一篇:
# coding:utf-8
"""
免费代理抓取
2021.01.09
"""
import requests
import time
from faker import Faker
from lxml import etree
class Proxy_Spider(object):
def __init__(self):
self.kuai_proxy_url = 'https://www.kuaidaili.com/free/inha/{}/'
self.faker = Faker()
self.proxy_list = []
self.headers = {
'user-agent': self.faker.user_agent(),
}
def get_data(self, url, proxy=None):
s = requests.session()
resp = s.get(url, headers=self.headers, proxies=proxy, timeout=30)
return resp.text
def proxy_test(self, proxy2):
print(proxy2)
url = 'http://ifconfig.me/ip'
proxy = {
f'http': f'http://{proxy2[0][0]}:{proxy2[1][0]}',
f'https': f'http://{proxy2[0][0]}:{proxy2[1][0]}'
}
print(proxy)
try:
resp = requests.get(url, self.headers, proxies=proxy, timeout=10, verify=False)
except Exception as e:
print('代理不可用', e)
return False
print(resp.text)
if proxy2[0][0] in resp.text:
print('代理可用, 插入代理池')
self.proxy_list.append(proxy)
else:
print('代理不可用')
def parse_html(self, html):
html = etree.HTML(html)
tr_list = html.xpath('//*[@id="list"]/table/tbody/tr')
data_json = []
if len(tr_list) > 0:
for tr in range(len(tr_list)):
prox_list = []
ip = html.xpath(f'//*[@id="list"]/table/tbody/tr[{tr}]/td[1]/text()')
port = html.xpath(f'//*[@id="list"]/table/tbody/tr[{tr}]/td[2]/text()')
http = html.xpath(f'//*[@id="list"]/table/tbody/tr[{tr}]/td[4]/text()')
speed = html.xpath(f'//*[@id="list"]/table/tbody/tr[{tr}]/td[6]/text()')
prox_list.append(ip)
prox_list.append(port)
prox_list.append(http)
prox_list.append(speed)
# print(prox_list)
if len(ip) == 0:
pass
else:
data_json.append(prox_list)
return data_json
def run(self):
for page in range(1, 5):
html = self.get_data(self.kuai_proxy_url.format(str(page)))
proxy_list = self.parse_html(html)
for proxy in proxy_list:
self.proxy_test(proxy)
# time.sleep(3)
print(self.proxy_list)
if __name__ == '__main__':
p = Proxy_Spider()
p.run()