前言

仅仅伪装网页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。

代理IP爬取和验证(快代理&西刺代理)的更多相关文章

  1. requests 使用免费的代理ip爬取网站

    import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxx ...

  2. 代理IP爬取,计算,发放自动化系统

    IoC Python端 MySQL端 PHP端 怎么使用 这学期有一门课叫<物联网与云计算>,于是我就做了一个大作业,实现的是对代理IP的爬取,计算推荐,发放给用户等任务的的自动化系统.由 ...

  3. 蚂蚁代理免费代理ip爬取(端口图片显示+token检查)

    分析 蚂蚁代理的列表页大致是这样的: 端口字段使用了图片显示,并且在图片上还有各种干扰线,保存一个图片到本地用画图打开观察一下: 仔细观察蓝色的线其实是在黑色的数字下面的,其它的干扰线也是,所以这幅图 ...

  4. 酷伯伯实时免费HTTP代理ip爬取(端口图片显示+document.write)

    分析 打开页面http://www.coobobo.com/free-http-proxy/,端口数字一看就不对劲,老规律ctrl+shift+c选一下: 这就很悲剧了,端口数字都是用图片显示的: 不 ...

  5. Scrapy爬取西刺代理ip流程

    西刺代理爬虫 1. 新建项目和爬虫 scrapy startproject daili_ips ...... cd daili_ips/ #爬虫名称和domains scrapy genspider ...

  6. 使用XPath爬取西刺代理

    因为在Scrapy的使用过程中,提取页面信息使用XPath比较方便,遂成此文. 在b站上看了介绍XPath的:https://www.bilibili.com/video/av30320885?fro ...

  7. python爬西刺代理

    爬IP代码 import requests import re import dauk from bs4 import BeautifulSoup import time def daili(): p ...

  8. 极简代理IP爬取代码——Python爬取免费代理IP

    这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...

  9. 5 使用ip代理池爬取糗事百科

    从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...

随机推荐

  1. Jquery 操作DOM元素

    一.文本输入框: text <input type=”text” value=”99.com” size=12 id=”input1” /> 1.获取文本值: $("#input ...

  2. 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等

    一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...

  3. codeforces#571Div2 D---Vus the Cossack and Numbers【贪心】

    题目:http://codeforces.com/contest/1186/problem/D 题意:给定一个大小为$n$的浮点序列,这$n$个数的和为0. 现在对这个序列中的每个数,进行向上取整或向 ...

  4. Longest Continuous Increasing Subsequence

    Description Give an integer array,find the longest increasing continuous subsequence in this array. ...

  5. Linux监控系统概览

    自从Linux系统诞生之始,监控系统就随之出现. 当然说到监控系统,我们就必须聊到SNMP协议,SNMP分为管理端(NMP)和被管理端. 管理端周期性的到被监控端采集数据,被监控端还需要有权限收集数据 ...

  6. PHP 根据域名和IP返回不同的内容

    遇到一个好玩的事情,访问别人的IP和别人的域名返回的内容竟然不一样.突然觉得很好玩,也很好奇.自己研究了一下下,就简单写一下吧~ 一个IP和一个域名, 先讲一下公网IP没有绑定域名,但是可以通过一个没 ...

  7. JSP数据交互(二)

    Application:当前服务器(可以包含多个会话):当服务器启动后就会创建一个application对象,被所有用户共享page.request.session.application四个作用域对 ...

  8. Greenplum 调优--数据倾斜排查(二)

    上次有个朋友咨询我一个GP数据倾斜的问题,他说查看gp_toolkit.gp_skew_coefficients表时花费了20-30分钟左右才出来结果,后来指导他分析原因并给出其他方案来查看数据倾斜. ...

  9. 爬虫(十一):scrapy中的选择器

    Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...

  10. JavaScript中,返回上一个页面时,如何保证上一个页面的不刷新?

    history.back()和history.go(-1)都可以实现返回上一页并不刷新.History 对象包含用户(在浏览器窗口中)访问过的 URL. history.back() 等同于在浏览器点 ...