前言

为了防止ip被封后还能爬取网页,最常见的方法就是自己构建一个ip代理池。

本来用的是下面这个开源项目ip代理池,
github开源项目
就是这个开源项目上好多免费的ip网站做了更新,导致它能获取的可用的代理频率不高,且它只是做了获取工作,没有做任何的测试,导致获取的代理匿名性层次不齐。用它获取的ip,用www.example.com来做目标url,一个循环20次,也不能每次都能拿到网页上的数据,于是得自己做一个高质量的ip获取池。

不过它开源的代码上也是有不少可以借鉴的。


基础常识

代理服务器

根据支持的协议分类:
HTTP代理:主要用于普通的网页浏览,可以转发HTTP请求(详见:HTTP请求方法)。
SSL/HTTPS代理:支持HTTPS协议,可以为使用SSL加密的网站提供安全的数据传输。(安全性较高的匿名浏览的好选择)
Socket4/5代理:Socks4和Socks5支持更多的网络协议,不仅限于HTTP和HTTPS,适用于更广泛的网络请求。(支持多种协议代理的好选择)

Socket4:只支持 TCP 协议,不支持 UDP 协议,也不支持域名解析(DNS)。
Socket5:支持 TCP 和 UDP 协议,支持多种身份验证机制,以及服务器端域名解析。(可以完成socket4所有网络请求,首选)

根据匿名程度分类:
透明代理 (Transparent Proxy):服务器知道你是谁,网站也可以知道你的真实IP从而判断在使用代理。
匿名代理 (Anonymous Proxy):网站无法知道你的真实IP,但可以判断你正在使用代理。
混淆代理 (Distorting Proxy):会混淆你的真实IP,同时报告给网站一个虚假的IP地址。
高度匿名代理 (Elite Proxy):对方完全无法得知你的真实IP,网站无法检测到正在使用代理。

根据【从零开始】自建高质量免费ip代理池(截止2024.4.1最新版)服务器的位置和范围分类:
全球代理:服务器分布在全球各地,可以提供多个国家和地区的IP地址。
国家特定代理:代理服务器仅位于特定国家或地区,提供该地区的IP地址。

根据IP来源分类:
数据中心IP:这些IP地址来源于数据中心,速度快,稳定性好,但容易被识别为代理。
住宅IP:来源于真实住宅网络,较难被识别为代理,适用于对匿名性要求较高的场景。
移动IP:来源于移动网络运营商,具有高匿名性,但速度和稳定性可能不如数据中心IP。

ISP 代理或静态住宅代理:试图结合数据中心和住宅代理的最佳品质。与住宅代理一样,它们归互联网服务提供商所有,而不是网络托管服务;与数据中心代理一样,它们托管在数据中心的服务器上,不涉及最终用户。

状态码

端口号

端口号大全
代理端口是什么意思呢?
HTTP代理是目前最为常用的代理,占用的端口一般为80/8080/3128/8081/9080。

HTTPS代理也叫SSL代理,占用端口一般为443。

SOCKS5代理与其他类型的代理都不同,只是起到数据包的传递作用,并不会受应用协议的局限,占用端口一般为1080。

FTP代理(文件传输)占用端口一般为21、2121。

这些端口号允许网络上的计算机识别和管理不同类型的网络流量和服务。正确配置代理端口对于确保网络请求正确路由至目标服务是非常重要的。

常见免费ip代理池网站

警告:请后续爬虫大佬爬取这些能用的代理时温柔以待,可能下次就会有更强大的反爬机制了。
现:快代理加入反爬和免费代理库不能用
选择了elite+https每10min更新一次# 选择了 响应时间3s内,存活时间1h以上,高匿 支持https,支持post,排序方式为响应时间从小到大选择了https/SSL每天更新一次选择了超级域名+https每10分钟更新一次选择了高匿+https大概是每60min更新一次选择了高匿+https+post每天更新一次

可能的其他的爬取IP的方法:(搞个程序打开浏览器截图丢给bing识别保存)

实现思路

1、爬取免费代理ip
2、测试响应时间(按从快到慢排)
3、压力测试(连续爬example网站40次,若能通过,则为高质量ip)
4、post测试(可选)
5、持久化存储

我选取均为可https和可post的代理

压力测试时:使用了线程和互斥锁
可参考:11.网络爬虫—多线程详讲与实战
最佳线程数参考:
计算最佳线程数
python的爬虫请求为CPU密集型,故选择

这里cpu的个数在任务管理器(任务栏上右键打开)上的性能得知:

它有8个核心。这意味着CPU有8个物理核心。物理核心数与逻辑处理器数不同,意味着CPU支持超线程技术,逻辑处理器的数量可能是物理核心数的两倍,此时我的电脑上的逻辑处理器为16,则我可以视作cpus = 16。

代码实现

main.py

from utils import get_free_list, get_proxy_list, get_66_ip, get_kx_ip,get_ihuan_ip,get_zdy_ip,test_connection,test_pressure,test_post
import random
import datetime



def random_proxy():
    func_inland =[get_free_list, get_proxy_list]
    func_outland =[get_66_ip, get_kx_ip, get_ihuan_ip, get_zdy_ip]
    # 从代理池中随机获取一个代理
    D = int(datetime.datetime.now().strftime('%d'))
    if D % 2 == 0:
        ip =get_zdy_ip
    else:
        ip =[]
        pass
    ip_i = random.choice(func_inland)()+ip
    ip_o = random.choice(func_outland)()+ip
    return ip_i+ip_o

def save_proxy(ip):
    #如果没有此文件就创建一个
    print(ip)
    with open('./free_proxy_get/proxy.txt', 'w') as f:
        for i in ip:
            f.write(i+'\n') 
    #在当前文件夹也保存一份(可选,为了方便)
    with open('proxy.txt', 'w') as f:
        for i in ip:
            f.write(i+'\n') 
def open_proxy():
    with open('./free_proxy_get/proxy.txt', 'r') as f:
        #一行一行读取
        ip = [line.strip() for line in f]
    return ip



def main():
    ip = open_proxy() #1.打开已经保存的代理,若少于6个则重新获取
    if len(ip) == 0:
        ip = random_proxy()
    ip = test_connection(ip) #2.测试https
    ip = test_post(ip) #3.测试post(可选)
    ip = test_pressure(ip,40) #4.测试压力 max =40
    save_proxy(ip)#5.保存代理 从快到慢排


if __name__ == '__main__':
    main()

utils.py

demo.py

运用代理池

def open_proxy():
    with open('./free_proxy_get/proxy.txt', 'r') as f:
        #一行一行读取
        ip = [line.strip() for line in f]
    return ip

if __name__ == '__main__':
    ip = open_proxy()
    print(ip)
    pass

结果如下


保存的文件

阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。