java爬虫抓取网页数据(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
优采云 发布时间: 2021-12-25 23:07java爬虫抓取网页数据(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
工具类的实现比较简单,只是一个get方法,读取请求地址的响应内容,这里我们是用来爬取网页内容的,这里没有代理,在真正的爬取过程中,当你请求一个大量的在一个网站的情况下,对方会有一系列的策略来禁用你的请求。这时候代理就派上用场了。通过代理设置不同的IP来抓取数据。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils {
public static String get(String url) {
try {
URL getUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) getUrl
.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "*/*");
connection
.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA)");
connection.setRequestProperty("Accept-Language", "zh-cn");
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
String line;
StringBuffer result = new StringBuffer();
while ((line = reader.readLine()) != null){
result.append(line);
}
reader.close();
return result.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
接下来我们找一个有图片的网页,试试爬取功能
public static void main(String[] args) {
String url = "https://www.toutiao.com/a6568327638044115460/";
String html = HttpUtils.get(url);
List imgUrls = getImageSrc(html);
for (String imgSrc : imgUrls) {
System.out.println(imgSrc);
}
}
public static List getImageSrc(String html) {
// 获取img标签正则
String IMGURL_REG = "]*?>";
// 获取src路径的正则
String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";
Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);
List listImgUrl = new ArrayList();
while (matcher.find()) {
Matcher m = Pattern.compile(IMGSRC_REG).matcher(matcher.group());
while (m.find()) {
listImgUrl.add(m.group().substring(0, m.group().length() - 1));
}
}
return listImgUrl;
}
先抓取网页内容,然后正常解析出网页的标签,再解析img地址。执行程序我们可以得到如下内容:
http://p9.pstatp.com/large/pgc-image/1529307883634343f939c85
http://p1.pstatp.com/large/pgc-image/1529307883606177aaf408b
http://p3.pstatp.com/large/pgc-image/152930788361571655944eb
http://p1.pstatp.com/large/pgc-image/1529307883500ad4375beb0
http://p3.pstatp.com/large/pgc-image/1529307883536bc68e6156e
通过上面的地址,我们可以将图片下载到本地。下面我们写一个图片下载方法:
public static void main(String[] args) throws MalformedURLException, IOException {
String url = "https://www.toutiao.com/a6568327638044115460/";
String html = HttpUtils.get(url);
List imgUrls = getImageSrc(html);
for (String imgSrc : imgUrls) {
Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));
}
}
这样就很简单的实现了一个抓图和提取图片的功能。好像比较麻烦。如果你需要写正则,我给你介绍一个更简单的方法。如果您熟悉 jQuery,则可以提取元素。很简单,这个框架就是Jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
添加jsoup的依赖:
org.jsoup
jsoup
1.11.3
使用jsoup后提取的代码只需要简单的几行:
public static void main(String[] args) throws MalformedURLException, IOException {
String url = "https://www.toutiao.com/a6568327638044115460/";
String html = HttpUtils.get(url);
Document doc = Jsoup.parse(html);
Elements imgs = doc.getElementsByTag("img");
for (Element img : imgs) {
String imgSrc = img.attr("src");
if (imgSrc.startsWith("//")) {
imgSrc = "http:" + imgSrc;
}
Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));
}
}
通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag方法提取所有图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。
Jsoup 使用起来非常简单。当然,还有很多其他的用于解析网页的操作。您可以查看信息并学习。
我们再升级一下,做一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后自动下载图片,我们就可以用swing来写界面了。
public class App {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setResizable(false);
frame.setSize(425,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.setLocationRelativeTo(null);
JTextField jTextField = new JTextField();
jTextField.setBounds(100, 44, 200, 30);
frame.add(jTextField);
JButton jButton = new JButton("提取");
jButton.setBounds(140, 144, 100, 30);
frame.add(jButton);
frame.setVisible(true);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String url = jTextField.getText();
if (url == null || url.equals("")) {
JOptionPane.showMessageDialog(null, "请填写抓取地址");
return;
}
String html = HttpUtils.get(url);
Document doc = Jsoup.parse(html);
Elements imgs = doc.getElementsByTag("img");
for (Element img : imgs) {
String imgSrc = img.attr("src");
if (imgSrc.startsWith("//")) {
imgSrc = "http:" + imgSrc;
}
try {
Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
JOptionPane.showMessageDialog(null, "抓取完成");
}
});
}
}
执行 main 方法后的第一件事是我们的接口,如下所示:
截图 2018-06-18 09.50.34 PM.png
截图 2018-06-18 09.50.34 PM.png
输入地址,点击提取按钮下载图片。
课程推荐
大数据时代,如何形成大数据。
大量的用户,每天大量的日志。
搭建爬虫,抓取数十亿条数据进行分析分析。
不仅仅是 Python 可以做爬虫,Java 仍然可以做。
今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来
图片
图片
本课程将带领你一步一步写一个爬虫程序,向下爬取到我们想要的数据,不登录或者需要登录。
课程大纲
图片