import time
import json
import datetime
import threading
import requests
from lxml import etree
from queue import Queue # 爬取免费代理IP 来源xicidaili.com
# 多线程验证代理ip是否可用
class ProxyTest:
def __init__(self):
self.test_url = "http://pv.sohu.com/cityjson?ie=utf-8"
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",}
self.request_queue = Queue() def parse_url(self, url, proxies, timeout=3):
return requests.get(url, headers=self.headers, proxies=proxies, timeout=timeout).content.decode() # 请求
def request(self):
while True:
# 获取ip地址
ip = self.request_queue.get() # 发起请求
try:
starttime = datetime.datetime.now()
html_str = self.parse_url(self.test_url, proxies={"http": ip}, timeout=5)
endtime = datetime.datetime.now()
use_time = endtime - starttime
except Exception as e:
# 请求超时
print("timeout %s" % ip)
self.request_queue.task_done()
continue # 检查返回html
try:
json_dict = json.loads(html_str[19:-1])
except:
print("fail %s, use time %d" % (ip, use_time.seconds))
self.request_queue.task_done()
continue if ip.startswith("http://"+json_dict["cip"]):
# 代理可用
print("success %s, use time %d, %s" % (ip, use_time.seconds, html_str))
self.request_queue.task_done()
# 保存到文件
with open("proxy_ok_ip.json", "a", encoding="utf-8") as f:
f.write(ip)
f.write("\n")
else:
# ip不是高匿代理
print("%s invalid, use time %d" % (ip, use_time.seconds))
self.request_queue.task_done() def run(self):
# 读取ip地址文件 并存储到队列中
with open("proxy.json", "r", encoding="utf-8") as f:
for line in f:
self.request_queue.put(line.strip()) # 遍历,发送请求,获取响应
for i in range(30):
# daemon=True 把子线程设置为守护线程,该线程不重要主线程结束,子线程结束
threading.Thread(target=self.request, daemon=True).start() self.request_queue.join() #让主线程等待阻塞,等待队列的任务完成之后再完成 print("主线程结束") class Proxy:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
} def start_urls_superfastip(self):
return ["http://www.superfastip.com/welcome/freeip/%d" % i for i in range(1,11)] def get_content_list_superfastip(self, html_str):
content_list = []
html = etree.HTML(html_str)
tr_list = html.xpath('/html/body/div[3]/div/div/div[2]/div/table/tbody/tr')
for tr in tr_list:
if tr.xpath('./td[4]/text()')[0].strip() == 'HTTP':
item = {}
item["ip"] = tr.xpath('./td[1]/text()')[0].strip()
item["port"] = tr.xpath('./td[2]/text()')[0].strip()
content_list.append(item) return content_list def start_urls_xici(self):
return ["http://www.xicidaili.com/nn/%d" % i for i in range(1,6)] def get_content_list_xici(self, html_str):
content_list = []
html = etree.HTML(html_str)
tr_list = html.xpath('//table[@id="ip_list"]/tr')[1:]
for tr in tr_list:
item = {}
item["ip"] = tr.xpath('./td[2]/text()')[0].strip()
item["port"] = tr.xpath('./td[3]/text()')[0].strip()
content_list.append(item)
return content_list def start_urls_kuaidaili(self):
return ["https://www.kuaidaili.com/free/inha/%d/" % i for i in range(1, 11)] def get_content_list_kuaidaili(self, html_str):
content_list = []
html = etree.HTML(html_str)
tr_list = html.xpath('//div[@id="list"]/table/tbody/tr')
for tr in tr_list:
item = {}
item["ip"] = tr.xpath('./td[1]/text()')[0].strip()
item["port"] = tr.xpath('./td[2]/text()')[0].strip()
content_list.append(item)
return content_list def start_urls_89ip(self):
return ["http://www.89ip.cn/index_%d.html" % i for i in range(1, 11)] def get_content_list_89ip(self, html_str):
content_list = []
html = etree.HTML(html_str)
tr_list = html.xpath('//div[@class="layui-form"]/table/tbody/tr')
for tr in tr_list:
item = {}
item["ip"] = tr.xpath('./td[1]/text()')[0].strip()
item["port"] = tr.xpath('./td[2]/text()')[0].strip()
content_list.append(item)
return content_list def parse_url(self, url):
return requests.get(url, headers=self.headers).content.decode() def save_content_list(self, content_list):
with open("proxy.json", "a", encoding="utf-8") as f:
for ip in content_list:
f.write("http://%s:%s" % (ip["ip"], ip["port"]))
f.write("\n") def run(self):
# 构造请求地址列表
start_urls_xici = self.start_urls_xici()
start_urls_89ip = self.start_urls_89ip()
start_urls_kuaidaili = self.start_urls_kuaidaili()
start_urls_superfastip = self.start_urls_superfastip() all_content_list = [] # 存放所有爬取到的ip for url in start_urls_superfastip:
html_str = self.parse_url(url) # 获取响应
content_list = self.get_content_list_superfastip(html_str) # 处理响应
all_content_list.extend(content_list) # 将结果加到列表里
time.sleep(0.2) for url in start_urls_xici:
html_str = self.parse_url(url) # 获取响应
content_list = self.get_content_list_xici(html_str) # 处理响应
all_content_list.extend(content_list) # 将结果加到列表里
time.sleep(0.2) for url in start_urls_kuaidaili:
html_str = self.parse_url(url)
content_list = self.get_content_list_kuaidaili(html_str)
all_content_list.extend(content_list)
time.sleep(0.2) for url in start_urls_89ip:
html_str = self.parse_url(url)
content_list = self.get_content_list_89ip(html_str)
all_content_list.extend(content_list)
time.sleep(0.2)
print("抓取完成")
self.save_content_list(all_content_list) if __name__ == '__main__':
# 抓取数据
spider = Proxy()
spider.run() # 检测ip是否可用
proxy = ProxyTest()
proxy.run()
print("最后可以用的代理IP在proxy_ok_ip.json")

