建立爬虫代理IP池
单线程构建爬虫代理IP池
#!/usr/bin/python3.5
# -*- coding:utf-8 -*- import time
import tempfile
from lxml import etree
from urllib import request user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0' def get_content(url): # 获取网页内容
global user_agent
headers = {'User-Agent': user_agent}
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
return res.read().decode('utf-8') def get_info(tmp,content): # 提取网页信息 / ip 端口
ip_list = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[2]/text()')
port_list = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[3]/text()')
for i in range(0,len(ip_list)):
out = u""
out += u"" + ip_list[i]
out += u":" + port_list[i]
tmp.write((out + u"\n").encode('utf-8')) # 所有ip和端口号写入data文件 def verify_ip(ip,port,test_url): # 验证 ip+port 有效性
global user_agent
headers = {'User-Agent': user_agent,'Host': 'www.12306.cn','Referer': 'http://www.12306.cn/'}
proxy = {'http':'http://%s:%s'%(ip,port)}
print(proxy) proxy_handler = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_handler)
request.install_opener(opener) req = request.Request(url=test_url,headers=headers)
time.sleep(1)
try:
res = request.urlopen(req)
time.sleep(2)
content = res.read()
if content:
print('{0}:{1} is ok'.format(ip,port))
with open("proxy_info.txt", "a") as fd: # 可用ip+port保存到proxy_info.txt文件中
fd.write(ip + u":" + port + "\n")
else:
print('{0}:{1} is unavailable'.format(ip,port))
except request.URLError as e:
print(e.reason) def verify_ip2(ip,port,test_url):
import requests
try:
response = requests.get(test_url,proxies={'http':'http://{0}:{1}'.format(ip,port)},timeout=2)
# print(response.status_code)
except Exception as e:
print("{0}:{1} failed".format(ip,port),e)
else:
print("{0}:{1} is ok".format(ip,port))
with open("proxy_info.txt", "a") as fd: # 可用ip+port保存到proxy_info.txt文件中
fd.write(ip + u":" + port + "\n") if __name__ == '__main__':
url = 'http://www.xicidaili.com/nn/'
test_url = "http://httpbin.org/"
url_list = [ url + str(i) for i in range(1,2) ]
tmp = tempfile.TemporaryFile()
for url in url_list:
content = get_content(url)
time.sleep(2)
get_info(tmp,content) tmp.seek(0)
for item in tmp.readlines():
item = item.decode('utf-8')
# verify_ip(item.split(u":")[0],item.split(u":")[1].strip(),test_url)
verify_ip2(item.split(u":")[0],item.split(u":")[1].strip(),test_url)
tmp.close()
使用线程池加快验证代理的速度
concurrent.futures.ThreadPoolExecutor
#!/usr/bin/python3.5
# -*- coding:utf-8 -*- import time
import tempfile
from lxml import etree
from urllib import request
from concurrent.futures import ThreadPoolExecutor user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
ip2port = [] def get_content(url): # 获取网页内容
global user_agent
headers = {'User-Agent': user_agent}
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
return res.read().decode('utf-8') def get_info(tmp, content): # 提取网页信息 / ip 端口
ip_list = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[2]/text()')
port_list = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[3]/text()')
for i in range(0, len(ip_list)):
out = u""
out += u"" + ip_list[i]
out += u":" + port_list[i]
tmp.write((out + u"\n").encode('utf-8')) # 所有ip和端口号写入data文件 def verify_ip(ip, port, url):
ret = { 'code':-1,'ipport':None }
import requests
try:
response = requests.get(url, proxies={'http': 'http://{0}:{1}'.format(ip, port)}, timeout=3)
print('{}:{} --> {}'.format(ip,port,response.status_code))
except Exception as e:
# print("{0}:{1} failed".format(ip, port), e)
pass
else:
# print("{0}:{1} is ok".format(ip, port))
if 200 == response.status_code:
ret['code'] = 0
ret['ipport'] = '{0}:{1}'.format(ip,port)
finally:
return ret def callback(future):
global ip2port
ret = future.result()
if 0 == ret['code']:
ip2port.append(ret['ipport']) if __name__ == '__main__':
url = 'http://www.xicidaili.com/nn/'
verify_url = "http://httpbin.org/"
url_list = [url + str(i) for i in range(1, 2)]
tmp = tempfile.TemporaryFile()
for url in url_list:
content = get_content(url)
time.sleep(2)
get_info(tmp, content) print('原始数据下载完毕,开始构建代理池...') tmp.seek(0)
ipports = [ item.decode('utf-8').strip().split(':') for item in tmp.readlines() ]
tmp.close() pool = ThreadPoolExecutor(20)
for ipport in ipports:
ip,port = ipport
v = pool.submit(verify_ip, ip, port, verify_url)
v.add_done_callback(callback)
pool.shutdown(wait=True) print('代理池构建完毕,共获得可用代理 {} 个'.format(len(ip2port)))
print(ip2port)
multiprocessing.dummy.Pool
import time
import requests
from lxml import etree
from requests.exceptions import RequestException
from multiprocessing.dummy import Pool as ThreadPool available_proxies = [] def get_one_page(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
}
reponse = requests.get(url, headers=headers)
if reponse.status_code == 200:
return reponse.text
return None
except RequestException:
return None def get_one_parse(url):
print('url: {}'.format(url))
ipports = []
html = get_one_page(url)
if html:
html = etree.HTML(html)
ips = html.xpath('.//*[@id="list"]/table/tbody//td[1]/text()')
ports = html.xpath('.//*[@id="list"]/table/tbody//td[2]/text()')
for (ip, port) in zip(ips, ports):
ipports.append('{}:{}'.format(ip, port))
ipports = list(set(ipports))
print('res: {}'.format(ipports))
return ipports
return None def fetch(all_proxies):
url = 'https://www.kuaidaili.com/free/intr/{}/'
for i in range(1, 61):
ret = get_one_parse(url.format(i))
if ret:
all_proxies.extend(ret)
time.sleep(1)
all_proxies = list(set(all_proxies))
print('爬取了前60页,去重后共获得{}个代理'.format(len(all_proxies))) def save():
with open('ip2port.txt', 'a+') as wf:
for item in available_proxies:
wf.write(item + '\n')
print('{}个可用代理保存完毕'.format(len(available_proxies))) def sub_verify(item):
proxy = {'http': 'http://{0}'.format(item)}
try:
response = requests.get("http://httpbin.org/", proxies=proxy, timeout=3)
if response.status_code == 200:
print("{} is ok".format(item))
available_proxies.append(item)
except Exception as e:
print("{} failed".format(item)) def verify(ipports):
print('开始验证可用代理...')
pool = ThreadPool(20)
pool.map(sub_verify, ipports)
print('验证完毕,共获取可用代理 {} 个'.format(len(available_proxies)))
save() if __name__ == "__main__":
all_proxies = []
fetch(all_proxies)
print(all_proxies,len(all_proxies))
ipports = list(map(lambda x: x.strip(), all_proxies))
verify(ipports)
建立爬虫代理IP池的更多相关文章
- 【python3】如何建立爬虫代理ip池
一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...
- Python爬虫代理IP池
目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...
- 维护爬虫代理IP池--采集并验证
任务分析 我们爬的免费代理来自于https://www.kuaidaili.com这个网站.用`requests`将ip地址与端口采集过来,将`IP`与`PORT`组合成`requests`需要的代理 ...
- 利用代理IP池(proxy pool)搭建免费ip代理和api
先看这里!!!---->转载:Python爬虫代理IP池(proxy pool) WIIN10安装中遇到的问题: 一.先安装Microsoft Visual C++ Compiler for P ...
- 如何建立自己的代理IP池,减少爬虫被封的几率
如何建立自己的代理IP池,减少爬虫被封的几率 在爬虫过程中,难免会遇到各种各样的反爬虫,运气不好,还会被对方网站给封了自己的IP,就访问不了对方的网站,爬虫也就凉凉. 代理参数-proxies 首先我 ...
- 构建一个给爬虫使用的代理IP池
做网络爬虫时,一般对代理IP的需求量比较大.因为在爬取网站信息的过程中,很多网站做了反爬虫策略,可能会对每个IP做频次控制.这样我们在爬取网站时就需要很多代理IP. 代理IP的获取,可以从以下几个途径 ...
- python多线程建立代理ip池
之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受.所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多.之所以 ...
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
- 爬虫入门到放弃系列05:从程序模块设计到代理IP池
前言 上篇文章吧啦吧啦讲了一些有的没的,现在还是回到主题写点技术相关的.本篇文章作为基础爬虫知识的最后一篇,将以爬虫程序的模块设计来完结. 在我漫(liang)长(nian)的爬虫开发生涯中,我通常将 ...
随机推荐
- HAOI2016 简要题解
「HAOI2016」食物链 题意 现在给你 \(n\) 个物种和 \(m\) 条能量流动关系,求其中的食物链条数. \(1 \leq n \leq 100000, 0 \leq m \leq 2000 ...
- 用keras实现基本的图像分类任务
数据集介绍 fashion mnist数据集是mnist的进阶版本,有10种对应的结果 训练集有60000个,每一个都是28*28的图像,每一个对应一个标签(0-9)表示 测试集有10000个 代码 ...
- Hdoj 2191.悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 题解
Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品 ...
- 自学Python4.2-装饰器
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 平衡树splay学习笔记#2
讲一下另外的所有操作(指的是普通平衡树中的其他操作) 前一篇的学习笔记连接:[传送门],结尾会带上完整的代码. 操作1,pushup操作 之前学习过线段树,都知道子节点的信息需要更新到父亲节点上. 因 ...
- 一种使用 emwin 绘制图片的方法
@2018-12-10 [小记] 使用官方 <GUIBuilder.exe> 软件里的 Image 控件,注意格式为 .bmp,这种方式是将图片数据直接转为十六进制数据存储至静态区 具体使 ...
- Mysql数据库操作笔记
如果数据库表字段存在,则删除该表 drop table if exists `table_name` 创建数据库表语句 create table `table_name`( `id` ) not n ...
- css图片替换文字
含义: 图像替代,就是像我们在平时将文本添加到文本中,然后通过css隐藏文本在它的位置上显示一个背景图片,这样,搜索引擎仍然可以搜到HTML文本,即使我们禁用css后,文本时仍然是可以显示的. 引用& ...
- 【原创】线段树query模板对比! 新手线段树的一个容易出错的问题!!因为我就糊涂了一整天.......
我们解决问题的最好方法就是拿实例来举例子 我们来看tyvj1038或计蒜客 “管家的忠诚” 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管 ...
- UVA 11149-Power of Matrix(等比矩阵求和)
给定一个矩阵A 要求A + A^2 + A^3 +…. A^k: 对于到n的等比矩阵求和 如果n是偶数: 如果n是奇数: #include<stdio.h> #include<s ...