zoukankan      html  css  js  c++  java
  • 文章抓取之下载图片和文件

    自己开发的公众号,可以领取淘宝内部优惠券

    来到新公司后第一个任务就是让我给编辑部的人抓文章,文章抓取工具公司已经开发了一个,我也就直接拿来用了,结果用的很不习惯,操作太繁琐里面的代码逻辑也是比较混乱。所以我就大刀阔斧对它进行了一番修改。我主要还是希望能使这个工具尽量的通用一些,虽说各个网站都不一样,但抓了几天后还是发现有些共同的东西的。通过设置各个元素的xpath表达式,基本可以解决大部分的网站抓取。

    1.抽取出文章列表的标题链接 ,一般的标题链接都是放在ul或者是div里面的a标签,而这些ul和div往往都会设置一个class属性,于是文章的xpath一般可以设置://div[@class='title']

    2.列表页都是会有分页的,通过设置起始页和末页的大小,进行一个循环即可

    3.根据上面的文章链接获取内容的链接后,就可以发出一个http请求获取正文部分,正文部分如果是文本还是比较好解决,最多的要求就是去掉每个网站的广告。运气好些你会碰到一些仁慈点的网站,广告所在的元素会有一些明显的特征,如加了id或是class属性,这样就可以设置要过滤的节点来进行过滤

    4.暂时还在想...............

     最后要讲讲文章正文部分不单单是文本呢,有图片的,甚至还有下载资料(如rar,zip压缩包)的 怎么办。起初工具里是可以支持下载图片的,而且我发现它使用的是WebClient 实现文件下载的。如果下载地址是绝对定位的形式可以下载。如果图片是根据参数动态生成的就麻烦了,会报Uri格式错误。

    最后下载的实现大概这样:

     1             Stream stream = _response.GetResponseStream();
     2             FileStream fs = new FileStream(filePath + fileName, FileMode.Create);
     3 
     4             //1kb下载
     5             //byte[] _buffer=new byte[1024];
     6             //int count = stream.Read(_buffer, 0, _buffer.Length);
     7             //while (count > 0)
     8             //{
     9             //    fs.Write(_buffer, 0, _buffer.Length);
    10             //    count = stream.Read(_buffer, 0, _buffer.Length);
    11             //}
    12 
    13             //fs.Flush();
    14             //fs.Close();
    15             //stream.Close();
    16             
    17             //逐字节下载
    18             int size;
    19             while ((size = stream.ReadByte()) != -1)
    20             {
    21                 fs.WriteByte(Convert.ToByte(size));
    22             }
    23             stream.Close();
    24             fs.Flush();

    25             fs.Close(); 

     

     

     现在下载是一个字节一个字节来从Stream中读取,感觉比较慢些。自己也试了1kb来读取可是发现读取的文章图片是这样的:

     

    不仅图片有问题,下载的rar这些文件也是打不开的。如果一个字节一个字节则一切都OK:

     

  • 相关阅读:
    【转】人类的心理行为模式----《影响力》笔记
    c++类型形参的实参的受限转换
    如何确定网页和查询的相关性
    英语美文摘要
    特殊的字符数组
    c++中的虚函数
    [C#] 常用工具类——应用程序属性信息访问类
    c#常用工具类:文件和二进制转换
    [C#] 常用工具类——文件操作类
    Lamda和Linq语法对比详细
  • 原文地址:https://www.cnblogs.com/yehuabin/p/2447523.html
Copyright © 2011-2022 走看看