java抓取网页内容(【每日一题】打开浏览器的开发者模式(F12) )

优采云 发布时间: 2021-10-14 09:16

  java抓取网页内容(【每日一题】打开浏览器的开发者模式(F12)

)

  一、目的:1. 任务

  使用Jsoup抓取京东图书分类页面的图书信息。

  获取目标分类网址如:,3259,3330

  对于给定的书页,抓取每一页的书信息,抓取该分类页的多页直到结束。

  下图是给定目标抓取页面的地址

  ,3259,3330

  

  我们得到的应该是每本书的图书信息,类似于打开网页查看图书信息内容的模拟。

  所以我们直接打开一个item(红框圈出的,暂时把分类页面上的一本书作为一个item),查看一下内容。

  提取的内容就是红框里的这部分:

  

  2.工具和语言

  语言:java

  工具:jsoup-1.7.2.jar

  二、思考

  我们采取这样的思路,

  1.将分类的源码网站保存到本地

  2. 解析出分类页面上的所有书籍(item),得到一个相似item的List集合

  3.根据得到的List集合,遍历循环解析每一页的图书信息,然后匹配到图书信息控制台打印。

  我们将京东图书的抓取抽象为一个类。这个类有一个方法来保存下载的源代码,一个方法来解析分类页面以获取List集合,以及一个解析书页信息的方法。

  三、分析1.将分类的源码网站保存到本地

  将网站的源码下载到本地的方法,可以在本地看到一个文本文件,具体存放网站的当前源码的txt文件。用于解析

  /**

* 将目标html保存到本地中进行解析获得 doc文本对象

* @param htmlUrl 需要下载到本地的网址

* @param toSavePath 需要保存到本地的电脑路径 例如E:\\jd.txt

* @param type 编码方式 UTF-8 或者 GBK 等

* @return

* @throws IOException

*/

public Document getDocFromUrl(String htmlUrl,String toSavePath,String type) throws IOException

{

URL url = new URL(htmlUrl) ;

File file = new File(toSavePath) ;

if(file.exists())

file.delete() ;

file.createNewFile() ;

FileOutputStream fos = new FileOutputStream(file) ;

BufferedReader br = new BufferedReader(

new InputStreamReader(url.openStream(),type)) ;

byte [] b = new byte[1024] ;

String c ;

while(((c = br.readLine())!=null))

{

fos.write(c.getBytes());

}

System.out.println("保存分类html完毕");

Document doc = Jsoup.parse(file,"UTF-8") ;

return doc ;

}

  2.分析分类页面上的所有书籍

  这里就是把如图所示的分类页面中所有item的每个地址解析出来,把它们的地址变成一个List集合。这样就得到了当前页面的所有书名。为分析每本书的信息做铺垫。

  打开浏览器的开发者模式(F12)查看如何解析:

  我们在图书信息列表中不难发现,这些书每一本书都被一个li标签包裹着,而这些书的li标签都被一个ul包裹着,class="gl-warp"。分析完这个,你应该有一个想法。NS。

  在这种情况下,我们首先使用jsoup获取ul标签的内容,然后执行getElementsByTag("li"); ul标签中li标签上的方法,这样我们就可以得到每个li标签的内容,也就是每本书内容的内容。下面两行代码得到li的集合

   Element contentEl = doc.select("ul.gl-warp").first() ;

Elements lis = contentEl.getElementsByTag("li");

  

  书籍的 Elements 元素没有完成,因为我们想要这些书籍的地址,换句话说,我们想要书籍 List。但是如何解析出每本书的地址呢?我们需要打开某个 li 标签才能查看。

  

  也许你一眼就能看到一个地址,没错,就是标签。我们可以再次获取它的href属性值,任性

  怎么做:

  元素titleEl = li.select("div.p-name").first();

  元素 a = titleEl.select("a").first();

  String href = a.attr("href");

  看了这么多后的代码:

  

/**

* 解析每一个图书的页面地址

* @param doc

* @return

*/

public List parseItemUrl(Document doc)

{

//获取页面

Element contentEl = doc.select("ul.gl-warp").first() ;

Elements lis = contentEl.getElementsByTag("li");

for (Element li : lis) {

//for循环的就是每一本书拿到详情地址

Element titleEl = li.select("div.p-name").first() ;

Element a = titleEl.select("a").first() ;

String href = a.attr("href") ;

href = "http:"+href ;

hrefList.add(href) ;

}

return hrefList ;

}

  3.分析一本书

  分析每一本书,根据书籍详情页地址下载详情页源码,使用jsoup进行匹配。可以看到图片高亮的部分就是我们要分析的内容。这也很清楚。我们只需要解析到一个叫做class="parameter2"的标签ul,然后解析里面的每一个li。思路可以遵循前面的解析过程。这里我直接把所有的文字输出为一个文本。每个 li 标签没有循环遍历。你可以关注上一个。

  

   /**

* 解析书本的信息

* @param doc

*/

public void parseContent(Document doc)

{

Element contentEl = doc.getElementById("parameter2") ;

if(contentEl==null)

return ;

Elements lis = contentEl.getElementsByTag("li");

if(lis==null)

return ;

for (Element li : lis) {

String text = li.text() ;

System.out.println("--"+text);

}

}

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线