在使用python进行爬虫时,经常会遇到被网站反爬ip被封的情况,这时候需要用到ip池来通过不断地更换ip,以防被网站反爬措施制裁。
**
1. 代理ip介绍
**
代理ip网站有很多大家自行查询,这里写会被当做广告,新用户注册有10000个ip额度,不过期限只有一天,我用的是比较笨的方法,所以没有用完,之后再研究一下,老用户每天可以再领20个,当天失效。此外在github上也有关于代理ip的详细项目及介绍如proxy,供大家学习使用。这里简单说一下我使用代理ip的过程:
首先是注册实名认证签合约书等等环节,这是必不可少的,每一个代理ip网站都需要。接下来是进入提取ip的过程:
根据你要爬的网站使用的协议,是http还是https类型,选择你要提取对应的ip和端口号,稳定使用时长有三个选择,ip是有使用时效的,我用的5-25分钟的,使用寿命平均在15分钟左右吧,25min-3h的稳定个20多分钟还是没问题的,但是时间长了也容易被封ip需要再换新的,3-6h的我没用过,因为提取不出来,说没那么多让我提取…
它的提取数量个人随意,我感觉使用5-25min的,每次提取60个或者70个就行,虽然说提取是不花钱的,只有使用了才花钱,而且在ip有效期内你可以多次使用,那么提取多了,每个ip用了1次,也都过期了,不划算。
其他的设置没有特殊情况默认就行,点击生成API链接,会看到底下生成了三个链接:
**
2、代理ip使用
**
上边点击生成API链接会生成3个链接,这里我选用了中间的独享ip,看介绍我觉得应该比较稳定吧,点击打开链接,这里我提取了20个,会跳转网页看到下图:
直接CTRL+ACVS一通操作弄到自己保存ip的文本文档,我这里弄到了“ip port.txt”中,开始测试,测试代码放在了本文最后,冒号前是ip,后是端口号,组成新的访问ip,random方法随便从ip文档中选一个。
可以看到我的测试结果中,网站可以正常响应,状态码“200”,网页结果也可以正常打印出来。
至此,说明ip池测试成功了,接下来就是尽快使用了。放到爬虫代码中,只需加入如下代码部分并且在response中加入proxies:response = requests.get(url, headers= header, proxies=get_random_proxy())
,其他的不用动,就可以正常使用了:
proxies = {}
def get_random_proxy():
with open("ip port.txt", "r") as f:
lines = f.readlines()
ip_port = random.choice(lines)
proxyHost, proxyPort = ip_port.split(":")
proxyMeta = "https://%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
}
proxies["https"] = proxyMeta
return proxies
爬取结果如下,大部分是可以正常爬取的,像红框圈出来的部分,可能就是ip失效了,其他爬不出来的要么是关键词在对应百科中没有找到,要么就是有义项,要么就是ip被封了,反正爬个十多分钟左右,看着经常报错,那么就可以停止爬取了,更换一批新ip,上一批老ip也物尽所用了。
**
3、完整测试代码
**
附完整测试代码:
import random
import requests
proxies = {}
targetUrl = "随便一个网址测验连接状态"
def get_random_proxy():
with open("ip port.txt", "r") as f:
lines = f.readlines()
ip_port = random.choice(lines)
proxyHost, proxyPort = ip_port.split(":")
proxyMeta = "https://%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
}
proxies["https"] = proxyMeta
return proxies
# 发送请求
resp = requests.get(targetUrl, proxies=get_random_proxy())
print(resp.status_code)
print(resp.text)