晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用。接下来可能考虑扩展成一个比较大的 golang实现的代理池。

  简易版代码:

 package main

 import (
"os"
"fmt"
log "github.com/Sirupsen/logrus"
"io/ioutil"
"strings"
) type New struct {
Prefix string
NewId string
Title string
Time string
Content string
Subject string
} type Subject struct {
Name string
Url string
} func CreateDir(PathName string) error {
err := os.Mkdir(PathName, 0777)
if err != nil && !os.IsExist(err) {
return err
}
return nil
} func AppendFile(SavePath string, FileName string, buf string) {
out, err := os.OpenFile(SavePath+FileName, os.O_WRONLY, 0644)
defer out.Close()
if err != nil {
log.Errorln(err.Error())
return
}
offset, err := out.Seek(0, os.SEEK_END)
if err != nil {
log.Errorln(err.Error())
return
}
_, err = out.WriteAt([]byte(buf), offset)
if err != nil {
log.Errorln(err.Error())
return
}
log.Warnln("Save file finished. Locate in ", SavePath + FileName)
} func PathExists(path string) bool {
_, err := os.Stat(path)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return false
} func SaveFile(SavePath string, FileName string, buf string) {
out, err := os.Create(SavePath + FileName)
defer out.Close()
fmt.Fprintf(out, "%s", buf)
if err != nil {
log.Errorln(err.Error())
return
}
log.Warnln("Save file finished. Locate in ", SavePath + FileName)
} func ReadAll(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
return ioutil.ReadAll(f)
} func ReadFile(path string) []string {
var fp interface{}
fp, err := ReadAll(path)
if err != nil {
log.Errorln(err.Error())
return nil
}
fp = string(fp.([]byte))
return strings.Split(fp.(string), "\n")
}
 package main

 import (
log "github.com/Sirupsen/logrus"
"math/rand"
"net/http"
"net/url"
"time"
) var userAgent = [...]string {
"Mozilla/5.0 (compatible, MSIE 10.0, Windows NT, DigExt)",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, 360SE)",
"Mozilla/4.0 (compatible, MSIE 8.0, Windows NT 6.0, Trident/4.0)",
"Mozilla/5.0 (compatible, MSIE 9.0, Windows NT 6.1, Trident/5.0,",
"Opera/9.80 (Windows NT 6.1, U, en) Presto/2.8.131 Version/11.11",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, TencentTraveler 4.0)",
"Mozilla/5.0 (Windows, U, Windows NT 6.1, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Macintosh, Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh, U, Intel Mac OS X 10_6_8, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Linux, U, Android 3.0, en-us, Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (iPad, U, CPU OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, Trident/4.0, SE 2.X MetaSr 1.0, SE 2.X MetaSr 1.0, .NET CLR 2.0.50727, SE 2.X MetaSr 1.0)",
"Mozilla/5.0 (iPhone, U, CPU iPhone OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"MQQBrowser/26 Mozilla/5.0 (Linux, U, Android 2.3.7, zh-cn, MB200 Build/GRJ22, CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
} func GetRandomUserAgent() string {
var r = rand.New(rand.NewSource(time.Now().UnixNano()))
return userAgent[r.Intn(len(userAgent))]
} func GetFakeHeader(request *http.Request) {
request.Header.Set("User-Agent", GetRandomUserAgent())
request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
request.Header.Set("Connection", "keep-alive")
//request.Header.Set("Accept-Encoding", "gzip, deflate")
} func GetByProxy(proxyAddr string, Url string) (*http.Response, error) {
timeout := time.Duration(10 * time.Second)
request, err := http.NewRequest(http.MethodGet, Url, nil)
GetFakeHeader(request)
if err != nil {
return nil, err
}
proxy, err := url.Parse(proxyAddr)
if err != nil {
log.Errorln(err.Error())
}
client := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
},
Timeout: timeout,
}
return client.Do(request)
} func GetByDirectory(Url string) (*http.Response, error) {
timeout := time.Duration(10 * time.Second)
request, err := http.NewRequest(http.MethodGet, Url, nil)
GetFakeHeader(request)
if err != nil {
return nil, err
}
client := http.Client{
Timeout: timeout,
}
return client.Do(request)
}
 package main

 import (
log "github.com/Sirupsen/logrus"
"strconv"
"regexp"
"github.com/opesun/goquery"
"time"
) const (
SAVE_PATH = "kproxy.orz"
PROXY_URL = "http://www.kuaidaili.com/free/inha/"
)
var (
IP_REGEXP = regexp.MustCompile(`[\d]+\.[\d]+\.[\d]+\.[\d]+\n\s+[\d]+`)
IP_DETAIL_REGEXP = regexp.MustCompile(`[\d]+\.[\d]+\.[\d]+\.[\d]+`)
INT_REGEXP = regexp.MustCompile(`\s[\d]+`)
) func UrlGetter(num int) string {
return PROXY_URL + strconv.Itoa(num)
} func GetProxy(Url string) {
nod, err := goquery.ParseUrl(Url)
if err != nil {
log.Errorln(err.Error())
return
}
ret := nod.Text()
ips := IP_REGEXP.FindAll([]byte(ret), -1)
var port []string = make([]string, len(ips))
var str string = ""
for i := 0; i < len(ips); i++ {
port[i] = string(INT_REGEXP.FindAll(ips[i], -1)[0])[1:]
ips[i] = IP_DETAIL_REGEXP.FindAll(ips[i], -1)[0]
str += string(ips[i])+":"+port[i]+"\n"
}
AppendFile("./", SAVE_PATH, str)
} func main() {
log.Infoln("Start getting proxy ...")
SaveFile("./", SAVE_PATH, "")
for i := 1; i <= 500; i++ {
log.Println(UrlGetter(i))
GetProxy(UrlGetter(i))
time.Sleep(time.Second*5)
}
}

