这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
很多爬虫大佬都会建立自己的,IP 代理池,你想知道 IP 代理池是如何创建的吗?
如果你恰巧有此需求,欢迎阅读本文。
本案例为爬虫 120 例专栏中的一例,顾使用 requests
+ lxml
进行实现。
从 89IP 网开始
代理 IP 目标网站之一为:www.89ip.cn/index_1.htm…,首先编写随机返回 User-Agent
的函数,也可以将该函数的返回值设置为请求头,即 headers
参数。
1 | python复制代码def get_headers(): |
上述代码中的 uas
变量,使用的是各大搜索引擎的 UA,后续案例将会继续扩展该列表字段,争取成为单独的模块。
列表随机选择一个值,使用 random.choice
,请提前导入 random
模块。
编写 requests 请求函数
提取公用的请求函数,便于后续扩展为多个代理站点采集数据。
1 | python复制代码def get_html(url): |
上述代码首先调用 get_headers
函数,获取请求头,之后通过 requests
发起基本请求。
编写 89IP 网解析代码
下面的步骤分为两步,首先编写针对 89IP 网的提取代码,然后再对其进行公共函数提取。
提取部分代码如下
1 | python复制代码def ip89(): |
上述代码首先获取网页响应,之后通过 lxml
进行序列化操作,即 etree.HTML(text)
,然后通过 xpath
语法进行数据提取,最后拼接成一个包含字典项的列表,进行返回。
其中解析部分可以进行提取,所以上述代码可以分割为两个部分。
1 | python复制代码# 代理IP网站源码获取部分 |
测试代码,得到如下结果。
扩展其它代理 IP 地址
在 89IP 代理网代码编写完毕之后,就可以进行其它站点的扩展实现了,各站点扩展如下:
1 | python复制代码def ip66(): |
可以看到,进行公共方法提取之后,各个站点之间的代码都十分相似,上述内容都是只提取了一页数据,扩展到其它页面,在后文实现,在这之前,需要先处理一个特殊的站点:www.nimadaili.com/putong/1/。
该代理站点与上述站点存在差异,即 IP 与端口在一个 td
单元格中,如下图所示:
需要针对该网站提供一个特殊的解析函数,如下所示,在代码中通过字符串分割进行 IP 与端口号的提取。
1 | python复制代码def ip_nima(): |
获取到的 IP 进行验证
获取到的 IP 进行可用性验证,并将可用 IP 存储到文件中。
检测方式有两种,代码分别如下:
1 | python复制代码import telnetlib |
第一种是通过 telnetlib
模块的 Telnet
方法实现,第二种通过请求固定地址实现。
扩大 IP 检索量
上述所有的 IP 检测都是针对一页数据实现,接下来修改为多页数据。依旧拿 89IP 举例。
在该函数参数中新增加一个 pagesize
变量,然后使用循环实现即可。
1 | python复制代码def ip89(pagesize): |
此时代码运行得到如下结果:
上述代码,当 IP 可用时,已经对 IP 进行了存储。
1 | python复制代码with open('ipporxy.txt','a') as f: |
评论时间
代码下载地址:codechina.csdn.net/hihell/pyth…,可否给个 Star。
==来都来了,不发个评论,点个赞吗?==
本文转载自: 掘金