代理IP爬取和验证(快代理&西刺代理)
前言
仅仅伪装网页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爬取和验证(快代理&西刺代理)的更多相关文章
- requests 使用免费的代理ip爬取网站
import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxx ...
- 代理IP爬取,计算,发放自动化系统
IoC Python端 MySQL端 PHP端 怎么使用 这学期有一门课叫<物联网与云计算>,于是我就做了一个大作业,实现的是对代理IP的爬取,计算推荐,发放给用户等任务的的自动化系统.由 ...
- 蚂蚁代理免费代理ip爬取(端口图片显示+token检查)
分析 蚂蚁代理的列表页大致是这样的: 端口字段使用了图片显示,并且在图片上还有各种干扰线,保存一个图片到本地用画图打开观察一下: 仔细观察蓝色的线其实是在黑色的数字下面的,其它的干扰线也是,所以这幅图 ...
- 酷伯伯实时免费HTTP代理ip爬取(端口图片显示+document.write)
分析 打开页面http://www.coobobo.com/free-http-proxy/,端口数字一看就不对劲,老规律ctrl+shift+c选一下: 这就很悲剧了,端口数字都是用图片显示的: 不 ...
- Scrapy爬取西刺代理ip流程
西刺代理爬虫 1. 新建项目和爬虫 scrapy startproject daili_ips ...... cd daili_ips/ #爬虫名称和domains scrapy genspider ...
- 使用XPath爬取西刺代理
因为在Scrapy的使用过程中,提取页面信息使用XPath比较方便,遂成此文. 在b站上看了介绍XPath的:https://www.bilibili.com/video/av30320885?fro ...
- python爬西刺代理
爬IP代码 import requests import re import dauk from bs4 import BeautifulSoup import time def daili(): p ...
- 极简代理IP爬取代码——Python爬取免费代理IP
这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...
- 5 使用ip代理池爬取糗事百科
从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...
随机推荐
- 接口调优——WebAPI 过滤器,IIS WebDAV
目录 1.身份认证过滤器—AuthenticationFilter 2.Action 过滤器—ActionFilter 3.异常处理过滤器—ExceptionFilterAttribute 4.IS ...
- c++ vector容器基本用法
基本用法 #include<iostream> #include<string> #include<vector> using namespace std; cla ...
- Latex快速注释掉多行
最简单的方法就是选中你想要注释掉的内容,同时按住Ctrl+Alt+Shift+→
- windows下递归删除指定文件和文件夹
//删除文件del *.后缀 /s//删除文件夹for /r 目录 %a in (文件夹名\) do @if exist "%a" rd /s/q "%a"
- Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes
链接: https://codeforces.com/contest/1251/problem/B 题意: A palindrome is a string t which reads the sam ...
- echo 显示命令
echo 显示命令 echo 是在PHP里面最常用的一个输出.显示功能的命令.直线电机滑台 我们可以让他显示任何可见的字符. <?php echo 123; ?> <?php $ip ...
- 如何利用Wireshark解密SSL和TLS流量
如何利用Wireshark解密SSL和TLS流量https://support.citrix.com/article/CTX135121 1.有server端的private key,直接在wires ...
- Poj 2599 Godfather(树的重心)
Godfather Time Limit: 2000MS Memory Limit: 65536K Description Last years Chicago was full of gangste ...
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
- LibreOJ #115. 无源汇有上下界可行流
二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...