Java爬虫第四篇:使用selenium、Jsoup 抓取图片

短命女 2023-10-10 20:33 61阅读 0赞

系列文章目录

通过Java+Selenium查询某个博主的Top100文章质量分
通过Java+Selenium查询某个博主的Top40文章质量分
通过Java+Selenium查询文章质量分
【在线商城系统】数据来源-爬虫篇
使用selenium、Jsoup 抓取图片
使用Jsoup 抓取文章
准备 chromedriver与chrome


文章目录

  • 系列文章目录
    • 在这里插入图片描述
  • 前言
  • 1、安装依赖
  • 2、Selenium辅助类
  • 3、核心测试代码
    • 3.1、最终效果

" class="reference-link">在这里插入图片描述

前言

通过自动化工具selenium模拟人工浏览器行为,并捕获到html代码,并用Jsoup 处理html代码,提取出其中的图片数据。

1、安装依赖

创建Java maven工程,在pom.xml里引入依赖

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11. <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
  12. <dependency>
  13. <groupId>org.jsoup</groupId>
  14. <artifactId>jsoup</artifactId>
  15. <version>1.11.3</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.seleniumhq.selenium</groupId>
  19. <artifactId>selenium-java</artifactId>
  20. <version>4.9.1</version>
  21. </dependency>

2、Selenium辅助类

