网络Spider程序.doc

网络爬虫

收藏

资源目录
跳过导航链接。
网络爬虫.zip
13网工2班吴越面向对象程序设计课程设计安排
网络Spider程序.doc---(点击预览)
学号-姓名-课程设计评分表.doc---(点击预览)
1304032007吴越网络爬虫.doc---(点击预览)
spider
ProcessRecord.txt---(点击预览)
OutUrls.txt---(点击预览)
InUrls.txt---(点击预览)
Errors.txt---(点击预览)
.settings
org.eclipse.jdt.core.prefs
bin
CheckLinks$1.class
CheckLinks$SymAction.class
CheckLinks$UpdateCurrentStats.class
CheckLinks$UpdateErrors.class
CheckLinks$UpdateInUrl.class
CheckLinks$UpdateOutUrl.class
CheckLinks.class
HTMLParse.class
ISpiderReportable.class
Spider$Parser.class
Spider.class
src
CheckLinks.java
HTMLParse.java
ISpiderReportable.java
Spider.java
.classpath
.project
压缩包内文档预览:
预览图 预览图 预览图
编号:35000746    类型:共享资源    大小:259.30KB    格式:ZIP    上传时间:2019-12-25 上传人:遗**** IP属地:湖北
25
积分
关 键 词:
网络 爬虫
资源描述:
网络爬虫,网络,爬虫
内容简介:
合肥学院计算机科学与技术系课程设计报告20162017学年第一学期课程Java课程设计课程设计名称 网络Spider程序专业班级 13网工(2)班姓名吴越指导教师许强 檀明 2016年9月 摘要网络爬虫是一种自动搜集互联网信息的程序。通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息等。本文通过JAVA实现了一个基于广度优先算法的多线程爬虫程序。本论文阐述了网络爬虫实现中一些主要问题:为何使用广度优先的爬行策略,以及如何实现广度优先爬行;为何要使用多线程,以及如何实现多线程;系统实现过程中的数据存储;网页信息解析等。通过实现这一爬虫程序,可以搜集某一站点的URLs,并将搜集到的URLs存入数据库。 【关键字】网络爬虫;JAVA;广度优先;多线程。一、需求分析 随着互联网的飞速发展,网络上的信息呈爆炸式增长。这使得人们在网上找到所需的信息越来越困难,这种情况下搜索引擎应运而生。搜索引擎搜集互联网上数以亿计的网页,并为每个词建立索引。在建立搜索引擎的过程中,搜集网页是非常重要的一个环节。爬虫程序就是用来搜集网页的程序。以何种策略偏历互联网上的网页,也成了爬虫程序主要的研究方向。现在比较流行的搜索引擎,比如google,百度,它们爬虫程序的技术内幕一般都不公开。目前几种比较常用的爬虫实现策略:广度优先的爬虫程序,Repetitive爬虫程序,定义爬行爬虫程序,深层次爬行爬虫程序。此外, 还有根据概率论进行可用Web页的数量估算, 用于评估互联网Web规模的抽样爬虫程序; 采用爬行深度、页面导入链接量分析等方法, 限制从程序下载不相关的Web页的选择性爬行程序等等。爬虫程序是一个自动获取网页的程序。它为搜索引擎从互联网上下载网页,是搜索引擎的重要组成部分。爬虫程序的实现策略,运行效率直接影响搜索引擎的搜索结果。不同的搜索引擎,会根据对搜索结果的不同需求,选择最合适的爬行策略来搜集互联网上的信息。高效,优秀的爬虫程序可以使人们在互联网上寻找到更及时,更准确的信息。实现网络爬虫的重点和难点有:多线程的实现;对临界资源的分配;遍历web图的遍历策略选择和实现;存储数据结构的选择和实现。本文通过JAVA语言实现一个基于广度优先偏历算法的多线程爬虫程序。通过实现此爬虫程序可以定点搜集某一站点的URLs,如果需要搜集其他信息,可以在解析URLs的同时,解析获取相应信息。二. 设计1设计思想:网络蜘蛛即Web Spider 。 是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面 ( 通常是首页)开始。读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个阿站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的喇页都抓取下来。网络蜘蛛实现的流程图如下图所示。终止输入所需访问的URL执行并获取页面内容对Url判断是否符合条件获取页面全部URL把页面内容存入当地磁盘YN 2功能设计1)系统的主要功能包括:根据网络蜘蛛的基本原理设计并实现了web网站下载系统。系统能根据用户输入的URL地址进行整个网站的下载并保存到本地硬盘,通过设置最大链接访问深度来限制访问层数。采用非递归的方式进行web网站的下载,并通过多线程机制来提高系统的运行效率,实现了基于内存的队列管理和网页数据的存储。2)功能祥细介绍Web网站系统下载:当用户输入Url地址,系统会根据其进行整个网站的下载,对于各个网站会有相应的文件夹进行存放,当搜索完毕,我们会发现在程序文件盘中会产生多个文件夹,而每个文件夹的文件名都是根据站点的网址来命名的,例如我们搜索的是百度网站,我们可能会出现不仅仅是百度网站这一个文件夹,可能还有其他网站的文件夹,这是因为在百度页面里可能还有引用网页,即一个网页里面的文件可能是一个别的网站的链接文件。这就说明了为何会出现多个文件夹。就其原因是在本程序中没有对其他网站的过滤,这种过滤是一个复杂的过程,在程序中如果要去实现,那就需要做更大的工作量,例如对于百度网站,有百度贴吧,有百度照片,百度新闻等,虽然Url不是相同,但都属于百度网站的子网站,根据Url的字符串字段进行删选很难去实现,当然确实有方法。我们可以对url字段进行相应方式的比较,如果在这个url中含有baidu这个字段,我们就认定为百度的网站的一部分,这样做只是过滤了一部分,但是并不能完全过滤,因为也有可能别的网站会有如此的网站名如baiduci等这种类似的。我在这里做一个引申的解决方法,本程序中没有考虑。首先,为每个传递进来的变量url中存储的URL构造一个“URLConnection”对象,因为网站上会有多种类型的文档,而“蜘蛛”只对那些包含HTML,尤其是基于文本的文档感兴趣。前述代码是为了确保文档内容以“text/”打头,如果文档类型为非文本,会从等待区移除此URL,并把它添加到已处理区,这也是为了保证不会再次访问此URL。在对特定URL建立连接之后,接下来就要解析其内容了。下面的代码打开了URL连接,并读取内容:InputStream is = connection.getInputStream();Reader r = new InputStreamReader(is); /字符流 reader现在,我们有了一个Reader对象,可以用它来读取此URL的内容,对本文中的“蜘蛛”来说,只需简单地把其内容传递给HTML解析器就可以了。本例中使用的HTML解析器为Swing HTML解析器,其由Java内置,但由于Java对HTML解析的支持力度不够,所以必须重载一个类来实现对HTML解析器的访问,这就是为什么我们要调用“HTMLEditorKit”类中的“getParser”方法。但不幸的是,Sun公司把这个方法置为protected,唯一的解决办法就是创建自己的类并重载“getParser”方法,并把它置为public,这由“HTMLParse”类来实现,请看例4:import javax.swing.text.html.*;public class HTMLParse extends HTMLEditorKit public HTMLEditorKit.Parser getParser()return super.getParser();这个类用在Spider类的“processURL”方法中,我们也会看到,Reader对象会用于读取传递到“HTMLEditorKit.Parser”中网页的内容: /这个地方意思是,所谓的回调方法,就是供别人调用的,当parser的对reader对象进行解析的时候,发现标记或者文本就会去调用回调类的方法去执行相应的动作readerHTMLEditorKit.Parser parse = new HTMLParse().getParser();parse.parse(r,new Parser(url),true);请留意,这里又构造了一个新的Parser类,这个Parser类是一个Spider类中的内嵌类,而且还是一个回调类,它包含了对应于每种HTML tag将要调用的特定方法。在本文中,我们只需关心两类回调函数,它们分别对应一个简单tag(即不带结束tag的tag,如)和一个开始tag,这两类回调函数名为“handleSimpleTag”和“handleStartTag”。因为每种的处理过程都是一样的,所以“handleStartTag”方法仅是简单地调用“handleSimpleTag”,而“handleSimpleTag”则会负责从文档中取出超链接,这些超链接将会用于定位“蜘蛛”要访问的其他页面。在当前tag被解析时,“handleSimpleTag”会检查是否存在一个“href”或超文本引用:String href = (String)a.getAttribute(HTML.Attribute.HREF);if( (href=null) & (t=HTML.Tag.FRAME) )href = (String)a.getAttribute(HTML.Attribute.SRC);if ( href=null )return;如果不存在“href”属性,会继续检查当前tag是否为一个Frame,Frame会使用一个“src”属性指向其他页面,一个典型的超链接通常为以下形式:上面链接中的“href”属性指向其链接到的页面,但是“linkedpage.html”不是一个地址,它只是指定了这个Web服务器上一个页面上的某处,这称为相对URL,相对URL必须被解析为绝对URL,而这由以下代码完成:URL url = new URL(base,str);这又会构造一个URL,str为相对URL,base为这个URL上的页面,这种形式的URL类构造函数可构造一个绝对URL。在URL变为正确的绝对形式之后,通过检查它是否在等待区,来确认此URL是否已经被处理过。如果此URL没有被处理过,它会添加到等待区,之后,它会像其他URL一样被处理。三. 调试及测试1、调试过程中遇到的主要问题及解决方法 本系统采用非递归的方式去构造spider程序,它采用不调用自身的方法,该方式适合于大型网站的下载。同时运用多线程的技术,极大的提高了系统的运行效率。通过对系统的使用,可以把我们想要查看的网站下载到本地硬盘,进行离线浏览。但是系统也存在一些不足之处,有待进一步完善:1、本系统可以下载全部的静态网页,以及大部分的动态网页,但是不能下载一些难于处理的脚本语言(如VBScript和javascript)生成的网页。如果要完善的处理好这些网页,网络蜘蛛需要有自己的脚本解释程序。对于许多数据是放在数据库的网站,需要通过本网站的数据库搜索才能获得信息,这些给网络蜘蛛的抓取带来很大的困难。2、程序搜索完毕,本程序中会对其他网站的过滤,这种过滤是一个复杂的过程,在程序中如果要去实现,那就需要做更大的工作量,例如对于百度网站,有百度贴吧,有百度照片,百度新闻等,虽然Url不是相同,但都属于百度网站的子网站,根据Url的字符串字段进行删选很难去实现,当然确实有方法。我们可以对url字段进行相应方式的比较,如果在这个url中含有baidu这个字段,我们就认定为百度的网站的一部分,这样做只是过滤了一部分,但是并不能完全过滤,因为也有可能别的网站会有如此的网站名如baiduci等这种类似的2、测试数据集1)开始测试数据的时候在网址一栏输入 ,点击“begin”的按钮,即可进行搜索,并且在网站设置搜索深度,默认是20,都可以进行设置,深度就是搜索树有20层,同时可以设置网页文件大小,当大于设置size时不会再向下遍历,设置文件类型为text。如:2)点击开始“begin”之后,会搜索一系列的网站,即可出现下面的页面,可以查看到已经搜索到的网站,网络爬虫所“爬过”的网址:3) 采用JAVA的I/O编程技术,可以将网页数据存储在本地硬盘中,在本地磁盘D新建文件夹“xx”,将下载下来的网页内容以txt的文件类型保存。4)最后一步,点击按钮,即可结束程序运行。四、经验和体会。这篇报告实现了一个基于广度优先策略的网络爬虫程序,可以搜集互联网URLs。但是在功能细节上还有很多不足,比如系统不够优化,功能不够强大,没有解析网页信息。对于网络爬虫这个庞大的知识体系来说,这篇论文实现的功能只能算一些皮毛。要深刻地理解爬虫程序,在爬虫程序设计中有所作为,还需要长达几年,或者更长时间的积累。所以在以后的时间,我将继续研究网络爬虫技术。分析设计一些比较复杂的爬行策略,优化爬虫程序。希望在这一课题上达到另一个高度。我花费了近两个多星期的时间,查阅了许多相关的资料,并且和同组成员很好的讨论了此程序的相关问题,并上网查询了很多不懂得问题,终于完成了网络Spider程序。程序已经基本实现了该课程设计的基本要求。在本次课程设计的过程中了解到自己的知识还是比较有限,这也更肯定了自己再以后学习编程的道路上的坚定不移,同时也让我懂得同组合作的重要性。但由于只学习了一个学期的Java语言,自己水平有限,使得程序还是有些不完善的地方。回顾起此次Java课程设计,至今我仍感慨颇多,的确,从拿到题目的开始,从理论到实践,在整整两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实践相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正掌握这门技术,也提高了自己的独立思考的能力。在设计的过程遇到问题,可以说得上是困难重重,这毕竟第一次做的,难免会遇到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学的知识重新温故。 在设计初期,由于没有设计经验,觉得无从下手,空有很多设计思想,却不知道应该选哪个,经过导师的指导,我的设计渐渐有了头绪,通过查阅资料,逐渐确立系统方案。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自 己,争取在所学领域有所作为。 脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。 在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。 在此更要感谢我们的两位老师,老师的严谨治学态度、渊博的知识、无私的奉献精神使我深受启迪。从尊敬的导师身上,我不仅学到了扎实、宽广的专业知识,也学到了做人的道理。在此我要 向我的导师致以最衷心的感谢和深深的敬意。附录:主要源程序201.CheckLinks.javaimport java.awt.*;import javax.swing.*;import .*;import java.io.*;public class CheckLinks extends javax.swing.JFrame implements Runnable,ISpiderReportable /* The constructor. Perform setup here.*/public CheckLinks()/INIT_CONTROLSsetTitle(Find Broken Links);getContentPane().setLayout(null);setSize(405,288);setVisible(true);label1.setText(Enter a URL:);getContentPane().add(label1);label1.setBounds(12,12,84,12);begin.setText(Begin);begin.setActionCommand(Begin);getContentPane().add(begin);begin.setBounds(12,36,84,24);getContentPane().add(url);url.setBounds(108,36,288,24);errorScroll.setAutoscrolls(true);errorScroll.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); errorScroll.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); errorScroll.setOpaque(true);getContentPane().add(errorScroll);errorScroll.setBounds(12,120,384,156);errors.setEditable(false);errorScroll.getViewport().add(errors);errors.setBounds(0,0,366,138);current.setText(Currently Processing: );getContentPane().add(current);current.setBounds(12,72,384,12);goodLinksLabel.setText(Good Links: 0);getContentPane().add(goodLinksLabel);goodLinksLabel.setBounds(12,96,192,12);badLinksLabel.setText(Bad Links: 0);getContentPane().add(badLinksLabel);badLinksLabel.setBounds(216,96,96,12);/INIT_MENUS/REGISTER_LISTENERSSymAction lSymAction = new SymAction();begin.addActionListener(lSymAction);/* Main method for the application* param args Not used*/static public void main(String args)(new CheckLinks().setVisible(true);/* Add notifications.*/public void addNotify()/ Record the size of the window prior to calling parents / addNotify.Dimension size = getSize();super.addNotify();if ( frameSizeAdjusted )return;frameSizeAdjusted = true;/ Adjust size of frame according to the insets and menu bar Insets insets = getInsets();javax.swing.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);/ Used by addNotifyboolean frameSizeAdjusted = false;/DECLARE_CONTROLSjavax.swing.JLabel label1 = new javax.swing.JLabel();/* The begin or cancel button*/javax.swing.JButton begin = new javax.swing.JButton();/* The URL being processed*/javax.swing.JTextField url = new javax.swing.JTextField();/* Scroll the errors.*/javax.swing.JScrollPane errorScroll =new javax.swing.JScrollPane();/* A place to store the errors created*/javax.swing.JTextArea errors = new javax.swing.JTextArea();javax.swing.JLabel current = new javax.swing.JLabel();javax.swing.JLabel goodLinksLabel = new javax.swing.JLabel(); javax.swing.JLabel badLinksLabel = new javax.swing.JLabel(); /DECLARE_MENUS/* The background spider thread*/protected Thread backgroundThread;/* The spider object being used*/protected Spider spider;/* The URL that the spider began with*/protected URL base;/* How many bad links have been found*/protected int badLinksCount = 0;/* How many good links have been found*/protected int goodLinksCount = 0;class SymAction implements java.awt.event.ActionListener public void actionPerformed(java.awt.event.ActionEvent event) Object object = event.getSource();if ( object = begin )begin_actionPerformed(event);/* Called when the begin or cancel buttons are clicked* param event The event associated with the button. */void begin_actionPerformed(java.awt.event.ActionEvent event) if ( backgroundThread=null ) begin.setLabel(Cancel);backgroundThread = new Thread(this);backgroundThread.start();goodLinksCount=0;badLinksCount=0; else spider.cancel();/* Perform the background thread operation. This method * actually starts the background thread.*/public void run()try errors.setText();spider = new Spider(this);spider.clear();base = new URL(url.getText();spider.addURL(base);spider.begin();Runnable doLater = new Runnable()public void run()begin.setText(Begin);SwingUtilities.invokeLater(doLater);backgroundThread=null; catch ( MalformedURLException e ) UpdateErrors err = new UpdateErrors();err.msg = Bad address.;SwingUtilities.invokeLater(err);/* Called by the spider when a URL is found. It is here * that links are validated.* param base The page that the link was found on. * param url The actual link address.*/public boolean spiderFoundURL(URL base,URL url) UpdateCurrentStats cs = new UpdateCurrentStats(); cs.msg = url.toString();SwingUtilities.invokeLater(cs);if ( !checkLink(url) ) UpdateErrors err = new UpdateErrors();err.msg = url+(on page + base + )n;SwingUtilities.invokeLater(err);badLinksCount+;ErrorUrl.add(url); /将ErrorUrl列表写入到外部文件 SaveUrlToFile(Errors.txt,ErrorUrl); return false; goodLinksCount+; if ( !url.getHost().equalsIgnoreCase(base.getHost() ) UpdateOutUrl outUrl = new UpdateOutUrl(); outUrl.msg = url.toString()+n; SwingUtilities.invokeLater(outUrl); /统计站外URL的数量 intOutUrl+; /将站外URL增加到OutUrl列表 OutUrl.add(url); /将OutUrl列表写入到外部文件 SaveUrlToFile(OutUrls.txt,OutUrl); return false; else UpdateInUrl inUrl = new UpdateInUrl(); inUrl.msg = url.toString()+n; SwingUtilities.invokeLater(inUrl); /统计站内URL的数量 intInUrl+; /将站内URL增加到InUrl列表 InUrl.add(url); /将InUrl列表写入到外部文件 SaveUrlToFile(InUrls.txt,InUrl); return true; /* * Called when a URL error is found * * param url The URL that resulted in an error. */ public void spiderURLError(URL url) /* * Called internally to check whether a link is good * * param url The link that is being checked. * return True if the link was good, false otherwise. */ protected boolean checkLink(URL url) try URLConnection connection = url.openConnection(); connection.connect(); return true; catch ( IOException e ) return false; /* * Called when the spider finds an e-mail address * * param email The email address the spider found. */ public void spiderFoundEMail(String email) /实现在ISpiderReportable中定义的方法,用于获得搜索深度 public int getWebDepth() int webdepth=30; switch(intWebDepth) case 0:webdepth=20;break; case 1:webdepth=30;break; case 2:webdepth=40;break; case 3:webdepth=50;break; case 4:webdepth=60;break; return webdepth; /实现在ISpiderReportable中定义的方法,用于获得文件类型 public String getWebType() return strWebType; /实现在ISpiderReportable中定义的方法,用于获得搜索文件大小 public int getWebSize() int websize=30; switch(intWebSize) case 0:websize=40;break; case 1:websize=50;break; case 2:websize=60;break; case 3:websize=20;break; case 4:websize=30;break; return websize; /该方法用于将errorUrl列表写入strFileName文件中 public void SaveUrlToFile(String strFileName,Collection errorUrl) int n=0; Object list=new Object5000; try /初始化写入实例 PrintWriter writeFile=new PrintWriter(new FileOutputStream(strFileName); writeFile.write(*START TO CATCH*); writeFile.println( ); if ( !errorUrl.isEmpty() ) list= errorUrl.toArray(); for ( int i=0;ireport.getWebSize()*1024) getWorkloadWaiting().remove(url); getWorkloadProcessed().add(url); log(Not catch +url.toString()+ because web content size is: + (connection.getContentLength()*10)/1024/n+k); return; /用于搜索深度的判断 if(report.getWebDepth()intDepth) getWorkloadWaiting().remove(url); getWorkloadProcessed().add(url); log(Not catch +url.toString()+ because web depth is bigger than: + report.getWebDepth(); return; / read the URL InputStream is = connection.getInputStream(); Reader r = new InputStreamReader(is); / parse the URL HTMLEditorKit.Parser parse = new HTMLParse().getParser(); parse.parse(r,new Parser(url),true); catch ( IOException e ) getWorkloadWaiting().remove(url); getWorkloadError().add(url); log(Error: + url ); report.spiderURLError(url); return; / mark URL as complete getWorkloadWaiting().remove(url); getWorkloadProcessed().add(url); log(Complete: + url ); /* * Called to start the spider */ public void begin() cancel = false; while ( !getWorkloadWaiting().isEmpty() & !cancel ) intDepth+; Object list = getWorkloadWaiting().toArray(); for ( int i=0;(ilist.length)&!cancel;i+ ) processURL(URL)listi); /* * A HTML parser callback used by this class to detect links * * author Jeff Heaton * version 1.0 */ protected class Parser extends HTMLEditorKit.ParserCallback protected URL base; public Parser(URL base) this.base = base; public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a,int pos) String href = (String)a.getAttribute(HTML.Attribute.HREF); if( (href=null) & (t=HTML.Tag.FRAME) ) href = (String)a.getAttribute(HTML.Attribute.SRC); if ( href=null ) return; int i = href.indexOf(#); if ( i!=-1 ) href = href.substring(0,i); if ( href.toLowerCase(
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:网络爬虫
链接地址:https://www.renrendoc.com/p-35000746.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!