爬虫功能实现.doc
《爬虫功能实现.doc》由会员分享,可在线阅读,更多相关《爬虫功能实现.doc(26页珍藏版)》请在沃文网上搜索。
1、1、 页面解析技术 练习:进入当当网中的任意一个商品列表页面:(将这个页面的链接取得,分析链接地址为商品详细信息页的内容保留下来这种链接有以下特点:1) 网址中会有 2) 网址最后会以 数字.html 结尾将这些链接提取到某个集合中保存。public class DangdangDemo private static List allLinks = new ArrayList();private static Set allOverLinks = new HashSet();public static void main(String args) throws Exception / 先去完成
2、将所有链接提取出来的功能URL url = new URL(URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is);String line = null;Pattern p = Ppile(a .*href=.*);while (line = reader.readLine() != null) Matcher m = p.matcher(line);w
3、hile (m.find() String link = m.group();link = link.substring(link.indexOf(href=) + 6);link = link.substring(0, link.indexOf();/ 判断是否包含if (link.startsWith(http) & link.contains() / 截取出最后一段的内容String temp = link.substring(link.lastIndexOf(/) + 1);/ 由于正则表达式中 . 表示任意字符,因此如果想让 . 只表示 .,就需要对其进行转义if (temp.mat
4、ches(d+.html) allLinks.add(link);reader.close();对集合中的所有链接地址的网页内容进行分析,提取出里面的商品名称和价格。商品名称可以找 h1 中的文字内容商品价格可以找 中的内容。同样将数据也保存到文本文件中来进行处理。package org.liky.test;import java.io.BufferedReader;import java.io.File;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import .
5、URL;import .URLConnection;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;import java.util.regex.Matcher;import java.util.regex.Pattern;public class DangdangDemo private static List allLinks = new ArrayList();private static Set allOverLinks = new HashSe
6、t();public static void main(String args) throws Exception / 先去完成将所有链接提取出来的功能URL url = new URL(URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is);String line = null;Pattern p = Ppile(a .*href=.*);while
7、(line = reader.readLine() != null) Matcher m = p.matcher(line);while (m.find() String link = m.group();link = link.substring(link.indexOf(href=) + 6);link = link.substring(0, link.indexOf();/ 判断是否包含if (link.startsWith(http) & link.contains() / 截取出最后一段的内容String temp = link.substring(link.lastIndexOf(
8、/) + 1);/ 由于正则表达式中 . 表示任意字符,因此如果想让 . 只表示 .,就需要对其进行转义if (temp.matches(d+.html) allLinks.add(link);reader.close();getDangdangData();public static void getDangdangData() throws Exception / 提取出一个链接进行处理if (allLinks.size() 0) String urlStr = allLinks.get(0);allLinks.remove(0);if (!allOverLinks.contains(ur
9、lStr) / 同样需要读取网页的内容URL url = new URL(urlStr);URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is, UTF-8);String line = null;Pattern pTitle = Ppile(.*);Pattern pPrice = Ppile(.*);/ 不再一行一行的进行匹配,而是将整个网页的所有代
10、码内容放到一个字符串中进行匹配。/ 准备一个大的字符串,保存网页所有的源代码内容StringBuilder allContent = new StringBuilder();while (line = reader.readLine() != null) / 只需要将line中的内容拼接到allContent里即可allContent.append(line);reader.close();Matcher mTitle = pTitle.matcher(allContent.toString();Matcher mPrice = pPrice.matcher(allContent.toStri
11、ng();String title = null;if (mTitle.find() title = mTitle.group();title = title.substring(title.indexOf() + 1);title = title.substring(0, title.indexOf() + 1);price = price.substring(0, price.indexOf();System.out.println(price);/ 我们发现,这里爬取的规则,不能直接看页面源代码来设计,而需要通过读取到的源代码进行规划。/ 读取到的源代码与看到的源代码不同的原因可能是以下
12、两种:/ 1:爬取的信息过多,导致网站将你的信息屏蔽或加密后返回/ 2:通过爬虫访问网页时,网站认为你是通过手机访问的,而且网页还做了移动端的规划,所以返回的是手机看到的信息。/ 最后将内容保存到文本中。String fileName = System.currentTimeMillis() + .txt;PrintWriter writer = new PrintWriter(new File(D:/web_data/ + fileName);writer.println(title);writer.println(price);writer.print(urlStr);writer.clo
13、se();/ 将该链接设置为已经访问过的链接allOverLinks.add(urlStr);/ 需要重新调用这个方法,直到所有的链接都处理完成getDangdangData();1.1、HTMLParser解析网页内容HTMLParser是一个第三方提供的Java扩展库,专门针对HTML内容进行解析的。通过这个库,可以实现按照给定的条件,解析网页内容的功能。这里主要包含的类如下:1) Parser:解析的核心类2) Filter:设置解析条件3) Node:解析出的HTML节点。先从网上下载一个开发包。并解压缩。将lib目录下的支持jar包导入到自己的项目里,建立直接拷贝到项目的lib目录下
14、,来方便自己使用。同时,将这些jar包加入到build path中。之后我们如果想解析HTML内容时,就可以建立一个Parser对象,来准备解析了。public class DangdangDemoHTMLParser private static List allLinks = new ArrayList();private static Set allOverLinks = new HashSet();public static void main(String args) throws Exception / 先去完成将所有链接提取出来的功能URL url = new URL(URLCo
15、nnection conn = url.openConnection();InputStream is = conn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(is);String line = null;Pattern p = Ppile(a .*href=.*);while (line = reader.readLine() != null) Matcher m = p.matcher(line);while (m.find() String link = m.grou
16、p();link = link.substring(link.indexOf(href=) + 6);link = link.substring(0, link.indexOf();/ 判断是否包含if (link.startsWith(http) & link.contains() / 截取出最后一段的内容String temp = link.substring(link.lastIndexOf(/) + 1);/ 由于正则表达式中 . 表示任意字符,因此如果想让 . 只表示 .,就需要对其进行转义if (temp.matches(d+.html) allLinks.add(link);re
17、ader.close();getDangdangData();public static void getDangdangData() throws Exception / 提取出一个链接进行处理if (allLinks.size() 0) try String urlStr = allLinks.get(0);allLinks.remove(0);if (!allOverLinks.contains(urlStr) / 同样需要读取网页的内容URL url = new URL(urlStr);URLConnection conn = url.openConnection();String t
18、itle = null;String price = null;/ 建立解析的核心对象ParserParser parser = new Parser(conn);parser.setEncoding(UTF-8);/ 建立解析规则/ 先找到TagNameFilter titleFilter = new TagNameFilter(article);/ 进行规则的解析Node titleNode = parser.parse(titleFilter).elementAt(0);/ 读取节点中的文本内容title = titleNode.toHtml();System.out.println(t
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 爬虫 功能 实现