来到新公司后第一个任务就是让我给编辑部的人抓文章文章抓取工具公司已经开发了一个我也就直接拿来用了结果用的很不习惯操作太繁琐里面的代码逻辑也是比较混乱所以我就大刀阔斧对它进行了一番修改我主要还是希望能使这个工具尽量的通用一些虽说各个网站都不一样但抓了几天后还是发现有些共同的东西的通过设置各个元素的xpath表达式基本可以解决大部分的网站抓取 抽取出文章列表的标题链接 一般的标题链接都是放在ul或者是div里面的a标签而这些ul和div往往都会设置一个class属性于是文章的xpath一般可以设置//div[@class=title] 列表页都是会有分页的通过设置起始页和末页的大小进行一个循环即可 根据上面的文章链接获取内容的链接后就可以发出一个http请求获取正文部分正文部分如果是文本还是比较好解决最多的要求就是去掉每个网站的广告运气好些你会碰到一些仁慈点的网站广告所在的元素会有一些明显的特征如加了id或是class属性这样就可以设置要过滤的节点来进行过滤 暂时还在想…… 最后要讲讲文章正文部分不单单是文本呢有图片的甚至还有下载资料(如rarzip压缩包)的 怎么办起初工具里是可以支持下载图片的而且我发现它使用的是WebClient 实现文件下载的如果下载地址是绝对定位的形式可以下载如果图片是根据参数动态生成的就麻烦了会报Uri格式错误 最后下载的实现大概这样 Stream stream = _responseGetResponseStream() FileStream fs = new FileStream(filePath + fileName FileModeCreate) //kb下载 //byte[] _buffer=new byte[]; //int count = streamRead(_buffer _bufferLength) //while (count > ) //{ // fsWrite(_buffer _bufferLength) // count = streamRead(_buffer _bufferLength) //} //fsFlush() //fsClose() //streamClose() //逐字节下载 int size; while ((size = streamReadByte()) != ) { fsWriteByte(ConvertToByte(size)) } streamClose() fsFlush() fsClose() 现在下载是一个字节一个字节来从Stream中读取感觉比较慢些自己也试了kb来读取可是发现读取的文章图片是这样的 不仅图片有问题下载的rar这些文件也是打不开的如果一个字节一个字节则一切都OK |