网络爬虫是搜索引擎的一个重要的部分。爬虫的根本原理就是下载页面,然后进行解析。Web上的存储着海量数据,怎么样才能将海量数据尽快的下载到本机上?这是网络爬虫设计的一个方案。采取多线程技术。以下代码实现了将网页的数据存储到XML文档。希望能提出更好的方案。
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import java.util.*;
- import java.io.*;
- import com.heaton.bot.*;
- import org.w3c.dom.*;
- import org.cyberneko.html.parsers.*;
- import org.xml.sax.*;
- import org.apache.html.dom.*;
- import javax.xml.parsers.*;
- import javax.xml.transform.*;
- import javax.xml.transform.dom.*;
- import javax.xml.transform.stream.*;
- /**
- * 网络爬虫,通过深度优先算法将互联网上的网页下载解析。经过测试,能正常运行!
- */
- public class mySpider extends JFrame implements ISpiderReportable {
- /**
- * @param args
- */
- Spider _Spider = null;
- Document doc = null;
- int _pagesCount;
- public mySpider(){
- setTitle("网络爬虫之Spider");
- getContentPane().setLayout(null);
- setSize(405,268);
- setVisible(false);
- D.setHorizontalTextPosition(
- SwingConstants.LEFT);
- D.setVerticalTextPosition(
- SwingConstants.TOP);
- D.setVerticalAlignment(
- SwingConstants.TOP);
- D.setText("下载的页面数目: ");
- getContentPane().add(D);
- D.setBounds(12,12,384,24);
- JLabel2.setText("URL:");
- getContentPane().add(JLabel2);
- JLabel2.setBounds(12,36,36,24);
- getContentPane().add(_url);
- _url.setBounds(48,36,348,24);
- JLabel3.setText("选择存储XML文档的目录:");
- getContentPane().add(JLabel3);
- JLabel3.setBounds(12,72,384,24);
- getContentPane().add(_save);
- _save.setBounds(12,96,384,24);
- _go.setText("GO!");
- getContentPane().add(_go);
- _go.setBounds(96,228,216,24);
- getContentPane().add(_current);
- _current.setBounds(12,204,384,12);
- JLabel4.setText("Number of pages:");
- getContentPane().add(JLabel4);
- JLabel4.setBounds(12,180,120,12);
- _pages.setText("0");
- getContentPane().add(_pages);
- _pages.setBounds(120,180,108,12);
- JLabel6.setText("选择Log,当前需要保存的日志:");
- getContentPane().add(JLabel6);
- JLabel6.setBounds(12,120,384,24);
- _logPath.setText("./Spider.log");
- getContentPane().add(_logPath);
- _logPath.setBounds(12,144,384,24);
- _go.setActionCommand("jbutton");
- SymAction lSymAction = new SymAction();
- _go.addActionListener(lSymAction);
- SymWindow aSymWindow = new SymWindow();
- this.addWindowListener(aSymWindow);
- try{
- DOMImplementation domImpl = DocumentBuilderFactory
- .newInstance().newDocumentBuilder().getDOMImplementation();
- doc = domImpl.createDocument(null,"spider",null);
- }catch(ParserConfigurationException e){
- e.printStackTrace();
- }catch(DOMException e){
- e.printStackTrace();
- }
- }
- public void setVisible(boolean b){
- if(b)
- setLocation(50,50);
- super.setVisible(b);
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- (new mySpider()).setVisible(true);
- }
- public void addNotify(){
- Dimension size = getSize();
- super.addNotify();
- if(frameSizeAdjusted)
- return;
- frameSizeAdjusted = true;
- Insets insets = getInsets();
- JMenuBar menuBar = getRootPane().getJMenuBar();
- int menuBarHeight = 0;
- if(menuBar!=null)
- menuBarHeight = menuBar.getPreferredSize().height;
- setSize(insets.left+
- insets.right+
- size.width,
- insets.top+
- insets.bottom+
- size.height+menuBarHeight);
- }
- boolean frameSizeAdjusted = false;
- JLabel D = new JLabel();
- JLabel JLabel2 = new JLabel();
- JTextField _url = new JTextField();
- JLabel JLabel3 = new JLabel();
- JTextField _save = new JTextField();
- JButton _go = new JButton();
- JLabel _current = new JLabel();
- JLabel JLabel4 = new JLabel();
- JLabel _pages = new JLabel();
- JLabel JLabel6 = new JLabel();
- JTextField _logPath = new JTextField();
- class SymAction implements ActionListener{
- public void actionPerformed(ActionEvent event){
- Object object = event.getSource();
- if(object == _go)
- Go_actionPerformed(event);
- }
- }
- protected void processFile(HTTP file){
- try{
- if(_save.getText().length()>0){
- int i=file.getURL().lastIndexOf('/');
- if(i!=-1){
- int iPoint = file.getURL().lastIndexOf('.');
- String extendName = file.getURL().substring(iPoint+1);
- if(extendName.equals("html") || extendName.equals("htm") || extendName.equals("shtml")){
- String fileBody = new String(file.getBody().getBytes("iso-8859-1"),"GBK");
- DOMFragmentParser parser = new DOMFragmentParser();
- DocumentFragment node =
- new HTMLDocumentImpl().createDocumentFragment();
- try {
- parser.setProperty("http://cyberneko.org/html/properties/default-encoding","GBK");
- parser.parse(new InputSource(new ByteArrayInputStream(fileBody.getBytes())), node);
- }catch (IOException e) {
- e.printStackTrace();
- }catch (SAXException e) {
- e.printStackTrace();
- }
- StringBuffer sb = new StringBuffer();
- getText(sb, node, "title");
- String title = sb.toString();
- sb.setLength(0);
- getText(sb, node,"body");
- String text = sb.toString();
- text = text.replaceAll("<","<")
- .replaceAll(">",">");
- if(title.length()!=0 && text.length()!=0)
- addElementNode(doc,title,text,file.getURL());
- }
- }
- }
- }catch(Exception e){
- Log.logException("Can't save output file: ",e);
- }
- }
- private Element createTitleElement(Document docs,String title){
- Element titleElement = docs.createElement("TITLE");
- titleElement.setTextContent(title);
- return titleElement;
- }
- private Element createBodyElement(Document docs,String body){
- Element bodyElement = docs.createElement("BODY");
- bodyElement.setTextContent(body);
- return bodyElement;
- }
- private Element createURLElement(Document docs,String URL){
- Element URLElement = docs.createElement("URL");
- URLElement.setTextContent(URL);
- return URLElement;
- }
- public void addElementNode(Document docs,String title,String body,String URL){
- Element HTMLElement = docs.createElement("HTMLPAPER");
- HTMLElement.appendChild(createTitleElement(docs,title));
- HTMLElement.appendChild(createBodyElement(docs,body));
- HTMLElement.appendChild(createURLElement(docs,URL));
- docs.getDocumentElement().appendChild(HTMLElement);
- }
- private void getText(StringBuffer sb, Node node) {
- if (node.getNodeType() == Node.TEXT_NODE) {
- sb.append(node.getNodeValue());
- }
- NodeList children = node.getChildNodes();
- if (children != null) {
- int len = children.getLength();
- for (int i = 0; i < len; i++) {
- getText(sb, children.item(i));
- }
- }
- }
- private boolean getText(StringBuffer sb, Node node,
- String element) {
- if (node.getNodeType() == Node.ELEMENT_NODE) {
- if (element.equalsIgnoreCase(node.getNodeName())) {
- getText(sb, node);
- }
- }
- NodeList children = node.getChildNodes();
- if (children != null) {
- int len = children.getLength();
- for (int i = 0; i < len; i++) {
- if (getText(sb, children.item(i), element)) {
- return true;
- }
- }
- }
- return false;
- }
- void Go_actionPerformed(ActionEvent event){
- IWorkloadStorable wl = new SpiderInternalWorkload();
- if(_Spider!=null){
- Runnable doLater = new Runnable(){
- public void run(){
- _go.setText("Canceling...");
- }
- };
- SwingUtilities.invokeLater(doLater);
- _Spider.halt();
- return;
- }
- try{
- if(_url.getText().length()>0){
- HTTPSocket http = new HTTPSocket();
- http.send(_url.getText(),null);
- }else{
- _current.setText("<<distributed mode>>");
- }
- }catch(Exception e){
- JOptionPane.showMessageDialog(this,e,"Error",JOptionPane.OK_CANCEL_OPTION,null);
- return;
- }
- Runnable doLater = new Runnable(){
- public void run(){
- _go.setText("Cancel");
- _current.setText("Loading...");
- }
- };
- SwingUtilities.invokeLater(doLater);
- _pagesCount = 0;
- if(_logPath.getText().length()>0){
- File file = new File(_logPath.getText());
- file.delete();
- Log.setLevel(Log.LOG_LEVEL_NORMAL);
- Log.setFile(true);
- Log.setConsole(false);
- Log.setPath(_logPath.getText());
- }
- try{
- wl = new SpiderSQLWorkload(
- "sun.jdbc.odbc.JdbcOdbcDriver",
- "jdbc:odbc:WORKLOAD");
- }catch(Exception e){
- JOptionPane.showMessageDialog(this,
- e,
- "Error",
- JOptionPane.OK_CANCEL_OPTION,
- null);
- }
- _Spider = new Spider(this,
- _url.getText(),
- new HTTPSocket(),
- 100,
- wl);
- _Spider.setMaxBody(200);
- _Spider.start();
- }
- public boolean foundInternalLink(String url){
- return true;
- }
- public boolean foundExternalLink(String url){
- return false;
- }
- public boolean foundOtherLink(String url){
- return false;
- }
- class UpdateTarget implements Runnable{
- public String _t;
- public void run(){
- _current.setText(_t);
- _pages.setText(""+_pagesCount);
- }
- }
- public void processPage(HTTP page){
- _pagesCount++;
- UpdateTarget ut = new UpdateTarget();
- ut._t = page.getURL();
- SwingUtilities.invokeLater(ut);
- processFile(page);
- }
- public void completePage(HTTP page, boolean error){
- }
- public boolean getRemoveQuery(){
- return true;
- }
- public void spiderComplete(){
- if(_Spider.isHalted()){
- JOptionPane.showMessageDialog(this,
- "下载正在被取消...... "+
- "请检查日志的错误!.",
- "完成下载!",
- JOptionPane.OK_CANCEL_OPTION,
- null);
- }else{
- JOptionPane.showMessageDialog(this,
- "下载完成..... "+
- "请检查日志的错误!.",
- "完成下载!",
- JOptionPane.OK_CANCEL_OPTION,
- null);
- }
- DOMSource doms = new DOMSource(doc);
- File f = new File(_save.getText(),"HTMLPraser.xml");
- StreamResult sr = new StreamResult(f);
- try{
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer t = tf.newTransformer();
- Properties properties = t.getOutputProperties();
- properties.setProperty(OutputKeys.ENCODING,"GBK");
- properties.setProperty(OutputKeys.INDENT,"yes");
- t.setOutputProperties(properties);
- t.transform(doms,sr);
- }catch(TransformerConfigurationException tce){
- tce.printStackTrace();
- }catch(TransformerException te){
- System.out.println("转换错误..../n-------");
- te.printStackTrace();
- }
- _Spider = null;
- Runnable doLater = new Runnable(){
- public void run(){
- _go.setText("GO!!");
- }
- };
- SwingUtilities.invokeLater(doLater);
- }
- class SymWindow extends WindowAdapter{
- public void windowClosed(WindowEvent event){
- Object object = event.getSource();
- if(object==mySpider.this)
- GetSite_windowClosed(event);
- }
- }
- void GetSite_windowClosed(WindowEvent event){
- System.exit(0);
- }
- }
- <font color="#000000">以上是网络爬虫的代码。需要导入第三方包,可以在Eclipse环境下开发。但是本人</font>
- <font color="#000000">配置环境变量,直接在记事本中开发。第三方包可以在网上下载。也可以向我索取。</font>
- <font color="#000000">留下个人E-mail即可。</font>
相关推荐
网络爬虫,也被称为Web Spider或Web Crawler,是一种自动浏览互联网并收集信息的程序。在信息技术领域,网络爬虫是数据挖掘的重要工具,广泛应用于搜索引擎优化、市场分析、社交媒体监控、网站性能评估等多个场景。 ...
商剑分布式网络蜘蛛,性能高速运转,能耗尽全部带宽,可批量采集海量数据的网页,若几百台服务器安装商剑...更是搜索引擎-网络蜘蛛-网络爬虫-spider-网页抓取等技术的必备工具之一。http://www.100spider.cn/wspider.rar
网络爬虫,也被称为蜘蛛(Spider),是互联网上一种自动浏览和抓取网页信息的程序。它是搜索引擎背后的重要技术之一,也是数据挖掘和数据分析的重要工具。通过网络爬虫,我们可以批量获取网页上的文本、图片、视频等...
在"spider"这个项目中,你可以通过以上知识点,构建一个基本的C++网络爬虫,它将按照广度优先搜索的策略,从给定的起始URL开始,遍历并抓取相关的网页。在实际开发过程中,还需要根据具体需求进行扩展,如实现更复杂...
【标题】"Spider_java.zip" 是一个包含Java实现的网络爬虫项目的压缩包,主要针对搜索引擎数据抓取。这个项目的核心在于使用Java编程语言来构建一个能够自动化浏览网页、解析HTML内容并收集所需信息的程序。网络爬虫...
本篇文章《Python入门网络爬虫之精华版》主要介绍了Python网络爬虫的基础知识,从抓取、分析到存储的三个主要方面,以及如何应对一些常见的反爬虫机制。此外,还提及了Scrapy这一流行的爬虫框架,并提供了一个参考...
其次,HTML解析是网络爬虫的核心功能之一。抓取到的网页源代码通常为HTML格式,需要解析出有价值的信息,如链接、文本内容等。可以使用开源的HTML解析库,如pugixml或者TinyXML,它们能帮助我们解析DOM树,查找特定...
什么是网络爬虫(Spider)程序 Spider又叫WebCrawler或者Robot,是一个沿着链接漫游Web 文档集合的程序。它一般驻留在服务器上,通过给定的一些URL,利用HTTP等标准协议读取相应文档,然后以文档中包括的所有未访问...
关键词"python爬虫"和"spider_源码"暗示我们这里将深入探讨Python编程语言中的网络爬虫技术,特别是针对微博平台的数据抓取。这个压缩包包含了一个名为"weibo_spider.py"的Python源代码文件,这意味着我们将分析这个...
【标题】: "关于spider网络爬虫的程序,用于搜索" 网络爬虫,或称为“蜘蛛”(Spider),是互联网上的一种自动化程序,它的主要任务是遍历Web页面,抓取并存储网页内容,以便进行后续的数据分析或构建搜索引擎。在...
本资源包“从零开始学Python网络爬虫_源代码”提供了学习爬虫技术的基础,特别关注了Spider框架及其在爬虫内容处理中的应用。在这里,我们将深入探讨Python爬虫的关键概念和实践技巧。 首先,理解什么是网络爬虫至...
- **项目背景**:随着互联网数据的爆炸性增长,网络爬虫技术成为了获取互联网公开数据的重要手段之一。本项目py爬虫SinaSpider-master旨在实现对新浪(Sina)网站数据的自动化抓取。 - **项目目标**:通过Python语言...
网络爬虫,也被称为Web Spider或Web Crawler,是一种自动浏览互联网并收集信息的程序。在IT领域,网络爬虫是数据挖掘和信息提取的重要工具,尤其在搜索引擎优化、市场分析、网站监控等方面有着广泛的应用。 爬虫的...
在当前的大数据时代背景下,网络爬虫技术已经成为获取互联网上公开数据的重要手段之一。"py爬虫163spider-master"项目,旨在通过Python语言实现对特定网站的数据抓取,该项目的主要目标是从网易(163)相关的网站上...
本项目提供了一个C++实现的spider网络爬虫源代码,对于搜索引擎研究者和编程初学者来说,是一个宝贵的资源。 **C++编程语言** C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持...