从零开始构建自己的爬虫代理IP数据库并定期检验IP有效性
ProxyIPPool
从零开始构建自己的代理IP池;根据代理IP网址抓取新的代理IP;对历史代理IP有效性验证
为什么要使用代理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 IPPool tablename = "proxy_ip_table" #tablename也可以是validation_ip_table IPPool(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 Carwl Crawl().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)
- 当IP池太久没用时,需要对IP有效性进行验证,不符合要求的IP需要删除
from GetProxyIP import Carwl Crawl().proxy_ip_validation()
问题&改进
- 从代理IP网站抓取代理IP本质上也是爬虫,代理IP网站也设置了反爬机制,大概在xici获取4000个代理IP左右就会被封IP,从而需要使用代理来获取代理IP。
- 和网上的经验不同,xici网前100页的代理IP可用率还是比较高的,基本上有九成。但是可能会有"检验有效的代理IP不一定能用"和"第一次检验失效的代理IP可能以后能用"的问题,这也是我将代理IP和有效的代理IP分别存储在两张表的原因。
- 使用代理IP时,构建成http和https可能会导致截然不同的结果,同样,将目标url写成http或https可能会导致程序正常运行和报错两种结果。暂时我还不清楚原因。
- 由于程序使用了网络,并且循环次数较多。因此我多次使用了continue跳出循环,但是获取有效的代理IP还是成功率比较高的。
- 获取10000个代理IP的速度基本上需要五个小时,实在太慢了,后续如果改进程序的话可能会尝试多线程。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一入爬虫深似海,总结python爬虫学习笔记!
正文 〇. python 基础 先放上python 3 的官方文档:https://docs.python.org/3/ (看文档是个好习惯) 关于python 3 基础语法方面的东西,网上有很多,大家可以自行查找. 一. 最简单的爬取程序 爬取百度首页源代码: 来看上面的代码: 对于python 3来说,urllib是一个非常重要的一个模块 ,可以非常方便的模拟浏览器访问互联网,对于python 3 爬虫来说, urllib更是一个必不可少的模块,它可以帮助我们方便地处理URL. urllib.request是urllib的一个子模块,可以打开和处理一些复杂的网址 The urllib.requestmodule defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more. urllib.request.urlopen()方法实现了...
- 下一篇
CentOS7系统手动部署LNMP 环境操作演示
本文档介绍如何手动在ECS实例上搭建LNMP环境(CentOS 7),其中LNMP分别代表Linux、Nginx、MySQL和PHP。 项目配置 本篇教程在示例步骤中使用了以下版本的软件。操作时,请您以实际软件版本为准。 操作系统:CentOS 7.2 64位 Nginx版本:Nginx 1.10.2 MySQL版本:MySQL 5.6.24 PHP版本:PHP 5.6.38 适用对象 适用于熟悉Linux操作系统,刚开始使用阿里云进行建站的个人用户。 基本流程 使用云服务器ECS搭建LNMP平台的操作步骤如下: 准备编译环境。 安装Nginx。 安装MySQL。 安装PHP-FPM。 测试访问。 步骤一:准备编译环境。 本文主要说明手动安装LNMP平台的操作步骤,您也可以在云市场购买LNMP镜像直接启动ECS,以便快速建站。 使用向导创建实例。 说明本篇教程创建的ECS实例选用了CentOS 7.2 64位的操作系统,专有网络和公网IP。 使用管理终端连接ECS实例。 输入命令cat /etc/redhat-release查看系统版本。 关闭防火墙。 输入systemctl stat...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果