java爬取西刺ip代理练习

4 篇文章 0 订阅
1 篇文章 0 订阅

1.工具准备

开发环境:Eclipse+Httpclient+Jsoup
jar包:
httpclient下的所有jar包(我不清楚哪些jar包是不需要的,以防万一,把所有jar包加上)
jsoup-1.10.3.jar

2.了解并阅读相关文档

        HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

这里不过多介绍,想要了解的可以自己去官网翻看,我们用httpclient模拟浏览器请求,用jsoup解析httpclient返回的实体的文档对象。


3.开始编写代码

package com.ff.jsoup;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class JsoupHelloWorld {
	
	public Elements getRequestMethod(String url) throws Exception {
		CloseableHttpClient client = HttpClients.createDefault();
		HttpGet httpGet = new HttpGet(url);
		//setConnectTimeout(10000)连接超时时间(单位豪秒)
		//setSocketTimeout(10000)读取超时时间(单位豪秒)
		RequestConfig config=RequestConfig.custom().setConnectTimeout(10000).setSocketTimeout(10000).build();
		httpGet.setConfig(config);
		httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64)"
				+ " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
		CloseableHttpResponse response = client.execute(httpGet);
		HttpEntity entity = response.getEntity();	//获取返回实体
		String html = "";
		if(entity!=null) {
			html = EntityUtils.toString(entity);
		}
		response.close();			//关闭流和和释放资源
		Document doc = Jsoup.parse(html);		//解析网页得到文档对象
		/**
		 * getElementById(String id) 根据id来查询DOM
		 * getElementsByTag(String tagName) 根据tag名称来查询DOM
		 * getElementsByClass(String className) 根据样式名称来查询DOM
		 * getElementsByAttribute(String key) 根据属性名来查询DOM
		 * getElementsByAttributeValue(String key,String value)  根据属性名和属性值来查询DOM
		 */
		Elements tags = doc.select("#ip_list > tbody > tr");
//		Element element = tags.get(0);
//		System.out.println(element.text());
//		System.out.println(tags);
		return tags;
	}
	
	public Map<Integer,String> getElementsByTags(Elements tags) {
		Map<Integer,String> ipAddress = new HashMap<Integer,String>();
		int count = 0;
		//遍历tbody子节点
		for (Element element : tags) {
			//取得ip地址节点
			Elements tdChilds = element.select("tr > td:nth-child(2)");
			//取得端口号节点
			Elements tcpd = element.select("tr > td:nth-child(3)");
			ipAddress.put(++count, tdChilds.text()+"."+tcpd.text());
		}
		System.out.println(ipAddress);
		
		return ipAddress;
	}
	
	public void saveToText(Map<Integer,String> map) {
		try {						
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:\\cc\\IpAddress.txt")),
					"UTF-8"));
			for (int i = 2; i < map.size(); i++) {
				String ipAddess = map.get(i);
	//				FileUtils.writeStringToFile(new File("D:\\cc\\IpAddress.txt"), ipAddess, "utf-8");
				bw.write(ipAddess);
				bw.newLine();
			}
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("ip地址爬取保存完毕");
	}
	
	public static void main(String[] args) {
		JsoupHelloWorld ht = new JsoupHelloWorld();
		String url = "http://www.xicidaili.com/nn/";
		try {
			Elements elements = ht.getRequestMethod(url);
			Map<Integer, String> elementsByTags = ht.getElementsByTags(elements);
			ht.saveToText(elementsByTags);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.流程分析

1.首先通过httpclient请求页面返回实体

2.然后通过jsoup解析得到Document对象

3.分析西刺网站的ip地址和端口号所在位置

4.用select选择器提取要爬取的ip地址和端口号

5.将ip地址和端口号拼接成一个完整的地址,再用Map集合封装地址

6.遍历Map,通过IO流的输出流将Map封装的地址输出到本地文件,每写入一行换行

7.关闭流,控制台输出结束语


5.样图





6.总结

昨天才开始学的Java爬虫,并不难,很容易上手,除了httpclient和jsoup架包的操作剩下的就是html、css分析及IO流的操作了。并且tdChilds.text()和tdChilds.toString()区别还是要说一下:前者提取标签内容,后者提取整个标签。初次用Java写出了一个爬虫,也是很有成就感的,哈哈哈


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA selenium 设置ip代理: 1. 首先需要下载selenium webdriver,可以在官网下载,或者使用maven仓库下载。 2. 下载好webdriver后,需要下载对应浏览器的driver,比如Chrome浏览器需要下载chromedriver。 3. 在代码中设置代理,可以使用第三方库ProxyPool,具体使用方法可以参考官方文档。 4. 在使用selenium webdriver时,需要设置代理,可以通过以下代码实现: ```java ChromeOptions options = new ChromeOptions(); options.addArguments("--proxy-server=http://ip:port"); WebDriver driver = new ChromeDriver(options); ``` 其中,ip和port需要替换成代理中的ip和端口。 webmagic爬取网页数据: 1. 首先需要下载webmagic库,可以在maven仓库中下载。 2. 创建一个Java类,并继承PageProcessor类,实现其中的方法,如下所示: ```java public class ExamplePageProcessor implements PageProcessor { private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override public void process(Page page) { // 解析页面数据 page.putField("title", page.getHtml().xpath("//title").toString()); page.putField("content", page.getHtml().xpath("//div[@class='content']").toString()); // 添加要爬取的url page.addTargetRequests(page.getHtml().links().regex("(https://www\\.example\\.com/[\\w\\-]+)").all()); } @Override public Site getSite() { return site; } } ``` 3. 在main方法中,创建一个Spider对象,并设置要爬取的url和PageProcessor,如下所示: ```java public static void main(String[] args) { Spider.create(new ExamplePageProcessor()) .addUrl("https://www.example.com") .run(); } ``` 4. 运行程序,爬取数据。数据会保存在Page对象中,可以通过page.putField()方法保存。可以通过page.getTargetRequests()方法获取要爬取的url,可以通过page.getResultItems()方法获取保存的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值