java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码
原創(chuàng) 野狗菌 希望你能喜歡 今天
關(guān)于本文:
本文介紹一個(gè)簡(jiǎn)單Java爬蟲,獲取網(wǎng)頁源碼,爬取電話號(hào)碼。
本篇教程用我的博客一個(gè)測(cè)試網(wǎng)頁演示。
——野狗菌【希望你能喜歡】
測(cè)試頁面:
https://www.wayteam.xyz/archives/phonenumber
源代碼:(注釋寫的很詳細(xì)了,太艱難,就直接放代碼,不做多解釋了)
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
?
/**
* @author 野狗菌
* 2020-04-06
* 爬蟲入門(一):獲取網(wǎng)頁源代碼,爬取手機(jī)號(hào)碼
* 微信公眾號(hào):希望你能喜歡 (也可以搜索 foryouway )
* 個(gè)人網(wǎng)站:www.wayteam.xyz
*/
public class GetPhoneNumber {
?
public static void main(String[] args) throws Exception {
?
?
?
//創(chuàng)建一個(gè)要訪問的url
URL url = new URL("https://www.wayteam.xyz/archives/phonenumber");//這里以我的博客測(cè)試頁面為例
?
System.out.println("正在獲取"+url+"網(wǎng)站的手機(jī)號(hào)碼中-----請(qǐng)稍等");//無關(guān)緊要的代碼,只是為了友好的提示
?
//打開上面獲取的鏈接
URLConnection urlConnection = url.openConnection(); //新手提醒:這個(gè)會(huì)拋出異常,我為了方便,全部拋出去,不作處理throws Exception
?
//創(chuàng)建一個(gè)指定的存儲(chǔ)文件
File file = new File("phone.txt"); //這里是相對(duì)路徑,表示存在這個(gè)同級(jí)目錄下
//創(chuàng)建一個(gè)字符輸出流(從本程序輸出到phone.txt文件)
PrintWriter printWriter = new PrintWriter(file);//程序執(zhí)行到這里就會(huì)在對(duì)應(yīng)位置創(chuàng)建對(duì)應(yīng)文件了
?
//創(chuàng)建一個(gè)輸入流(這個(gè)輸入輸出是以本程序?yàn)閰⒄?
InputStream inputStream = urlConnection.getInputStream();
?
//把上面的字節(jié)流轉(zhuǎn)化為字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
?
//把字符流轉(zhuǎn)化為字符緩沖流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
?
//創(chuàng)建一個(gè)空的字符串來接收從字符緩沖流里接收的數(shù)據(jù)
String htmlLine = null;
?
//手機(jī)號(hào)碼的正則表達(dá)式,用來匹配數(shù)據(jù)中的手機(jī)號(hào)碼
String regex = "1[35789]\\d{9}";//1:第一位是1,[35789]:第二位是35789中的一個(gè),\d{9}:剩余9位數(shù)任意(因?yàn)閖ava中\(zhòng)需要轉(zhuǎn)義,所以這里用\\)。
Pattern pattern = Pattern.compile(regex);//把正則表達(dá)式編譯成模式。
?
//用while遍歷上面的到的字緩沖流,把值給上面的空字符串(readLine是一行一行讀取網(wǎng)頁源代碼的)
while ((htmlLine = bufferedReader.readLine()) != null){ //當(dāng)字符流緩沖流沒有為空時(shí),一直讀取它。
?
//創(chuàng)建一個(gè)匹配器來匹配上面的正則表達(dá)式模式
Matcher matcher = pattern.matcher(htmlLine);
?
//循環(huán)匹配
while (matcher.find()){ //當(dāng)匹配成功時(shí),往下執(zhí)行
printWriter.println(matcher.group());//將匹配的數(shù)據(jù)用group轉(zhuǎn)化為字符串,寫進(jìn)字符輸出流中
}
?
?
?
?
/**
* 在控制臺(tái)打印htmlLine,觀察它是什么樣的數(shù)據(jù)
* 為了方便大家理解readLine執(zhí)行過程,給進(jìn)程設(shè)置一個(gè)休眠時(shí)間,不然數(shù)據(jù)嘩啦一下直接出來
* 這里我錄制了一個(gè)動(dòng)圖,大家也可以自己試試。
*/
/*System.out.println(htmlLine);
Thread.sleep(100);//100毫秒*/
?
?
}
?
/**
* 關(guān)閉這兩個(gè)流
*/
bufferedReader.close();
printWriter.close();
?
System.out.println("獲取號(hào)碼成功,快去"+file+"查看結(jié)果吧"+"\n"+"-------by野狗菌\uD83D\uDC36");//無關(guān)緊要的代碼,只是為了友好的提示
}
?
}
一個(gè)演示:
結(jié)果展示:
問題:為什么這里獲取的手機(jī)號(hào)碼比我網(wǎng)頁里面寫的要多?
因?yàn)檫@些數(shù)據(jù)被我的匹配器匹配成號(hào)碼了。。。。
后面會(huì)介紹其他抓取方式,可以避免這個(gè)問題。
** **
** **
** **
在公眾號(hào)內(nèi)發(fā)送【07】,即可獲取源碼(你也可以直接自己創(chuàng)建項(xiàng)目,把上面內(nèi)容寫進(jìn)去)。
總結(jié)
以上是生活随笔為你收集整理的java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 压缩gz_如何在Java中将.
- 下一篇: matlab求偏微分方程程序,用MATL