java抓取网页内容(【每日一题】打开浏览器的开发者模式(F12) )
优采云 发布时间: 2021-10-14 09:16java抓取网页内容(【每日一题】打开浏览器的开发者模式(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);
}
}