htmlunit 抓取网页(介绍常用爬虫开源项目和腾讯微博爬虫的问题总结)

优采云 发布时间: 2022-01-22 08:08

  htmlunit 抓取网页(介绍常用爬虫开源项目和腾讯微博爬虫的问题总结)

  介绍

  常用爬虫开源项目

  新浪微博爬虫和腾讯微博爬虫

  新浪爬虫问题

  总结

  介绍

  相关介绍

  即网络爬虫是一种自动获取网页内容的程序。它是搜索引擎的重要组成部分,因此搜索引擎优化主要针对爬虫进行优化。

  主要分类

  网络爬虫从万维网上为搜索引擎下载网页。一般分为传统爬虫和专注爬虫。

  传统爬虫从一个或多个初始网页的URL开始,获取初始网页上的URL。在爬取网页的过程中,不断地从当前页面中提取新的 URL 并放入队列中,直到满足系统的某个停止条件。通俗的讲,就是通过源码分析得到想要的内容。

  焦点爬虫的工作流程比较复杂。它需要按照一定的网页分析算法过滤掉与主题无关的链接,保留有用的链接,并放入等待抓取的URL队列中。然后,它会根据一定的搜索策略从队列中选择下一个要爬取的网页URL,并重复上述过程,直到达到系统的一定条件并停止。此外,爬虫爬取的所有网页都会被系统存储,经过一定的分析、过滤、索引,以供后续查询和检索;对于重点爬虫来说,这个过程中得到的分析结果也可能对后续的爬取过程给出反馈和指导。

  反爬虫:KS-WAF将爬虫行为分为搜索引擎爬虫和扫描爬虫,可以屏蔽特定搜索引擎爬虫以节省带宽和性能,也可以屏蔽扫描爬虫防止网站被恶意爬取。

  常用爬虫开源项目

  Nutch 标志 搜索引擎 Nutch

  Nutch 是一个搜索引擎的开源 Java 实现。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。

  尽管网络搜索是漫游 Internet 的基本要求,但现有网络搜索引擎的数量正在下降。而这很可能会演变成一家为其商业利益垄断几乎所有网络搜索的公司。这显然对绝大多数网民不利。

  现在所有主要的搜索引擎都使用专有的排名算法,这些算法不能解释为什么一个页面被排在一个特定的位置。另外,有些搜索引擎按网站付费,而不是按自己的值排序。

  Apache Nutch 项目(一个网络搜索引擎)。当 Nutch 发展到一定程度时,遇到了可扩展性的问题,即当存储的网页数量达到 1 亿的水平时,Nutch 原有的结构很难达到高效率。就在整个团队不知所措的时候,救星谷歌出现了。Google 在 2003 年发布了 Google 使用的分布式文件存储系统文章(The Google File System),Nutch 开发者意识到可以将 Nutch 放在 GFS 上实现,所以经过一年的发展,NDFS(Nutch Distributed文件系统)出现。在解决了瓶颈问题之后,Nutch 有了很大的发展,而就在 2004 年,Google 发布了 MapReduce 的想法,因此尝到甜头的 Nutch 开发者们毫不犹豫地将 MapReduce 模型应用到了 Nutch 系统中。

  但是在 Nutch 加入 GFS 和 MapReduce 之后,Nutch 变得太大了,超出了网络搜索引擎的范围,所以在 2006 年分别移植了 NDFS 和 MapReduce,形成了一个新的项目,叫做 Hadoop。

  Java 多线程网络爬虫 Crawler4j

  Crawler4j 是一个开源的 Java 类库,它提供了一个简单的网页爬取接口。它可以用来构建一个多线程的网络爬虫。

  crawler4j的使用主要分为两步:

  1. 实现一个继承自WebCrawler的爬虫类;

  2.调用CrawlController实现的爬虫类。

  WebCrawler 是一个抽象类,继承它必须实现两个方法:shouldVisit 和 visit。在:

  shouldVisit 是判断当前URL是否应该被爬取(visited);

  visit 是抓取URL指向的页面的数据,传入的参数是网页所有数据的封装对象Page。

  Crawler.CrawController 控制爬虫,先添加seed,然后开启多个爬虫,不断监控每个爬虫的生存状态。

  Crawler.WebCrawler 爬虫

  1. Run():不断循环,每次从Frontier取50个url,对每个url进行processPage(curUrl)。

  2. processPage(curURL):使用 PageFetcher.fetch 抓取网页。如果curURL被重定向,则将重定向url的url添加到Frontier,稍后调度;如果爬取正常,则先解析,生成Page,然后将新的url下降到Frontier(此时确定新增url的深度),调用visit(Page){用户自定义操作} .

  Crawler.Configurations 读取 crawler4j.properties 中的信息

  Crawler.PageFetcher 启动 IdleConnectionMonitorThread 并使用 fetch(Page, ignoreIfBinary) 抓取单个 Page 页面。是一个静态类。

  Crawler.Page 一个页面

  Crawler.PageFetchStatus 单页爬取的配置,如返回的爬取状态号的含义等。

  Crawler.HTMLParser 解析 HTML 源代码并将其存储在 Page 中。

  Crawler.LinkExtractor 提取 HTML 页面中收录的所有链接。

  Crawler.IdleConnectionMonitorThread 用于监控连接(用于发送get请求,获取页面),其connMgr负责发送HTML请求。

  HTML单元

  HtmlUnitHtmlUnit 是“Java 程序的无 GUI 浏览器”。它对 HTML 文档进行建模并提供一个 API,允许您调用页面、填写表单、单击链接等……就像您在“普通”浏览器中所做的一样。

  HtmlUnit的使用: 简介:HtmlUnit是一个浏览器,用Java编写,没有界面。因为它没有接口,所以执行速度仍然可以下降。HtmlUnit提供了一系列的API,这些API可以做很*敏*感*词*,比如表单填写、表单提交、模拟点击链接,并且由于内置了Rhinojs引擎,可以执行Javascript

  1、模拟特定浏览器,也可以指定浏览器对应版本(HtmlUnit最新版本2.13现在可以模拟Chrome/FireFox/IE)

  WebClient webClient=new WebClient(BrowserVersion.FIREFOX_24);

  2、查找特定元素,可以通过get或者XPath从HtmlPage中获取特定的Html元素。例如;

  DomElement plc_main=page.getElementById("plc_main");

  DomElement code_box=(DomElement) pl_common_sassfilter.getByXPath("//div[@class='code_box clearfix']").get(0);

  3. 模拟表单的提交显示在用于登录的代码中;

  HtmlForm loginform = logonPage.getFormByName("loginform");

  HtmlTextInput uid = loginform.getInputByName("u");

  uid.click();//点击获取焦点

  uid.type(Config.getAccount());

  HtmlPasswordInput pwd = loginform.getInputByName("p");

  pwd.click();

  pwd.type(Config.getPassword());

  4、获取新浪微博等微博内容等信息。

  DomNodeList dls = pl_weibo_direct.getElementsByTagName("dl");

  DomElement dl= dls.get(0);

  整数索引 = 0;

  而(DL!=空){

  DomElement em=feed_list_content.getElementsByTagName("em").get(0);

  字符串内容 = em.getTextContent();

  newlist.add(内容);

  索引++;

  dl = dls.get(索引);}

  2.模拟登录,找到微博内容的位置。

  3.获取微博数据并存入数据库,数据库使用MYSQL

  逻辑其实很简单。需要熟悉HTMLunit提供的一些类,然后是XPath语法,再熟悉一些基础的数据库知识,就可以完成微博的爬取。

  腾讯微博也有同样的想法。一些区别是

  1.页面解析不同。

  2.URL 的某些特征是不同的。

  新浪爬虫问题总结

  新浪微博爬虫的一些问题:

  首先是微博数量的限制,从搜索页关键词开始,只能搜索到50页的微博数据。那么每页有20条,只能搜到1000条,这肯定跟实时微博的数量不匹配。

  所以你可以使用高级搜索从2009年开始搜索,这需要不断的实验,看看时间可以弥补50页的微博。因为无论我搜索什么,新浪微博都只能显示50页的数据。

  以本田雅阁为例,可以分为五次搜索,第一次是2009年到2010年,这个时间段只有33页数据,然后是2010年1.1到2011.1.1有50页数据,然后往下推。在某些时期,建立50页数据只需要五六个月。简而言之,这不是常规模式。大概,时间越长,微博越多。. 所以当这个编程达到50页时,url链接的下一页就没有了。这是一个限制。

  第二个问题是微博内容重复。如果连接是

  %25E6%259C%25AC%25E7%2594%25B0%25E9%259B%2585%25E9%2598%2581&xsort=time&scope=ori×cope=custom:2013-01-01-0:2014-04-23-0&page=8

  以本田雅阁为例,这个页面上的微博基本上都是一样的内容。据我观察,这个品牌的微博更像是一个营销和广告的微博。当然,你可以用微博来验证这个方法来刷选。但真正有意义的是,原创的微博,是一个少得可怜的数字。只有几百个大小。

  还是有一些方法可以删除同一个微博。最近在数据库下操作比较有效,使用select distinct content from weibo where program='Honda Accord' into outfile 'D:/Honda Accord.txt';仍然可以删除其中大部分重复推文。

  或者对于几乎相同的情况,只有 URL 不同。您可以使用删除微博内容 LIKE '%铃木“大型车”将与本田雅阁同级%';或其他一些具有特别明显特征的词或短语。

  第三个问题是,虽然新浪只提供了这么多数据,但还是处处受限。当程序运行到20页时,会出现需要手动输入验证码以防止爬虫影响其服务器的问题。这个方案是通过模仿登录验证码的方法来解决的。就是拿到需要输入的验证码,把imageReader拿出来变成一个JFrame,手动输入,点一下,基本上就可以解决问题了。

  第四个问题是微博内容在页面中体现不规则。例如,所有微博内容合二为一,只需 em.getTextContent()。因为不规则,有的em像点赞、空格等,解决方法是通过判断发现em只要不是真实的内容就没有任何属性。否则会有一个类属性。使用判断 hasAttribute() 踢掉点赞和空格。

  第五个问题是不同id定位的问题。使用通用搜索时,定位ID为pl_weibo_direct,使用高级搜索时,微博内容定位ID为pl_wb_feedlist。

  ,当然是一些细节。

  总结:

  虽然还有很多问题,但是爬取数据的效果不是很好。不过可以肯定的是,新浪微博上的大部分数据还是可以通过网址找到的,新浪不可能*敏*感*词*删除。假设像我这样的用户很久以前在2009年发了一条支持本田雅阁的微博,我可以通过我的微博链接看到与本田雅阁相关的微博内容。因此,与关键字相关的微博仍然存在于页面上,但新浪微博本身提供的搜索功能并不强大且有限。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线