简单分析
- 获取哪些网站的代理IP
- IP 保存为
{'http': '1x.1x.1x.1x:1x'}
- 确定IP 可用:
timeout
,status_code
- 随机获取:
random.choice
代码展示
import requests
from lxml import etree
class DaiLiIP():
"""最好将这里改为异步"""
def __init__(self):
"""初始化:需要抓取哪些网站的数据"""
self.yundaili = "http://www.ip3366.net/free/?stype=1&page={}"
self.kuaidaili = "https://www.kuaidaili.com/free/inha/{}/"
self.bajiu_url = "https://www.89ip.cn/index_{}.html"
def get_url_list(self):
"""获取URL列表"""
return ["http://www.ip3366.net/free/?stype=1&page={}".format(page) for page in range(1, 8)] + \
[self.kuaidaili.format(page) for page in range(1, 1000)] + \
[self.bajiu_url.format(page) for page in range(1, 9)]
def get_html(self, url, proxy=None):
"""获取URL返回的response"""
response = requests.get(url, proxies=proxy)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response.text
return None
def parse_ip(self, html):
"""解析IP,不同网站使用不同的解析方式"""
x_html = etree.HTML(html)
try:
items = x_html.xpath("//div[@id='list']//tbody/tr")
for item in items:
yield {f"{item.xpath('td[4]/text()')[0].lower()}": f"{item.xpath('td[1]/text()')[0]}:{item.xpath('td[2]/text()')[0]}"}
except:
items = x_html.xpath("//table[@class='layui-table']/tbody/tr")
for item in items:
yield {"http": f"{item.xpath('td[1]/text()')[0]}:{item.xpath('td[2]/text()')[0]}".replace('\n', '').replace('\t', '')}
def ip_list(self):
"""直接返回IP列表,后续可以直击随机列表"""
IP_LIST = []
url_list = self.get_url_list()
for url in url_list:
html = self.get_html(url)
for ip in self.parse_ip(html):
if requests.get("https://www.baidu.com/", ip).status_code == 200:
IP_LIST.append(ip)
else:
self.ip_list()
return IP_LIST
使用代理
伪装一下自己的访问IP
这里还使用了随机请求头:from fake_useragent import UserAgent
def get_html(self, url):
"""自动重连三次"""
i = 0
while i < 3:
try:
html = requests.get(
url,
proxies=choice(self.proxy),
headers={"User-Agent": UserAgent().random},
timeout=2
)
return html.text
except requests.exceptions.RequestException:
i += 1
应用场景
自建代理池
- 根据
访问速度
、失败次数
给IP 加权 - 最后直接获取权重最大的IP
- 存放在Redis中,通过读取redis获取
web返回
- 写一个简单的web应用
- 在应用中随机返回一个IP
评论区