前言
僅僅偽裝網頁agent是不夠的,你還需要一點新東西
今天主要講解兩個比較知名的國內免費IP代理網站:西刺代理&快代理,我們主要的目標是爬取其免費的高匿代理,這些IP有兩大特點:免費,不穩定(至於為什么要爬不穩定的免費的代理,你心里難道沒點B+樹么,高富帥誰** 過來學爬蟲,還爬代理,人家直接買好么~)
目標
給出目標網站,盤它
快代理
- 代碼詳情
import ChangIp.GetAgent
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import scala.collection.mutable.ArrayBuffer
import scala.util.{Failure, Random, Success, Try}
import scala.collection.JavaConverters._
/**
* @Author *******
* @Create 2019-01-23 11:59
* @Descripation:
*
*
*/
object IP_CollectTest {
//抓取快代理前10頁的ip
def requestGetUrl(times:Int=20)(url:String,tag:String,arr_all:ArrayBuffer[String]): Unit ={
//設置隨機間隔時間
var delay:Long=500
delay = (1000+(new Random).nextInt(4000)).toLong
//開始抓取
//GetAgent.get_agent()方法--見上一篇,很簡單,自己加一下就行
Try(Jsoup.connect(url+tag).userAgent(GetAgent.get_agent()).get())match {
case Failure(e) =>{
if(times!=0){
println(e.getMessage)
//抓取失敗重試
Thread.sleep(delay)
requestGetUrl(times-1)(url,tag,arr_all)
}else throw e
}
case Success(doc) =>
// 解析網頁傳入參數,doc和保存數據的數組
val count = parseDoc(doc,arr_all)
if (count==0){
//抓取失敗重試
Thread.sleep(delay)
if(times>=0){
requestGetUrl(times-1)(url,tag,arr_all)
}
else {
println(tag+"scrape data failed...,Please comfirm this word again")
}
}
}
}
//網頁解析
def parseDoc(doc:Document,arr_all:ArrayBuffer[String]): Int ={
// 用count判斷是否有返回數據
var count = 0
val links = doc.select("tr")
for(link<-links.asScala){
// 爬取IP
val ip = link.select("td").select("[data-title=IP]").text()
// 爬取port
val port = link.select("td").select("[data-title=PORT]").text()
// 拼成字符串並保存
if(!ip.isEmpty && !port.isEmpty){
val res = ip+":"+port
println(res)
arr_all.append(res)
// 有返回數據則count+1
count+=1
}
}
count
}
def use : ArrayBuffer[String] ={
// 用一個array數組保存結果
val arr_all = ArrayBuffer[String]()
//遍歷前10頁
for(i<-Range(1,11)){
val url = "https://www.kuaidaili.com/free/inha/"
// 傳入三個參數(地址,頁數,數組)
requestGetUrl()(url,i.toString,arr_all)
}
//返回保存爬取數據的數組
arr_all
}
def main(args: Array[String]): Unit = {
use
}
}
- 結果展示
西刺代理
這里我們只放一下網頁解析的代碼,其他的跟上面一樣
- 代碼詳情
bject XiCi_IPCollect {
def main(args: Array[String]): Unit = {
// 爬取的網址
val url = "https://www.xicidaili.com/nn/1"
// 加上TryCatch框架
Try(Jsoup.connect(url).get())match {
case Failure(e) =>
// 打印異常信息
println(e.getMessage)
case Success(doc:Document) =>
// 解析正常則返回Document,然后提取Document內所需信息
val links = doc.select("table#ip_list").select("tr")
for(link<-links.asScala){
val txt = link.text()
val ip = txt.split(" ")(0)
val port = txt.split(" ")(1)
if(ip.contains(".")){
println(ip+":"+port)
}
}
}
}
}
- 結果展示
代理驗證
因為這些免費IP不穩定的原因,其實這些IP里有很大一部分是不能用的,所以需要我們來提取能用的IP,以節省后續爬蟲的時間
驗證IP是否可用其實非常簡單,就是在header里加入要查詢的IP,然后訪問一下網站,如果成功,那么代表IP可用
def is_pass(arr_all:ArrayBuffer[String]): ArrayBuffer[String] = {
//arr_all 數組里保存這上面我們爬取的代理IP
val arr_pass = ArrayBuffer[String]()
for (i <- arr_all) {
try{
//proxy(ip,port)這個函數添加ip進header
val response = Jsoup.connect("http://www.baidu.com").proxy(i.split(":").head.trim,i.split(":").last.trim.toInt).userAgent(agent).execute()
//網站返回碼不是200就可以,這方面有興趣可以自己google一下
if(response.statusCode()!=200){
println("Bad proxy: "+i)
}
else {
arr_pass.append(i)
println("Success proxy: "+i)
}
}
catch{
case e => println(e)
}
}
arr_pass
}
或者不用簡單直接一點
//驗證ip是否可用
def is_pass(arr_all:ArrayBuffer[String]): ArrayBuffer[String] ={
val arr_pass = ArrayBuffer[String]()
for(i<-arr_all){
Try(Jsoup.connect(URL_pas).proxy(i.split(":").head.trim,i.split(":").last.trim.toInt).userAgent(agent).get())match {
case Failure(e)=>
println(e)
//如果沒有異常,直接添加
case Success(doc:Document)=>
// println(i)
arr_pass.append(i)
}
}
arr_pass
}
結尾嘮叨兩句
如果你對我的文章感興趣,歡迎你點開我下一篇文章,后面我將手把手帶你一起完成一個個小case,對了如果你也有好的想法,歡迎溝通交流
今天主要是分享了一下IP代理獲取的小方法,有興趣的同學還可以自己添加定時的功能,每天更新IP。