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

分析

打开页面http://www.coobobo.com/free-http-proxy/,端口数字一看就不对劲,老规律ctrl+shift+c选一下:

这就很悲剧了,端口数字都是用图片显示的:

不过没关系,看这些图片长得这么清秀纯天然无杂质,识别是很容易的。

然后再来选一下ip地址:

很可能ip地址是用这个js现写进来的,要确定的话还得看一眼返回的原始html,查看源码定位这一个ip:

看来只能从这段js中提取ip地址了,并不是很难,只需要把引号、加号、括号、document.write、空白符抹掉即可,一个正则表达式可以搞定。

代码实现

端口图片比较麻烦,之前写过一个类似的小工具库,对于这种简单字符的识别可以节省一些工作量,这里就使用这个工具库

因为识别原理就是先收集一些图片标记好谁是啥字符作为依据,然后后面再来的新的都来参考这些已经标记好的,所以需要先收集一些图片来标记:

/**
 * 收集需要标注的字符图片
 */
public static void grabTrainImage(String basePath) {
    for (int i = 1; i <= 10; i++) {
        System.out.println("page " + i);
        Document document = getDocument(url + i);
        Elements images = document.select("table.table-condensed tbody tr img");
        images.forEach(elt -> {
            String imgLink = host + elt.attr("src");
            byte[] imgBytes = download(imgLink);
            try {
                String outputPath = basePath + System.currentTimeMillis() + ".png";
                BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgBytes));
                ImageIO.write(img, "png", new File(outputPath));
                System.out.println(imgLink);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

抓取图片到本地并生成要标注的图片:

public static void main(String[] args) throws IOException {
    String rawImageSaveDir = "E:/test/proxy/kubobo/raw/";
    String distinctCharSaveDir = "E:/test/proxy/kubobo/char/";
    grabTrainImage(rawImageSaveDir);
    ocrUtil.init(rawImageSaveDir, distinctCharSaveDir);
}

然后打开E:/test/proxy/kubobo/char/,之前下载的全部图片中用到的所有字符都被分割出来放到了这个目录下:

现在需要将文件名修改为这张图片表示的意思:

需要注意不要标记错了不然后面的就全是错的了。

然后告诉ocrUtil上面这个目录的位置让其知道去哪里加载:

ocrUtil.loadDictionaryMap("E:/test/proxy/kubobo/char/");

然后就可以使用了,只需要把图片传入给ocrUtil.ocr(BufferedImage)即返回这种图片对应的字符,完整的代码如下:

package org.cc11001100.t1;

import cc11001100.ocr.OcrUtil;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

import static java.util.stream.Collectors.toList;

/**
 * @author CC11001100
 */
public class KuboboProxyGrab {

    private static String host = "http://www.coobobo.com";
    private static String url = "http://www.coobobo.com/free-http-proxy/";

    private static OcrUtil ocrUtil;

    static {
        ocrUtil = new OcrUtil();
        ocrUtil.loadDictionaryMap("E:/test/proxy/kubobo/char/");
    }

    /**
     * 收集需要标注的字符图片
     */
    public static void grabTrainImage(String basePath) {
        for (int i = 1; i <= 10; i++) {
            System.out.println("page " + i);
            Document document = getDocument(url + i);
            Elements images = document.select("table.table-condensed tbody tr img");
            images.forEach(elt -> {
                String imgLink = host + elt.attr("src");
                byte[] imgBytes = download(imgLink);
                try {
                    String outputPath = basePath + System.currentTimeMillis() + ".png";
                    BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgBytes));
                    ImageIO.write(img, "png", new File(outputPath));
                    System.out.println(imgLink);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    private static Document getDocument(String url) {
        byte[] responseBytes = download(url);
        String html = new String(responseBytes, StandardCharsets.UTF_8);
        return Jsoup.parse(html);
    }

    private static byte[] download(String url) {
        for (int i = 0; i < 3; i++) {
            try {
                return Jsoup.connect(url).execute().bodyAsBytes();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new byte[0];
    }

    public static List<String> grabProxyIpList() {
        List<String> resultList = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            System.out.println("page " + i);
            Document document = getDocument(url + i);
            Elements ipElts = document.select("table.table-condensed tbody tr");
            List<String> pageIpList = ipElts.stream().map(elt -> {
                String rawText = elt.select("td:eq(0) script").first().data();
                String ip = rawText.replaceAll("document.write|[\‘\"()+]|\\s+", "").trim();

                String imgLink = host + elt.select("td:eq(1) img").attr("src");
                byte[] imgBytes = download(imgLink);
                try {
                    BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgBytes));
                    String port = ocrUtil.ocr(img);
                    return ip + ":" + port;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return "";
            }).filter(StringUtils::isNotEmpty).collect(toList());
            resultList.addAll(pageIpList);
        }
        return resultList;
    }

    public static void main(String[] args) throws IOException {

//        String rawImageSaveDir = "E:/test/proxy/kubobo/raw/";
//        String distinctCharSaveDir = "E:/test/proxy/kubobo/char/";
//        grabTrainImage(rawImageSaveDir);
//        ocrUtil.init(rawImageSaveDir, distinctCharSaveDir);

        grabProxyIpList().forEach(System.out::println);

    }

}

原文地址:https://www.cnblogs.com/cc11001100/p/8647555.html

时间: 2024-08-01 03:39:27

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

scrapy中使用代理IP爬取数据时遇到IP失效时自动切换的方法

当使用临时的IP请求数据时,由于这些IP的过期时间极短,通常在1分钟~5分钟左右,这时scrapy就会报发以下错误 2020-01-17 17:00:48 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://xxxx/co s): Connection was refused by other side: 10061: 由于目标计算机积极拒绝,无法连接.. 这时如何自动切换IP,然后重新请求呢? 先看看scrapy的

Scrapy爬取美女图片第三集 代理ip(上) (原创)

首先说一声,让大家久等了.本来打算520那天进行更新的,可是一细想,也只有我这样的单身狗还在做科研,大家可能没心思看更新的文章,所以就拖到了今天.不过忙了521,522这一天半,我把数据库也添加进来了,修复了一些bug(现在肯定有人会说果然是单身狗). 好了,废话不多说,咱们进入今天的主题.上两篇 Scrapy爬取美女图片 的文章,咱们讲解了scrapy的用法.可是就在最近,有热心的朋友对我说之前的程序无法爬取到图片,我猜应该是煎蛋网加入了反爬虫机制.所以今天讲解的就是突破反爬虫机制的上篇 代理

练习-爬取某图片及查询IP地址

爬取某图片的程序: #图片爬取全代码 import requests import os url='http://img0.dili360.com/rw9/ga/M01/4A/3D/wKgBy1p6qJ6ALyaOADWDaIwa9uw587.tub.jpg' root='D:/北理工爬虫课程/' path=root+url.split('/')[-1]#被加数表示的是图片路径中图片的名字加后缀 try: if not os.path.exists(root): os.mkdir(root)#如

百度图片爬虫-python版-如何爬取百度图片?

上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://5912119.blog.51cto.com/5902119/1771391 这一篇我想写写如何爬取百度图片的爬虫,这个爬虫也是:搜搜gif(在线制作功能点我) 的爬虫代码,其实爬虫整体框架还是差不多的,但就是会涉及到图片的的一些处理,还是花费了我不少时间的,所以我请阅读的本爬虫的孩子还是认真一些,毕竟程序猿都不容易啊.好的,我也不想多说,爬虫的代码我会分享到去转盘网,想下载本爬虫代码的孩子请点我下载,如果没有下

一个咸鱼的Python爬虫之路(三):爬取网页图片

学完Requests库与Beautifulsoup库我们今天来实战一波,爬取网页图片.依照现在所学只能爬取图片在html页面的而不能爬取由JavaScript生成的图.所以我找了这个网站http://www.ivsky.com 网站里面有很多的图集,我们就找你的名字这个图集来爬取 http://www.ivsky.com/bizhi/yourname_v39947/ 来看看这个页面的源代码: 可以看到我们想抓取的图片信息在<li> 里面然后图片地址在img里面那么我们这里可以用Beautifu

Scrapy爬取美女图片 (原创)

有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用python爬取慕课网的视频,是根据爬虫的机制,自己手工定制的,感觉没有那么高大上,所以我最近玩了玩 python中强大的爬虫框架Scrapy. Scrapy是一个用 Python 写的 Crawler Framework ,简单轻巧,并且非常方便.Scrapy 使用 Twisted 这个异步网络库来处理

Scrapy爬取美女图片续集 (原创)

上一篇咱们讲解了Scrapy的工作机制和如何使用Scrapy爬取美女图片,而今天接着讲解Scrapy爬取美女图片,不过采取了不同的方式和代码实现,对Scrapy的功能进行更深入的运用. 在学习Scrapy官方文档的过程中,发现Scrapy自身实现了图片和文件的下载功能,不需要咱们之前自己实现图片的下载(不过原理都一样). 在官方文档中,我们可以看到下面一些话:Scrapy为下载item中包含的文件(比如在爬取到产品时,同时也想保存对应的图片)提供了一个可重用的 item pipelines .

一个简单的网络爬虫-从网上爬取美女图片

CrawlerPicture.java 文件 package com.lym.crawlerDemo; import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)