前言

仅仅伪装网页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. 28-SQLServer带见证服务器的镜像搭建

    一.注意点 1.数据库的模式要是完整模式. 2.要对数据库完整备份和事务日志备份,分别还原到镜像库上,使用NORECOVERY模式. 3.镜像数据库是不允许删除和操作,即便查看属性也不行. 4.先删除 ...

  2. 【安卓进阶】Product Flavor基础玩法

    在安卓项目开发中,大多时候总是有测试环境.生产环境之类的区别,在不使用Product Flavor时,我们一般都是通过手工改动代码来实现测试环境.生产环境的切换. 这样就造成了项目管理上的不便,频繁的 ...

  3. mongodb 开发规范

    一.命名规则 1.数据库命名规则 数据库名可以是满足以下条件的任意UTF-8字符串: (1)不能是空字符串(”") : (2)不能含有”(空格)...$./..和(空字符): (3)应全部小 ...

  4. 009_Python3 元组

    Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可.   实例1: >>> ...

  5. CF843D Dynamic Shortest Path spfa+剪枝

    考试的T3,拿暴力+剪枝卡过去了. 没想到 CF 上也能过 ~ code: #include <bits/stdc++.h> #define N 100004 #define LL lon ...

  6. luogu P3567 [POI2014]KUR-Couriers

    二次联通门 : luogu P3567 [POI2014]KUR-Couriers MMP 指针 RE + MLE + WA..... 不得已...向黑恶的数组实力低头 /* 指针 */ #inclu ...

  7. RDMA Programming - Base on linux-rdma

    RDMA Programming - Base on linux-rdma 首页分类标签留言关于订阅2017-11-08 | 分类 Network  | 标签 RDMA  RoCE  Linux-RD ...

  8. hbuilder连接模拟器进行联调(逍遥模拟器,MuMu模拟器,夜神模拟器)

    MuMu模拟器:7555 逍遥模拟器:21503 夜神模拟器:62001 1. 2. 3. 如果上诉方法不好使,可以重启模拟器以及hbuilder,有时可能连接中断,可以重新连接.

  9. xyz

    import numpy as np a = np.array([[,],[,]]) sumo = np.sum(a,axis=) suml = np.sum(a,axis=O) print(sumo ...

  10. Excel表格内容导出到页面

    引入org.apache.poi.ss.usermodel   public void addExcelBooks() throws Exception { HttpServletRequest re ...