代理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年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...
随机推荐
- Jquery 操作DOM元素
一.文本输入框: text <input type=”text” value=”99.com” size=12 id=”input1” /> 1.获取文本值: $("#input ...
- 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等
一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...
- codeforces#571Div2 D---Vus the Cossack and Numbers【贪心】
题目:http://codeforces.com/contest/1186/problem/D 题意:给定一个大小为$n$的浮点序列,这$n$个数的和为0. 现在对这个序列中的每个数,进行向上取整或向 ...
- Longest Continuous Increasing Subsequence
Description Give an integer array,find the longest increasing continuous subsequence in this array. ...
- Linux监控系统概览
自从Linux系统诞生之始,监控系统就随之出现. 当然说到监控系统,我们就必须聊到SNMP协议,SNMP分为管理端(NMP)和被管理端. 管理端周期性的到被监控端采集数据,被监控端还需要有权限收集数据 ...
- PHP 根据域名和IP返回不同的内容
遇到一个好玩的事情,访问别人的IP和别人的域名返回的内容竟然不一样.突然觉得很好玩,也很好奇.自己研究了一下下,就简单写一下吧~ 一个IP和一个域名, 先讲一下公网IP没有绑定域名,但是可以通过一个没 ...
- JSP数据交互(二)
Application:当前服务器(可以包含多个会话):当服务器启动后就会创建一个application对象,被所有用户共享page.request.session.application四个作用域对 ...
- Greenplum 调优--数据倾斜排查(二)
上次有个朋友咨询我一个GP数据倾斜的问题,他说查看gp_toolkit.gp_skew_coefficients表时花费了20-30分钟左右才出来结果,后来指导他分析原因并给出其他方案来查看数据倾斜. ...
- 爬虫(十一):scrapy中的选择器
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...
- JavaScript中,返回上一个页面时,如何保证上一个页面的不刷新?
history.back()和history.go(-1)都可以实现返回上一页并不刷新.History 对象包含用户(在浏览器窗口中)访问过的 URL. history.back() 等同于在浏览器点 ...