这里有个python来测试:

 import urllib
import urllib2
import os
import socket AIM_URL = ''
PROXY_PATH = './kproxy.orz' class MyException(Exception):
pass def read_file(path):
if not os.path.exists(path):
print 'path : \''+ path + '\' not find.'
return []
content = ''
try:
with open(path, 'r') as fp:
content += reduce(lambda x,y:x+y, fp)
finally:
fp.close()
return content.split('\n') socket.setdefaulttimeout(5)
proxies = read_file(PROXY_PATH)
print len(proxies)
for pp in proxies:
try:
print 'http://'+pp
inforMation = urllib.urlopen(AIM_URL, proxies={'http': 'http://'+pp})
except urllib2.URLError, e:
if isinstance(e.reason, socket.timeout):
pass
except:
pass
finally:
pass

[Golang] 一个简易代理池的更多相关文章

  1. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  2. 一个简易内存池(C++)

    做这个内存池主要是为了完成一道面试题,题目在代码中. 代码 #include <iostream> #include<string> #include <list> ...

  3. Python实现的异步代理爬虫及代理池

    使用python asyncio实现了一个异步代理池,根据规则爬取代理网站上的免费代理,在验证其有效后存入redis中,定期扩展代理的数量并检验池中代理的有效性,移除失效的代理.同时用aiohttp实 ...

  4. 使用redis所维护的代理池抓取微信文章

    搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...

  5. python开源IP代理池--IPProxys

    今天博客开始继续更新,谢谢大家对我的关注和支持.这几天一直是在写一个ip代理池的开源项目.通过前几篇的博客,我们可以了解到突破反爬虫机制的一个重要举措就是代理ip.拥有庞大稳定的ip代理,在爬虫工作中 ...

  6. python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会

    我们上次说了伪装头部 ↓ python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部 让自己的 python 爬虫假装是浏览器 小帅b主要是想让你知道 在爬取网站的时候 ...

  7. 【解决方案】IP代理池设计与解决方案

    一.背景 爬虫服务请求量大,为了应对反爬措施,增加爬虫的爬取效率和代理IP使用率,需要设计一个IP代理池,满足以下需求: 定时任务获取第三方代理 及时剔除IP代理池中失效的IP 业务隔离IP 若IP未 ...

  8. 用golang 实现一个代理池

    背景 写爬虫的时候总会遇到爬取速度过快而被封IP的情况,这个时候就需要使用代理了.在https://github.com/henson/ProxyPool 的启发下,决定自己实现一个代理池.项目已经开 ...

  9. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...

随机推荐

  1. Date类型-演示JS中的日期

    <script type="text/javascript"> /* *演示JS中的日期 */ var date = new Date(); document.writ ...

  2. NEC学习 ---- 布局 -三列,右侧自适应

    效果如图 html代码: <div class="g-bd3 f-cb"> <div class="g-sd31"> <p> ...

  3. Tomcat热部署方法(3种)【转】

    热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 1.直接把项目web文件夹放在webapps里. 2.在tomcat ...

  4. Fisher-Yates 乱序算法

    这两篇博客[1][2]的模式是我心仪的一种科技博客的方式,提供源代码,显示运行图形结果,通俗地介绍理论原理. 直接把结论摘录下来吧. 随机算法如果写成如下形式 randomIndex = random ...

  5. 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

    List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...

  6. Error Domain=NSOSStatusErrorDomain Code=1718449215 "The operation couldn’t be completed. (OSStatus error 1718449215.)"

    是在录音时,recoreder的录音格式不对.

  7. LeetCode Best Time to Buy and Sell Stock with Cooldown

    原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题目: Say you hav ...

  8. OC-数组排序-NSSortDescriptor使用

    OC-数组排序-NSSortDescriptor使用 在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArr ...

  9. Performance Analyzer Tool

    PAL工具的使用大同小异,网上看到这篇文章挺不错的,直接翻译过来.如果你在过去有Exchange性能问题,你肯定知道有很多可变因素会影响Exchange整体性能,有时需要很长的时间才能找到问题的根源, ...

  10. 跨域解决方案一:使用CORS实现跨域

    跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...