爬虫IP老被封,该怎么解决?

爬虫IP老被封,该怎么解决?_第1张图片

被封IP,其实在爬虫工作中还是蛮常见的,毕竟目标网站要保护自己的数据信息安全,而爬虫是需要采集这些公开的信息,其实是攻守两方之间的博弈。

在爬虫作业中,我们还会遇到这些问题:

1、网页不定时更新

2、网站限制IP地址的防爬机制

3、乱码问题

4、数据分析人手不足

排除不可抗力因素134,第2点也是很多爬虫工程师面临的问题,也是自己就能解决的问题。今天就来说说,当我们被封IP了,但是任务得完成,该如何处理:

一、要有大量的IP

建议一定要使用代理IP,免费的质量不好,也容易导致我们业务失败;而且购买的代理IP,节点范围要广,不要局限在某一区域;使用轮训替换代理服务器来访问目标网站。这里我会比较推荐这家,他们的IP池子大,质量也给力,是一手散段的住宅资源,特别是隧道代理,能设置云端定时更换,总体使用下来,采集的成功率高,不会随随便便就被机器监测到,封了IP。

建议购买以后检测一下代理IP是否还在有效期内:

# -*- coding: UTF-8 -*-

"""

此代码为代理IP可用性检测模块,可准确筛选出尚未失效IP

注:

1.此代码只针对TXT数据格式接口。

2.尚未失效IP不一定为爬虫可用IP

3.使用时,请调用check_ip(url),url为TXT数据格式接口地址

"""

import requests

import telnetlib

import re

from concurrent.futures.thread import ThreadPoolExecutor

# 请求接口,匹配出代理IP,多线程检测

def check_ip(url):

real_ip = []

# 检测代理IP是否失效

def telnet_ip(ip, port):

try:

telnetlib.Telnet(ip, port, timeout=1)

real_ip.append(f'{ip}:{port}')

except:

pass

while True:

try:

resp = requests.get(url)

# print(resp.text)

ip_data = re.findall('(\d+\.\d+\.\d+\.\d+):(\d+)', resp.text)

with ThreadPoolExecutor(max_workers=16) as pool:

for ip, port in ip_data:

pool.submit(telnet_ip, ip, port)

return real_ip

except:

pass

二、设置合理的HTTP请求头

大多数网站会检查HTTP标头以确定是机器人还是真实用户正在访问它们。如果目标网站发现HTTP标头可疑或缺少信息,则该请求可能会被禁止,所以我们需要设置合理的请求头。

三、设置cookie

确认加载每个页面时cookie都正确调用且每次发起请求时都发送到网站上。

四、模拟正常用户的访问行为

这点也是除了代理IP质量以外,最重要的一点。利用ADSL+脚本,监测IP是否被封,注意要不断不定时切换ip;同时,对查询的频率进行限制,尽量模拟正常用户的行为:UserAgent经常换一换、访问时间间隔设长一点,访问时间设置为随机、访问时间间隔设长一点,访问时间设置为随机……不要嫌麻烦,太过于机器,真的非常非常容易被监测到异常。好比歹徒带刀冲进派出所,自投罗网啊。

综上,建议爬虫作业还是买隧道代理叭,省心省力,效率还高。不过购买前记得测试一下。

你可能感兴趣的:(爬虫,tcp/ip,python)