代理ip池的ip是重复利用的吗_Python爬虫必备:从0到1构建自己的免费爬虫代理IP池...

ee6f0c4c32da164428db1b231e1e07b4.png

为什么要使用代理IP

在爬虫的过程中,很多网站会采取反爬虫技术,其中最经常使用的就是限制一个IP的访问次数。当你本地的IP地址被该网站封禁后,可能就需要换一个代理来爬虫。其中有很多网站提供免费的代理IP(如www.xicidaili.com),我们需要做的就是从代理网站抓取代理IP,测试代理IP的有效性后将合适的代理IP加入数据库表中作为我们爬虫的代理IP池

开发思路

1、通过本地IP抓取第一批启动代理IP

我们从代理IP网站抓取代理IP的过程本身就是爬虫,如果短时间内请求次数过多会被网站禁止访问,因此我们需要利用本地IP去抓取第一批代理IP,然后使用代理IP去抓取新的代理IP。

2、对第一批启动的代理IP验证有效性后存入数据库

我们在数据库IP.db下建了两个表:proxy_ip_table(存储所有抓取的IP,用于查看抓取IP功能是否正常)和validation_ip_table(存储所有通过验证的IP,用于查看IP有效性)

第一步中获取的代理IP经检验后存入validation_ip_table,检验的实现如下:

def ip_validation(self, ip): #判断是否高匿:非高匿的ip仍会出卖你的真实ip anonymity_flag = False if "高匿" in str(ip): anonymity_flag = True IP = str(ip[0]) + ":" + str(ip[1]);IP url = "http://httpbin.org/get" ##测试代理IP功能的网站 proxies = { "https" : "https://" + IP} #为什么要用https而不用http我也不清楚 headers = FakeHeaders().random_headers_for_validation() #判断是否可用 validation_flag = True response = None try: response = requests.get(url = url, headers = headers, proxies = proxies, timeout = 5) except: validation_flag = False if response is None : validation_flag = False  if anonymity_flag and validation_flag: return True else: return False

3、构建待访问的网址列表并循环抓取,每次抓取的ip_list经验证后存入数据库表

我们构建了待访问的网址列表(暂定100个容易跑完):

self.URLs = [ "https://www.xicidaili.com/nn/%d" % (index + 1) for index in range(100)] 

包含的模块

1、RandomHeaders.py

构造随机请求头,用于模拟不同的网络浏览器,调用方式:

from RandomHeaders import FakeHeaders#返回请求xici代理网站的请求头xici_headers = FakeHeaders().random_headers_for_xici

2、DatabaseTable.py

提供数据库的创建表和增删查功能,调用方式:

from DatabaseTable import IPPooltablename = "proxy_ip_table"#tablename也可以是validation_ip_tableIPPool(tablename).create() #创建表IPPool(tablename).select(random_flag = False)# random_flag = True时返回一条随机记录,否则返回全部记录IPPool(table_name).delete(delete_all = True) #删除全部记录

3、GetProxyIP.py

核心代码,有几个函数可以实现不同的功能:

  • 从0开始完成建表、抓取IP和存入数据库的功能
from GetProxyIP import CarwlCrawl().original_run()
  • 当代理IP个数不够的时候,根据url_list列表进行抓取,将合适的IP存入列表
from GetProxyIP import Carwl#其他提供代理IP的网站url_kuaidaili = ["https://www.kuaidaili.com/free/inha/%d" % (index + 1) for index in range(10,20)]Crawl().get_more_run(url_list)
60efdea84c5fe3bfd011631b854fb498.png
  • 当IP池太久没用时,需要对IP有效性进行验证,不符合要求的IP需要删除
from GetProxyIP import CarwlCrawl().proxy_ip_validation()
8e7cedf5ef85512462e7ce834707c6d2.png

部分代码

完整代码请查看我的github主页:https://github.com/TOMO-CAT/ProxyIPPool

1、RandomHeaders.py

提供随机请求头,模仿浏览器访问以应付反爬

# -*- coding: utf-8 -*-"""Created on Tue Jan 29 10:36:28 2019@author: YANG功能:生成随机请求头,模拟不同的浏览器访问"""import randomfrom fake_useragent import UserAgentclass FakeHeaders(object): """ 生成随机请求头 """ def __init__(self): self.__UA = [ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值