自动爬取代理IP例子的更多相关文章

  1. python爬虫爬取代理IP

    # #author:wuhao # #--*------------*-- #-****#爬取代理IP并保存到Excel----#爬取当日的代理IP并保存到Excel,目标网站xicidaili.co ...

  2. python 批量爬取代理ip

    import urllib.request import re import time import random def getResponse(url): req = urllib.request ...

  3. 使用Python爬取代理ip

    本文主要代码用于有代理网站http://www.kuaidaili.com/free/intr中的代理ip爬取,爬虫使用过程中需要输入含有代理ip的网页链接. 测试ip是否可以用 import tel ...

  4. 爬虫爬取代理IP池及代理IP的验证

    最近项目内容需要引入代理IP去爬取内容. 为了项目持续运行,需要不断构造.维护.验证代理IP. 为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP. 一.服务器如何获取客户端IP ...

  5. python代理池的构建3——爬取代理ip

    上篇博客地址:python代理池的构建2--代理ip是否可用的处理和检查 一.基础爬虫模块(Base_spider.py) #-*-coding:utf-8-*- ''' 目标: 实现可以指定不同UR ...

  6. 爬取代理IP

    现在爬虫好难做啊,有些网站直接封IP,本人小白一个,还没钱,只能找免费的代理IP,于是去爬了西刺免费代理,结果技术值太低,程序还没调试好, IP又被封了... IP又被封了... IP又被封了... ...

  7. 爬取代理IP,并判断是否可用。

    # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_all() import urllib2 from gevent.pool ...

  8. Python爬取代理ip

    # -*- coding:utf-8 -*- #author : willowj import urllib import urllib2 from bs4 import BeautifulSoup ...

  9. 原创:Python爬虫实战之爬取代理ip

    编程的快乐只有在运行成功的那一刻才知道QAQ 目标网站:https://www.kuaidaili.com/free/inha/  #若有侵权请联系我 因为上面的代理都是http的所以没写这个判断 代 ...

随机推荐

  1. 从零开始学MySQL(二)

    鉴于上节篇幅以安装为主,因此对于调用mysql所需要使用的“命令”只是略微提及.随之而来就会带给读者诸多不解了,因为你会思考,这串长长的字符到底有什么特殊的含义呢?聪明的你可能早就抱着好奇心去“摆渡” ...

  2. Delphi 保留字

  3. python编码环境安装与基本语法

    一.pycharm的基本使用 1.python以及pycharm的安装 python的版本选择:3.x版本就行 pycharm的版本选择:社区版就够用 pycharm只是一个编写工具,python才是 ...

  4. GNU ARM汇编快速入门

    以前用ARM的IDE工具,使用的是ARM标准的汇编语言.现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处.其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看 ...

  5. springcloud 高可用的服务注册中心

    https://blog.csdn.net/forezp/article/details/81041101 上面是方老师的博客,看liuyan也有好多同学不是很清楚,这里自己也记录一下具体的做法. 1 ...

  6. 一些项目中用到的php函数

    #不为空 if (!empty($_POST)) { } #生成随机数 mt_rand(,)产生999-9999范围间的随机数

  7. HDU-3415-Max Sum of Max-K-sub-sequence(单调队列,带限制的最大子段和)

    链接: https://vjudge.net/problem/HDU-3415 题意: Given a circle sequence A[1],A[2],A[3]......A[n]. Circle ...

  8. 13. ClustrixDB 基于时间点恢复

    在不太可能发生灾难的情况下,可以在特定数据库.表或整个集群上执行ClustrixDB集群的某个时间点恢复.应该非常小心地处理这一问题. 先决条件 在你可以使用时间点恢复之前,你的集群应该有几个先决条件 ...

  9. Mysql 日期函数date_format()

    用法:DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据 1.语法 date_fromat(date,format) 说明:date 参数是合法的日期.format 规定日期/时间的输 ...

  10. Linux培训教程 linux下修改用户权限的方法

    一般我们日常碰到要修改用户权限的,往往是要么修改一下用户的gorupid,通过上面命令可以改;要么是把普通用户改成具有超级权限的用户,这个一般自己不能直接改,只能是root或有root权限的用户才能帮 ...