各大免费IP的网站的反爬手段往往是封掉在一定时间内访问过于频繁的IP,因此在爬取的时候需要设定一定的时间间隔,不过说实话,免费代理很多时候基本都不能用,可能一千个下来只有十几个可以用,而且几分钟之后估计也扑街了。虽然有那种付费的大量代理IP,但是也不见得好,测试过,里面优质的也很少。目前体验比较好的还是私密代理,当然还有其他。贵有贵的道理。

import requests
import time
import random
from fake_useragent import UserAgentfrom requests.exceptions import RequestException
from lxml import etree
import csv class IPSpider(object):
def __init__(self):
self.url = 'https://www.kuaidaili.com/free/inha/'
self.url_test = 'http://www.baidu.com/' # 直接拿百度来测试IP能不能用 def get_headers(self):
"""
随机产生请求头
:return:
"""
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
return headers def get_page(self, url):
"""
获取网页源代码
:param url:
:return:
"""
while True:
try:
headers = self.get_headers()
response = requests.get(url, headers=headers, verify=False)
if response.status_code == 200:
return response.text
print(response.status_code)
raise ValueError("打开网页错误")
except RequestException as err:
print(err) def parse_ip(self, text):
"""
提取页面的IP和端口号
:param text:
:return:
"""
html = etree.HTML(text)
ip = html.xpath("//tr/td[1]/text()")
print(ip)
port = html.xpath("//tr/td[2]/text()")
print(port)
return zip(ip, port) def test_ip(self, ip, port):
"""
测试IP是否可用
:param ip:
:param port:
:return:
"""
try:
# url_ip = 'http://' + ip + ':' + port
# proxies = {
# 'http': url_ip,
# 'https': url_ip
# }
proxies = {
'http': 'http://{}:{}'.format(ip, port),
'https': 'https://{}:{}'.format(ip, port),
}
headers = self.get_headers()
response = requests.get(url=self.url_test, headers=headers, proxies=proxies, timeout=8)
if response.status_code == 200:
print("%s可用" % ip)
return ip, port
return None
except RequestException:
print('%s失效' % ip) def save_ip(self, result):
"""
可用的IP保存
:param result:
:return:
"""
with open("kuaidailiip.csv", "a")as f:
writer = csv.writer(f)
writer.writerows(result) def run(self):
"""
主函数
:return:
"""
for i in range(1, 1001):
url = self.url + str(i) + '/'
text = self.get_page(url)
ip = self.parse_ip(text)
result = []
for j in ip:
ok_ip = self.test_ip(j[0], j[1])
if ok_ip == None:
continue
else:
result.append(ok_ip)
self.save_ip(result)
time.sleep(random.randint(5, 7))
if __name__ == '__main__':
  spider = IPSpider()
  spider.run()

爬取快代理的免费IP并测试的更多相关文章

  1. 爬取软考试题系列之ip自动代理

    马上5月份有个软件专业等级考试,以下简称软考,为了更好的复习备考,我打算抓取www.rkpass.com网上的软考试题. 以上为背景. 很久没有更新博客园的博客了,所以之前的代码没有及时的贴出来,咱们 ...

  2. Python 爬虫练习(一) 爬取国内代理ip

    简单的正则表达式练习,爬取代理 ip. 仅爬取前三页,用正则匹配过滤出 ip 地址和 端口,分别作为key.value 存入 validip 字典. 如果要确定代理 ip 是否真的可用,还需要再对代理 ...

  3. 爬取掌阅app免费电子书数据

    主要介绍如何抓取app数据及抓包工具的使用,能看到这相信你已经有爬虫基础了 编不下去了,主要是我懒,直接开干吧! 一.使用环境和工具 windows + python3 + Jsonpath + Ch ...

  4. Selenium&PhantomJS 完成爬取网络代理

    Selenium模块是一套完整的Web应用程序测试系统,它包含了测试的录制(SeleniumIDE).编写及运行(Selenium Remote Control)和测试的并行处理(Selenimu G ...

  5. python requests库爬取网页小实例:ip地址查询

    ip地址查询的全代码: 智力使用ip183网站进行ip地址归属地的查询,我们在查询的过程是通过构造url进行查询的,将要查询的ip地址以参数的形式添加在ip183url后面即可. #ip地址查询的全代 ...

  6. 某代理网站免费IP地址抓取测试

    源代码在测试中... http://www.AAA.com/nn/|    122.6.107.107|    8888|    山东日照|    高匿|    HTTP|    |    |     ...

  7. 爬取西刺ip代理池

    好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码 先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制, ...

  8. 爬取西刺网的免费IP

    在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...

  9. 使用Selenium&PhantomJS的方式爬取代理

    前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...

随机推荐

  1. Nginx常见配置

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  2. ubuntu下apt-get 命令参数

    转载:https://blog.csdn.net/linuxzhouying/article/details/7192612 ubuntu下apt-get 命令参数 常用的APT命令参数 apt-ca ...

  3. 2、记录代码----Ajax

    $.ajax({ url:'/content-engine/index.php/tracker/confirmSendEmail', async: false, //默认为true,同意异步传输 da ...

  4. C# how to properly make a http web GET request

    C# how to properly make a http web GET request EDIT 23/11/17 Updated to throw out examples using asy ...

  5. jquery 复合事件 toggle()方法的使用

    定义和用法 toggle() 方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件. 语法: $(selector).toggle(function1(),function2 ...

  6. c# 动态编译CodeDomProvider.CompileAssemblyFromSource(CompilerParameters cp,string code)

    1.使用c#动态编译,可参考如下: //生成c#代码 string code = GenerateCode(); CodeDomProvider cdp = CodeDomProvider.Creat ...

  7. kubernetes排错系列:(二)、运行很久的kubernetes集群,创建出来的pod都是pending状态

    1.查看pod信息 # 查看pod 报错信息kubectl get pods发现pod的ip没有 生成,也没有分配到某个node节点 # 查看pod详细时间kubectl describe pods发 ...

  8. 添加额外yun源

    .yum install jq 发没有jq安装包,无法安装 .下载并安装EPEL [root@node2 coredns]# wget http://dl.fedoraproject.org/pub/ ...

  9. Golang 单例模式 singleton pattern

    在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singleton         ...

  10. SQL常见面试题(学生表_课程表_成绩表_教师表)

    表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师 ...