Golang實戰【IP池-自動切換IP爬蟲】
繼上次爬boss直聘資料IP被封,雖然後面發現boss直聘 只要稍微沒個請求停一秒鐘就可以一直爬下去,但是任然心有不甘。欺負我ip少???
於是這兩天抽空寫了個IP池加上可以自動切換IP 千千萬萬個IP 讓你封···········哈哈
我這邊用的是西刺的代理 還是比較穩的········拿著西刺的免費IP 爬著西刺的免費IP [:P]
實現效果如下
········································································································································
感興趣的同學可以玩玩:不過需要redis可以先安裝一個
package main
import (
"github.com/PuerkitoBio/goquery"
"log"
"fmt"
"github.com/garyburd/redigo/redis"
"net/url"
"net/http"
"encoding/json"
"os"
"strconv"
"math/rand"
"time"
"strings"
)
const(
PAGE int = 40
)
var (
xici string = "http://www.xicidaili.com/wn/"
)
func main() {
//getIp("local")
getIp("http://171.104.132.87:9999")
}
func getIp(ip string){
var count int
for i := 1; i <= PAGE; i++ {
response := getRep(xici + strconv.Itoa(i),ip)
if (response.StatusCode == 200) {
dom, err := goquery.NewDocumentFromResponse (response)
if err != nil {
log.Fatalf("失敗原因", response.StatusCode)
}
dom.Find("#ip_list tbody tr").Each(func(i int, context *goquery.Selection) {
ipInfo := make(map[string][]string)
//地址
ip := context.Find("td").Eq(1).Text()
//埠
port := context.Find("td").Eq(2).Text()
//地址
address := context.Find("td").Eq(3).Find("a").Text()
//匿名
anonymous := context.Find("td").Eq(4).Text()
//協議
protocol := context.Find("td").Eq(5).Text()
//存活時間
survivalTime := context.Find("td").Eq(8).Text()
//驗證時間
checkTime := context.Find("td").Eq(9).Text()
ipInfo[ip] = append(ipInfo[ip], ip, port, address, anonymous, protocol, survivalTime, checkTime)
fmt.Println(ipInfo)
hBody, _ := json.Marshal(ipInfo[ip])
//存入redis
saveRedis(ip+":"+port,string(hBody))
fmt.Println(ipInfo)
count++
})
}
}
}
/**
* 返回response
*/
func getRep(urls string,ip string) *http.Response {
request, _ := http.NewRequest("GET", urls, nil)
//隨機返回User-Agent 資訊
request.Header.Set("User-Agent", getAgent())
request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
request.Header.Set("Connection", "keep-alive")
proxy, err := url.Parse(ip)
//設定超時時間
timeout := time.Duration(20* time.Second)
fmt.Printf("使用代理:%s\n",proxy)
client := &http.Client{}
if ip != "local"{
client = &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
},
Timeout: timeout,
}
}
response, err := client.Do(request)
if err != nil || response.StatusCode != 200{
fmt.Printf("line-99:遇到了錯誤-並切換ip %s\n",err)
getIp(returnIp())
}
return response
}
/**
* 隨機返回一個User-Agent
*/
func getAgent() string {
agent := [...]string{
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
"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; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
"User-Agent,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",
"User-Agent, Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
"User-Agent,Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
len := len(agent)
return agent[r.Intn(len)]
}
func saveRedis(ip string,hBody string){
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
//鍵值對的方式存入hash
_, err = c.Do("HSET", "ippool", ip, string(hBody))
//將ip:port 存入set 方便返回隨機的ip
_,err = c.Do("SADD","ippoolkey",ip)
if err != nil {
log.Fatalf("err:%s", err)
os.Exit(1)
}
}
/**
* 隨機返回一個IP
*/
func returnIp() string{
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
os.Exit(0)
}
defer c.Close()
key,err:=redis.String(c.Do("SRANDMEMBER", "ippoolkey"))
res,err:=redis.String(c.Do("HGET", "ippool",key))
res=strings.TrimLeft(res, "[")
res=strings.TrimRight(res, "]")
array := strings.Split(res,",")
for i:=0;i<len(array);i++{
array[i] = strings.Trim(array[i],"\"")
}
host:= strings.ToLower(array[4])+"://"+array[0]+":"+array[1]
return host
}
相關推薦
Golang實戰【IP池-自動切換IP爬蟲】
繼上次爬boss直聘資料IP被封,雖然後面發現boss直聘 只要稍微沒個請求停一秒鐘就可以一直爬下去,但是任然心有不甘。欺負我ip少??? 於是這兩天抽空寫了個IP池加上可以自動切換IP 千千萬萬個IP 讓你封···········哈哈 我這邊用的是西刺的代理
飛蟻IP代理,企業級高匿真實IP,320+城市千萬級IP池隨意切換
高匿 ext 協議 數量 遍布 shadow sha images 市場調查 “飛蟻科技”經過多年市場調查,為廣大客戶群體提供技術服務,助力於企業推廣人員,爬蟲等技術人員提供海量動態IP,公司保證IP數量及穩定性,覆蓋全國各地區,飛蟻代理是廣大站長們、測試人員必備工具。大客
windows環境下自動切換IP的bat指令碼
我的需求是這樣的:公司的網路需要配置靜態IP,而我家裡的網路是DHCP自動獲取模式。如果從公司回家,或者從家去公司後,修改IP是一件很繁瑣的事情。那麼我想通過執行一個bat指令碼就實現IP切換,那該是多麼美好的意見事情。 起始實現起來並不難,只要把下述指令碼程式碼存成“I
水滴動態IP:自動換IP軟體哪個好用?換IP的原理是什麼
現如今,人們的生活速度越來越快,各個方面都開始追求效率,所以網際網路產品都開始注重這一方便,任何產品都在往簡單易操作的方向進行。換IP軟體的開發的初衷就是為了讓人們的生活和工作可以更加的方便和快捷。那麼換IP的原理是什麼?自動換IP軟體哪個更好用呢? 換
爬蟲代理設定--爬取ip池、驗證ip是否可用、驗證代理ip是否能用
昨天在爬取大眾點評的時候,剛開始還好好的,但一會就把我的ip給封啦,所以我就想給自己弄一個ip池,這樣我就可以繼續爬啦。網上找了一堆程式碼,發現好多都是python2的,它們請求使用urllib2的庫,這個庫在python3中合併成urllib,所以很多方法呼叫都出現錯誤,所
【python 新浪微博爬蟲】python 爬取新浪微博24小時熱門話題top500
一、需求分析 模擬登陸新浪微博,爬取新浪微博的熱門話題版塊的24小時內的前TOP500的話題名稱、該話題的閱讀數、討論數、粉絲數、話題主持人,以及對應話題主持人的關注數、粉絲數和微博數。 二、開發語言 python2.7 三、需要匯入模組 import
【Python3爬蟲】Scrapy使用IP代理池和隨機User-Agent
findall 4.3 sdch 5.0 agen and 由於 付費 status 在使用爬蟲的時候,有時候會看到由於目標計算機積極拒絕,無法連接...,這就是因為我們的爬蟲被識別出來了,而這種反爬蟲主要是通過IP識別的,針對這種反爬蟲,我們可以搭建一個自己的IP代理池,
python爬蟲(五):實戰 【1. 檢驗代理ip小程式】
# 檢驗代理ip是否可用 import requests proxy_id = { "http": "http://110.73.42.32:8123"} r = requests.get('http://ip.webmasterhome.cn/', proxies=proxy_id)
固定IP和自動IP切換bat指令碼
最近在忙專案,部落格更新基本斷了,gis方面學習暫無太大進展。 最近公司換位置,重新分配ip,之前都沒用有線,現在遇到問題是公司固定ip,家裡自動分配ip,來回修改很麻煩。 查了網上的有不少方案,但是試了有點小問題,後來查查才知道什麼原因,直接上程式碼細說,把下面複製到t
【Linux】自動獲取Ip的兩種方法
在安裝好Centos系統後,每次登陸上之後都需要通過手動方式進行網路連線,過於麻煩,因此改成自動連線的方式。 &nb
Windows上利用Python自動切換代理IP的終極方案!
宣告下:不同於網路上千百篇方法,下文是經過各種嚴格測試都通過的,同時也是一個實驗的過程,排除了各種不靠譜的方法。有需要的可以評論來討論,想要原始碼和相關參考文獻或筆記的,也可以找我。 思路及啟發 先說一下我這一路實驗的思路吧,這個至關重要。 之前一直在用Python做爬蟲抓取資料,發現本機IP的問題不解
通過上次寫的自動獲取IP代理池,訪問whatismyip,來測試ip代理訪問
程式碼有時執行不成功,可能是代理地址問題。檔案簡單介紹建立opener物件。 優秀文章:http://www.jb51.net/article/46495.htm #-*-coding:UTF-8-
Python 實現windows下自動切換代理IP
簡介:利用python實現windows下“開啟代理”和“關閉代理”切換 原理:通過修改登錄檔 "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 下的子項,能夠設定
k8s西遊記 - 切換網路外掛IP池
前言 最近在另一個k8s叢集中,搭建了kong閘道器,在配置OIDC外掛時,希望使用Memcahe代替Cookie來儲存會話資訊,於是把部署在同一區域網Memcahe的內網IP,比如:192.168.10.145配置給了kong,發現kong居然不能訪問這個IP,於是進入容器組,執行命令:ping 192.1
基礎實驗1(單臂路由及利用路由器開啟DHCP自動分配IP地址)
單臂路由 路由器dhcp服務應用 子接口封裝協議實驗環境:PT 6.2兩臺PC:PC1/PC2 一臺cisco 2960交換機 一臺2620路由器實驗目的:讓PC1/PC2屬於不同的VLAN,且相互通信。同時自動獲取各自網段IP地址。1、進入2960的配置模式,劃分不同的vlan並將PC1/PC2劃入不同的
GuozhongCrawler看準網爬蟲動態切換IP漫爬蟲
input arraylist [] java resource popu pre puts oschina 有些關於URL去重的方面代碼沒有提供,須要自己去實現。主要這裏提供思路 項目地址:http://git.oschina.net/woshidaniu/
如何定制 Calico 的 IP 池?- 每天5分鐘玩轉 Docker 容器技術(71)
wan mil 討論 mar apple ipam hit initial use 在前面的小節中,我們沒有特別配置,calico 會為自動為網絡分配 subnet,當然我們也可以定制。 首先定義一個 IP Pool,比如: cat <<
mac shell 獲取ip,自動啟動文件http服務
如果 images 麻煩 inpu 服務 sim nbsp fig alias 因為工作原因,時常有文件傳輸需求。 rz、nc、rsync都用過,各有各的好處。 但相對的,向別處推文件時總有各種麻煩,尤其是在給同事發送文件時。 然後就想到了提供http服務。 在環境
centos虛擬機安裝 初始 設置自動獲取ip
size con ifcfg /etc/ net 網卡配置 round 網卡配置文件 hit 編輯網卡配置文件,命令: vim /etc/sysconfig/network-scripts/ifcfg-ens33 更改ONBOOT=yes centos虛擬機安裝
linux如何自動獲取ip地址
動態ip 啟用 eve eth pad 開機 soft 靜態ip地址 inux 第一步:激活網卡 系統裝好後默認的網卡是eth0,用下面的命令將這塊網卡激活。 # ifconfig eth0 up 第二步:設置網卡進入系統時啟動 想要每次開機就可以自動獲取IP