爬虫(二)建立代理ip池
之前我们说网站反爬虫的一个常用方法是检测ip,限制访问频率。所以我们要通过设置代理ip的办法绕过这个限制。有不少提供免费代理ip的网站,像https://www.xicidaili.com/nt/,我们可以从网站上拿到很多代理ip。但是这些ip并不是每个都能用的,或者说,没几个能用的。
我们可以用beautifulsoup分析网页,然后处理,提取代理ip列表,也可以用正则表达式进行匹配。用正则表达式会快一些。ip_url就是https://www.xicidaili.com/nt/,random_hearder就是一个随机获得请求头的函数。
def download_page(url):
headers = random_header()
data = requests.get(url, headers=headers)
return data def get_proxies(page_num, ip_url):
available_ip = []
for page in range(1,page_num):
print("抓取第%d页代理IP" %page)
url = ip_url + str(page)
r = download_page(url)
r.encoding = 'utf-8'
pattern = re.compile('<td class="country">.*?alt="Cn" />.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>', re.S)
ip_list = re.findall(pattern, r.text)
for ip in ip_list:
if test_ip(ip):
print('%s:%s通过测试,添加进可用代理列表' %(ip[0],ip[1]))
available_ip.append(ip)
time.sleep(10)print('抓取结束')
return available_ip
拿到ip后我们还需要对ip进行检测,确定这个ip可以用。怎么检测呢?我们可以用代理ip访问一个能显示访问ip的网站,然后检查请求结果。
def test_ip(ip,test_url='http://ip.tool.chinaz.com/'):
proxies={'http': ip[0]+':'+ip[1]}
try_ip=ip[0]
try:
r=requests.get(test_url, headers=random_header(), proxies=proxies)
if r.status_code==200:
r.encoding='gbk'
result=re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',r.text)
result=result.group()
print(result)
if result[:9]==try_ip[:9]:print('%S:%s测试通过' % (ip[0],ip[1]))
return True
else:
print('%s:%s 携带代理失败,使用了本地IP' %(ip[0],ip[1]))
return False
else:
print('%s:%s 请求码不是200' %(ip[0],ip[1]))
return False
except Exception as e:
print(e)
print('%s:%s 错误' %(ip[0],ip[1]))
return False
有些教程只是拿到200的http状态码就认为成功了,这是不对的。因为代理ip访问不成功,就会默认使用你自己的ip。用我自己的ip访问当然能成功了。
最后拿到的ip在使用前我们还需要对其进行检测,因为你不知道什么时候它就不可用了。所以平时多储存一些代理ip,免得要用的时候没得用。
这篇文章的代码参考了https://blog.csdn.net/XRRRICK/article/details/78650764,我稍微做了一些修改。
爬虫(二)建立代理ip池的更多相关文章
- python多线程建立代理ip池
之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...
- 构建一个给爬虫使用的代理IP池
做网络爬虫时,一般对代理IP的需求量比较大.因为在爬取网站信息的过程中,很多网站做了反爬虫策略,可能会对每个IP做频次控制.这样我们在爬取网站时就需要很多代理IP. 代理IP的获取,可以从以下几个途径 ...
- 基于后端和爬虫创建的代理ip池
搭建免费的代理ip池 需要解决的问题: 使用什么方式存储ip 文件存储 缺点: 打开文件修改文件操作较麻烦 mysql 缺点: 查询速度较慢 mongodb 缺点: 查询速度较慢. 没有查重功能 re ...
- 爬虫爬取代理IP池及代理IP的验证
最近项目内容需要引入代理IP去爬取内容. 为了项目持续运行,需要不断构造.维护.验证代理IP. 为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP. 一.服务器如何获取客户端IP ...
- 【python3】如何建立爬虫代理ip池
一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...
- 如何建立自己的代理IP池,减少爬虫被封的几率
如何建立自己的代理IP池,减少爬虫被封的几率 在爬虫过程中,难免会遇到各种各样的反爬虫,运气不好,还会被对方网站给封了自己的IP,就访问不了对方的网站,爬虫也就凉凉. 代理参数-proxies 首先我 ...
- 建立爬虫代理IP池
单线程构建爬虫代理IP池 #!/usr/bin/python3.5 # -*- coding:utf-8 -*- import time import tempfile from lxml impor ...
- Python爬虫代理IP池
目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
随机推荐
- 【第五周读书笔记】我是一只IT小小鸟
读了第一个同学的自述,我印象最深的就是一些高分同学,只是机械性地背诵知识点,然后不停刷题,只是为了拿一个高分,然而他们对学科的一些基本概念都没有掌握牢靠.高分,并不代表学的就好.学得好不仅仅要牢靠掌握 ...
- smb中继攻击
一.NTLM hash 和 Net-NTLM hash 1.客户端向服务器发送一个请求,请求中包含明文的登录用户名.服务器会提前保存登录用户名和对应的密码 hash 2.服务器接收到请求后,生成一个 ...
- shell 命令 文件查看ls,复制cp,移动mv,查看文件内容cat more less,查看文件信息 file
1. 查看文件 ls ls -l 查看文件详细信息 ls -a 查看所有文件(包含隐藏文件) ls -lh 带单位显示文件大小 ls -i 查看文件的节点号(相当身份证唯一) 2 ...
- 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作
C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...
- Bootstrap 附加导航(Affix)插件
附加导航(Affix)插件允许指定 <div> 固定在页面的某个位置.一个常见的例子是社交图标.它们将在某个位置开始,但当页面点击某个标记,该 <div> 会锁定在某个位置,不 ...
- CSIC_716_20191118【常用模块的用法 Json、pickle、collections、openpyxl】
序列化模块 序列化:将python或其他语言中的数据类型,转变成字符串类型. python中的八大数据类型回顾:int float str list tuple dict set bool 反序列化: ...
- 6.RDD算子实战
from pyspark import SparkContext,SparkConf import sys if __name__ == '__main__': if len(sys.argv) != ...
- leetcode-第10周双周赛-5079-三个有序数组的交集
题目描述: 自己的提交: class Solution: def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: Li ...
- js 常见功能总会
一.随着页面滚动,元素到达可视区域,显示特殊样式 <!DOCTYPE html> <html lang="en"> <head> <met ...
- 用原生js封装轮播图
原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...