c#抓取网页数据(识别不能实现的原理和问题产生进行介绍(图))
优采云 发布时间: 2022-02-05 07:23c#抓取网页数据(识别不能实现的原理和问题产生进行介绍(图))
困扰了我几天的问题今天终于解决了,分享一下最近使用solr的一些心得。
最初是使用nutch来爬取页面,但是客户需要爬取RSS,通过RSS提要可以识别那些被爬取的页面。虽然 nutch 自带了解析 RSS 的插件,但是有些 RSS 无法解析,难以控制。更重要的是,爬取后和普通页面并没有太大区别。它无法识别和判断爬取的是哪个RSS源。. 由于以上原因,我用C#写了一个项目,用Solr爬取RSS。
一切落实后,客户很满意,我也觉得做工还不错,但是用了一段时间,发现solrdedup时nutch出现故障,导致nutch无法使用。下面将介绍rss的实现原理和问题的产生。Solr和nutch没有解决是因为非常难懂,主要是这样的问题在网上很难找到。由于公司没有外网和版权,一切只能凭记忆写。
RSS+Solr的实现是利用webrequest读取rss源的xml格式的内容,在post方法中直接为solr创建索引。为了满足客户的要求,我在solr的schame中添加了rss和isrss字段,其中rss是rss源的url地址,isrss固定为true。由于nutch没有这两个字段,我们只需要输入isrss:"true"查询rss就可以过滤掉不是来自rss的页面。
实施过程中应注意以下几点
1.rss源不是后缀为xml的文件,有些是普通页面的响应,有些需要登录权限
2.RSS目前主要有两种格式,常见的xml结构是rss/channel/item,另一种是我们博客园rss的结构feed/entry。
里面的label是固定的,可以通过不同的label找到solr中filed所需要的值
3.id、digest、tstamp 三个字段是必须的。
如上所述,nutch 运行到 solrdedup 时,会报错。一开始我以为是solr新增的两个字段。我尝试在nutch中添加两个字段,并且还使用了nutch的静态字段插件和额外字段插件,但是没有成功。最后发现,清除solr数据后,nutch可以正常运行了。我也在谷歌上查了很多,但它根本没有帮助。我认为这是solr缓存的原因。今天刚好有点空,于是找到nutch的报错文件solrdeleteduplicates.java,发现nutch是通过直接从solr中取出id、digest、tstamp字段来去除重复的,不判断是否是直接使用空的。
但是,我写的程序中没有添加digest和tsamp。果然,加上这两个字段后,我完成了没有这两个字段的所有数据,nutch又可以正常运行了。
4.digest是网页的32位hash值,用于nutch去重复时比较差异
5.solr可以直接通过请求url添加、修改、删除内容,修改后的格式和新的一样
主要核心是:xx.xx.xx.xx/solr/update?stream.body=xx&stream.contentType=text/xm;charset=utf-8&commit=true
如果内容有ur格式和html格式,需要转码
6. solr的时间是GMT格式的,所以不要搞错,而且rss中有些GMT格式是错误的,我遇到过很多,错误的星期会导致solr索引失效。
目前信息还是比较全的,搜索也比较方便,但是还有很多问题需要解决,主要是js生成的页面无法读取,可以过滤页面信息。文章的主要内容,过滤导航等信息仍然难以获取。目前,我发现的其他人正在根据统计规则进行过滤。比如很多导航栏用|隔开,内容中的空格用空格隔开。等待。每个站点的html布局风格不同,标签难以统一。百度和谷歌不知道如何实现,或者他们没有真正实现。
Nutch还是比较强大的,但是我总觉得维护和修改不容易。上次编译源码的时间比较长,solr查询也比较高效。可能正计划编写一个 .net 版本的爬虫和搜索,但这只是在计划中,因为涉及的问题太多......