包含Chrome WebDriver驱动,图片存储路径,图片下载方法等;

  1. import lombok.extern.slf4j.Slf4j;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8. import java.util.Date;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. /***
  12. * @title SeleniumUtil
  13. * @desctption Selenium辅助类
  14. * @author Kelvin
  15. * @create 2023/5/19 14:28
  16. **/
  17. @Slf4j
  18. public class SeleniumUtil {
  19. public final static String CHROMEDRIVERPATH = "D://java/chrome/chromedriver.exe";
  20. public final static String LOCATION_IMG_BASE_PATH = "D://java//code//carData/img/";
  21. public static void sleep(int m) {
  22. try {
  23. Thread.sleep(m);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. /**
  29. * 文件下载到指定路径
  30. *
  31. * @param urlString 链接
  32. * @throws Exception
  33. */
  34. public static boolean download(String urlString, String parentFile , String key) {
  35. String savePath = SeleniumUtil.LOCATION_IMG_BASE_PATH + parentFile + "/" + key + "/";
  36. String filename = new Date().getTime() + ".png";
  37. try{
  38. // 构造URL
  39. URL url = new URL(urlString);
  40. // 打开连接
  41. URLConnection con = url.openConnection();
  42. //设置请求超时为20s
  43. con.setConnectTimeout(20 * 1000);
  44. //文件路径不存在 则创建
  45. File sf = new File(savePath);
  46. if (!sf.exists()) {
  47. sf.mkdirs();
  48. }
  49. //jdk 1.7 新特性自动关闭
  50. try (InputStream in = con.getInputStream();
  51. OutputStream out = new FileOutputStream(sf.getPath() + "//" + filename)) {
  52. //创建缓冲区
  53. byte[] buff = new byte[1024];
  54. int n;
  55. // 开始读取
  56. while ((n = in.read(buff)) >= 0) {
  57. out.write(buff, 0, n);
  58. }
  59. } catch (Exception e) {
  60. return false;
  61. }
  62. } catch (Exception e) {
  63. return false;
  64. }
  65. log.info("【下载图片成功,本地地址:{}】" , savePath + filename);
  66. return true;
  67. }
  68. /**
  69. * 是否包含中文
  70. * @param str
  71. * @return
  72. */
  73. public static boolean isContainChinese(String str) {
  74. Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
  75. Matcher m = p.matcher(str);
  76. if (m.find()) {
  77. return true;
  78. }
  79. return false;
  80. }
  81. }

3、核心测试代码

大部分网站都是在html文档加载之后,在预定义的div里去异步请求加载数据,因此在打开网页时,需要停顿1-5秒(看网速和网站性能)。

  1. import com.hqyj.cardata.util.SeleniumUtil;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.jsoup.Jsoup;
  4. import org.jsoup.nodes.Document;
  5. import org.jsoup.nodes.Element;
  6. import org.jsoup.select.Elements;
  7. import org.junit.jupiter.api.Test;
  8. import org.openqa.selenium.By;
  9. import org.openqa.selenium.JavascriptExecutor;
  10. import org.openqa.selenium.WebDriver;
  11. import org.openqa.selenium.WebElement;
  12. import org.openqa.selenium.chrome.ChromeDriver;
  13. import org.openqa.selenium.chrome.ChromeOptions;
  14. import org.springframework.boot.test.context.SpringBootTest;
  15. import org.springframework.util.StringUtils;
  16. import java.io.IOException;
  17. @Slf4j
  18. @SpringBootTest
  19. class CarDataApplicationTests {
  20. @Test
  21. void huabanSearchSeleniumData() throws IOException {
  22. log.info("huabanData start!");
  23. String baseUrl = "https://huaban.com/search?q=";
  24. String parentFile = "huaban";
  25. System.setProperty("webdriver.chrome.driver", SeleniumUtil.CHROMEDRIVERPATH );// chromedriver localPath
  26. ChromeOptions chromeOptions = new ChromeOptions();
  27. chromeOptions.addArguments("--remote-allow-origins=*");
  28. chromeOptions.addArguments("–no-sandbox"); //--start-maximized
  29. WebDriver driver = new ChromeDriver(chromeOptions);
  30. String[] searchs = {
  31. "动漫" , "头像" , "情侣" , "AI" , "玫瑰花" , "PPT" , "深圳" , "广州" , "亚洲" , "别墅" , "区域"};
  32. String[] sortSearchName = {
  33. "dm" , "tx" , "ql" , "ai" , "mgh" , "ppt" , "sz" , "gz" , "yz" , "bs" , "qy"};
  34. for (int i = 0; i < searchs.length; i++) {
  35. getHuabanSearchData(driver , baseUrl , searchs[i] , sortSearchName[i] , parentFile );
  36. }
  37. driver.quit();
  38. log.info("huabanData end!");
  39. }
  40. private void getHuabanSearchData(WebDriver driver, String baseUrl , String searchName , String sortName , String parentFile) {
  41. String url = baseUrl + searchName;
  42. driver.get(url);
  43. WebElement mainSelectE = driver.findElement(By.cssSelector("div.kgGJbqsa"));
  44. //等待文档加载(大部分网页都是动态加载)
  45. SeleniumUtil.sleep(2000);
  46. JavascriptExecutor jsDriver = (JavascriptExecutor) driver;//将java中的driver强制转型为JS类型
  47. String js ="window.scrollTo(0, document.body.scrollHeight)";
  48. jsDriver.executeScript(js);
  49. SeleniumUtil.sleep(2000);
  50. //Selenium获取网页内容
  51. //转化为Jsoup文档处理
  52. Document doc = Jsoup.parse( mainSelectE.getAttribute("outerHTML") );
  53. Elements elements = doc.select("a.KGdb7ifV");
  54. log.info("a 元素的长度:{}" , elements.size() );
  55. if(elements!=null&&elements.size()>0) {
  56. for (Element ele : elements) {
  57. String imgPath = ele.select("img.hb-image").attr("src");
  58. if(StringUtils.isEmpty(imgPath) == false) {
  59. log.info("图片地址:{} , 目录:{}" , imgPath , sortName);
  60. SeleniumUtil.download(imgPath , parentFile , sortName );
  61. }
  62. }
  63. }
  64. SeleniumUtil.sleep(500);
  65. }
  66. }

3.1、最终效果

在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,61人围观)

还没有评论,来说两句吧...

相关阅读

    相关 爬虫

    爬虫第四篇 Ajax的动态加载处理方法 对于json格式的相应,如果页面是ajax动态加载的,可用通过设置它的limit(每次页面加载的数量)巧妙的避开, 也可以