• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python搭建自己[IP代理池]

武飞扬头像
算力鬼才信
帮助1

IP代理是什么:

ip就是访问网页数据服务器位置信息,每一个主机或者网络都有一个自己IP信息

为什么要使用代理ip:

因为在向互联网发送请求中,网页端会识别客户端是真实用户还是爬虫程序,在今天以互联网为主导的世界中,数据一种资源,谁能得到更多有效的数据,谁就能在今天互联网世界斗争中获得先机,所以网页是不愿意把数据作为开源分享给其他互联网运营公司的,它会创造出许许多多的反制措施来避免自己的数据被其他竞争对手(或利益相关的其他服务商),但又不得不为了创造更高的经济价值,来以非常有限的隧道中让正常真实用户访问它的网页,所以IP作为访问者的唯一标识,自然而然成为互联网公司鉴别真实非爬虫用户的一种手段。

如果你设置的程序访问时间过快(行为异常)超过了正常人访问的时间(行为),被访问的网页就会判定你是一个爬虫程序,对你的IP进行封禁(一般为5-15分钟,不会超过12小时)。

所以作为爬虫工作者为了获取互联网中的数据,通过以更换ip的方式来再一次访问该网页。

因此由于市场需求,网络上出现许多以”为爬虫工作者提供ip地址“的互联网公司。

这类互联网公司为爬虫职业学习者,提供了一些免费IP信息以供学习,在真实项目获取免费IP信息的方式是不被建议的,作者期望你能通过付费的方式来获取更多高质量的IP资源。

作者作为python爬虫初学者赖给大家讲述一下,如何搭建自己IP代理池,IP代理池听名闻义,其实就是装载了许许多多的高质量IP资源,以供学习者和工作人员及时的更换IP避免对项目产生不可挽回的损失。

作为爬虫学习者,我们应该较其他行业人员应具有爬虫技术,通过爬虫来获取更多IP数据。

对IP代理提供商发起访问请求:(本次IP资源的提供商为:”云代理“)

  1.  
    import time
  2.  
    import requests
  3.  
    import parsel
  4.  
    #新建一个列表用来存储完整ip数据
  5.  
    proxies_list = []
  6.  
    for page in range(1,8):
  7.  
    print(f"===========正在爬取第{page}====================")
  8.  
    time.sleep(1)
  9.  
    url = 'http://www.ip3366.net/free/?stype=1&page={page_turn}'.format(page_turn=page) #服务器获取数据
  10.  
    #浏览器的身份标识
  11.  
    headers = {
  12.  
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
  13.  
    }
  14.  
    response = requests.get(url=url,headers=headers)
  15.  
    #指定一个编码 = 获取一个编码
  16.  
    response.encoding = response.apparent_encoding
  17.  
    html_data = response.text
学新通

将web服务器返回页面数据进行解析:本次采用xpath解析

  1.  
    #3.数据解析 使用xpath 方法,xpath专门用于解析html页面
  2.  
    selector = parsel.Selector(html_data) #转换数据类型
  3.  
    # print(selector)
  4.  
    trs = selector.xpath('//table/tbody/tr')
  5.  
    # print(trs)
  6.  
    #将拼接好的完整地址保存在一个名为proxies_list的列表中
  7.  
    #遍历每一个tr标签
  8.  
    for tr in trs:
  9.  
    ip = tr.xpath('./td[1]/text()').get()
  10.  
    adr = tr.xpath('./td[2]/text()').get()
  11.  
    # print(ip,adr)

将获取的数据拼接起来:因为完整ip地址需要加上 http:// 或者 https://

  1.  
    proxies_dict = {
  2.  
    #字符串的拼接
  3.  
    "http":"http://" ip ":" adr,
  4.  
    "https":"https://" ip ":" adr,
  5.  
    }

将获取的完整的IP信息存储起来

proxies_list.append(proxies_dict)

第二大部分:将获取到IP数据检测一下是否可用,避免在爬虫项目中项目浪费太多的时间,来检测ip的可用性。

免费IP几乎百分之九十不可用,所以作为爬虫工作者建议你购买付费数据

定义一个函数用来检测数据是否可用:

  1.  
    def check_ip(proxies_list):
  2.  
    """ 代理检测"""
  3.  
    #将高质量可用代理存储起来
  4.  
    can_user= []
  5.  
    for proxie in proxies_list:
  6.  
    #发送一个请求以便得到该代理的状态码
  7.  
    try:
  8.  
    response = proxie.get(url='https://www.百度.com',proxies=proxie,timeout=2)
  9.  
    if response.status_code == 200: #如果该IP访问百度后,返回的状态码为200时,说明该地阿里可以使用
  10.  
    #将该代理保存起来
  11.  
    can_user.append(proxie)
  12.  
    except:
  13.  
    print('当前代理:',proxie,'请求时间过长不可用')
  14.  
    #如果代理可用则执行else中的语句
  15.  
    else:
  16.  
    print('当前代理:', proxie, '可以使用')
  17.  
    return can_user
学新通

这里我要说的重点是:

