大家好,我是欧K。
如果你写过爬虫或者了解过爬虫,你一定深有体会,为什么爬着爬着就趴了…在目前这个大数据时代,许多网站尤其是数据网站采取了各种各样的措施来反爬虫,越是数据价值高的网站反爬做的越复杂,那么究竟怎样才能越过种种屏障,获取我们想要的数据呢,本期将教大家如何爬取大量免费高匿代理IP。
一、准备工作
常见网站反爬方式主要有以下几种:
- 请求头
- IP限制
- 验证码
- 动态加载
- 数据加密
其实请求头、验证码、动态加载以及数据加密反扒都是在你可以访问网站或者服务器之后的反爬措施,这些都可以使用一些解析方法来破解。
那么试想一下,如果网站直接限制了你的IP,导致根本无法获取想要的数据,即使会N种数据破解方式又有何用呢?所以你懂得。。。
什么是代理IP
代理IP按匿名度可分为三种:
- 透明代理:使用透明代理去访问目标服务器,对方服务器会知道你正在使用代理,并且能识别你本地真实ip地址。
- 匿名代理:使用匿名代理去访问目标服务器,对方服务器会知道你正在使用代理,但是无法识别你的真实IP。
- 高匿名代理:使用高匿名代理目标服务器不仅无法识别你的真实ip,还无法识别你使用了代理。
高匿名代理可以很好的隐藏本地ip,使用伪装的ip去访问目标网站。
二、网页分析
以西拉代理为例:http://www.xiladaili.com/http/
我们可以看到一共有2000页的免费代理IP,足够使用了!不过需要注意代理IP是有存活时间的,从几分钟到几天几个月不等,自行根据需要过滤即可。
这里我们爬取前50页的数据就可以了,当然爬100页,2000页都是可以的。
简单分析一下网页,F12检查网页源码:
所有IP信息都在tbody标签中,每一行为一个tr标签。
三、代理IP处理
3.1 配置环境(包)
'''
爬取国内高匿代理IP
author: Python当打之年
'''
import random
import time
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
如未安装模块,请使用pip instatll 安装即可
3.2 获取高匿IP信息
def get_ipinfo(url, headers):
ipinfo = []
# 爬取前50页代理
for i in range(1, 50):
try:
url0 = url.format(i)
# 随机延时,避免请求频率过快导致网络瘫痪
time.sleep(random.uniform(3.1, 4.2))
# 发送网页请求
html = requests.get(url0, headers=headers, timeout=10)
soup = BeautifulSoup(html.text, 'lxml')
# 分析IP列表
tr_list = soup.select_one('.fl-table').select_one('tbody').select('tr')
# 遍历每一行,获取IP
for td_list in tr_list:
# 过滤,仅获取高匿、有效期超过1天的IP
if '高匿' in td_list.select('td')[2].text and '天' in td_list.select('td')[5].text:
ipport = td_list.select('td')[0].text
ipinfo.append(ipport)
except:
continue
# 返回满足要求IP
return ipinfo
3.3 验证IP是否有效
既然IP有实效,那么爬取到的IP就可能是失效的IP或者是包装过的IP,这些IP并不能使用,接下来我们需要先检测一下IP是否能正常使用,然后仅保留有效IP,构建IP代理池。
以下几个网站,可以很方便的检验IP是否有效:
- icanhazip.com/ 返回IP地址
- ip.chinaz.com/ 可以查询IP地址和位置信息
- www.ip.cn/ 可以查询IP地址和位置信息
这里使用站长工具(ip.chinaz.com)检测
def check_ip(ippost_info, headers):
# http://icanhazip.com IP测试网址
check_url = 'http://icanhazip.com'
proxies = {'http': 'http://' + ippost_info, 'https': 'https://' + ippost_info}
try:
time.sleep(1)
# 发送测试请求
r = requests.get(check_url, headers=headers, proxies=proxies, timeout=10)
if r.status_code == 200:
print('有效IP:' + ippost_info)
with open('xila_https_list.txt', 'a') as f:
f.write(ippost_info)
f.write('\n')
else:
print('无效IP:' + ippost_info)
except:
print('无效IP:' + ippost_info)
至此,前50页有效IP我们就全部拿到了,作为演示,我把有效IP保存在了xila_https_list.txt文件中,大家也可以存储到MongoDB或者MySQL数据库中。
写在最后
小爬怡情,大爬伤身,强爬。。。(自行脑补)
以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享让更多人知道哦
往期推荐
爬虫 | Python送你王者荣耀官网全套皮肤
基础 | Python函数一文详解
可视化 | Python制作最炫3D可视化地图
可视化 | 动起来的中国大学排名,看看你的母校在哪里
技巧 | Python 字典用法详解(超全)
技巧 | 20个Pycharm最实用最高效的快捷键(动态展示)
技巧 | 5000字超全解析Python三种格式化输出方式【% / format / f-string】
微信公众号 “Python当打之年” ,每天都有python编程技巧推送,希望大家可以喜欢