java爬虫抓取网页数据(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)

优采云 发布时间: 2021-12-25 23:07

  java爬虫抓取网页数据(工具类实现比较简单,就一个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 仍然可以做。

  今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来

  

  图片

  图片

  本课程将带领你一步一步写一个爬虫程序,向下爬取到我们想要的数据,不登录或者需要登录。

  课程大纲

  图片

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线