response.status_code == 200

通过向特定的网页发起get请求,以返回状态码来检测该IP数据是否正常可用,如果在有限的时间中它返回的状态码为200说明该IP数据是正常可用的。

通过方法的调用来让该检测代码段运行起来:

  1.  
    can_user = check_ip(proxies_list)
  2.  
    print('可以使用的代理:',can_user)
  3.  
    print('可以使用的代理数量为:',len(can_user))

这里我要说的是:通过check_ip()方法调用并且向该方法传递一个参数”proxies_list“,该参数是我们定义的用来存储在ip提供商那里爬取全部IP数据,通过调用该方法,并且将未进行识别的ip数据传入。让检测程序代码段运行起来,获取可供使用IP数据

文章的最后,我要说的是,希望大家能感激每一位资源的提供者,只有消费才会产生价值,带动市场,我们应该尊重劳动者的辛苦劳作。

完整代码段:

  1.  
    #建立步骤:
  2.  
    '''
  3.  
    爬取提供免费代理的网站数据(ip地址 端口号,地址信息)
  4.  
    1.寻找数据地址
  5.  
    2.发送请求
  6.  
    3.需要的数据(页面解析保存下来),或者不需要的数据(剔除)
  7.  
    4.需要的数据保存(IP地址,端口,拼接https://)
  8.  
     
  9.  
    '''
  10.  
    import time
  11.  
    import requests
  12.  
    # 安装parsel时报错,经过排查应该是镜像源的问题(网络上说是尽量使用国内镜像源,国外网速不行,我使用的就是阿里云的镜像)应该是阿里云的镜像不行,我换了一个豆瓣的镜像源
  13.  
    #具体使用办法在安装包的后面添加上,通过那个镜像源:pip install parsel -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 把”库包名“换成你要安装的包的名称即可;
  14.  
    import parsel
  15.  
    #使用代理:
  16.  
    #定义一个函数:
  17.  
    def check_ip(proxies_list):
  18.  
    """ 代理检测"""
  19.  
    #将高质量可用代理存储起来
  20.  
    can_user= []
  21.  
    for proxie in proxies_list:
  22.  
    #发送一个请求以便得到该代理的状态码
  23.  
    try:
  24.  
    response = proxie.get(url='https://www.百度.com',proxies=proxie,timeout=2)
  25.  
    if response.status_code == 200: #如果该IP访问百度后,返回的状态码为200时,说明该地阿里可以使用
  26.  
    #将该代理保存起来
  27.  
    can_user.append(proxie)
  28.  
    except:
  29.  
    print('当前代理:',proxie,'请求时间过长不可用')
  30.  
    #如果代理可用则执行else中的语句
  31.  
    else:
  32.  
    print('当前代理:', proxie, '可以使用')
  33.  
    return can_user
  34.  
     
  35.  
    #1.寻找数据的地址
  36.  
    proxies_list = []
  37.  
    for page in range(1,8):
  38.  
    print(f"===========正在爬取第{page}====================")
  39.  
    time.sleep(1)
  40.  
    url = 'http://www.ip3366.net/free/?stype=1&page={page_turn}'.format(page_turn=page) #服务器获取数据
  41.  
    #浏览器的身份标识
  42.  
    headers = {
  43.  
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
  44.  
    }
  45.  
    response = requests.get(url=url,headers=headers)
  46.  
    #指定一个编码 = 获取一个编码
  47.  
    response.encoding = response.apparent_encoding
  48.  
    html_data = response.text
  49.  
    #3.数据解析 使用xpath 方法,xpath专门用于解析html页面
  50.  
    selector = parsel.Selector(html_data) #转换数据类型
  51.  
    # print(selector)
  52.  
    trs = selector.xpath('//table/tbody/tr')
  53.  
    # print(trs)
  54.  
    #将拼接好的完整地址保存在一个名为proxies_list的列表中
  55.  
    #遍历每一个tr标签
  56.  
    for tr in trs:
  57.  
    ip = tr.xpath('./td[1]/text()').get()
  58.  
    adr = tr.xpath('./td[2]/text()').get()
  59.  
    # print(ip,adr)
  60.  
    proxies_dict = {
  61.  
    #字符串的拼接
  62.  
    "http":"http://" ip ":" adr,
  63.  
    "https":"https://" ip ":" adr,
  64.  
    }
  65.  
    proxies_list.append(proxies_dict)
  66.  
    print('获取成功',proxies_dict)
  67.  
     
  68.  
    #break 次break是为了检测第一页数据返回是否正常,其实我获取的所有免费代理
  69.  
    print(proxies_list)
  70.  
    print('获取的代理数据为:',len(proxies_list))
  71.  
    # proxies_list.append(proxies_dict)
  72.  
    print('==========================正在检测代理======================')
  73.  
    can_user = check_ip(proxies_list)
  74.  
    print('可以使用的代理:',can_user)
  75.  
    print('可以使用的代理数量为:',len(can_user))
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhabfcj
系列文章
更多 icon
同类精品
更多 icon
继续加载