分享

爬虫修改成果

 愤怒的葱花 2015-12-03

额,也不能只写一个流程上来。我就以 问题解决方式(过程) + 收获的方式来提交成果吧。

. https 协议的内容不能正常爬取。

解决: 这个其实是最好解决的一个了,开始接触这个问题时候我认为很棘手,还认真的

去了解了下https http 到底有什么区别。后来想到虽然https 是加密传输,但是我也不是截获内容,是正常请求的,那么既然用户能看到,那我就能应该能够得到。又了解到C# 本身是可以自动处理https请求的,所以我认为问题没那么难。然后就去找了几篇带有https 的文章。我就发现,请求的时候根本就没有https

url 那么好了,一定是获取路径的问题,原来以前只取出来了http开头的问题。嗯,看来发现问题之前一次全程调试时很有必要的。当然,知识积累更重要,如果之前我知道那些,就不会去想那么多了

收获: 1. https 和 http 的区别,之后会单写一篇介绍。

                   2.  C# 是可以处理一般正常的https 的。(某些需要证书的还要特殊处理)

 3.  复杂问题简单化。可能好多事儿没想的那么难。
 =======================================================================

  .部分图片超时拖慢进程,还有部分图片被遗漏。

解决: 这个就主要是业务逻辑上的问题了。

超时问题靠设置了请求的超时时间和最大超时图片数量来解决的。将这些情况交由其它程序处理,防止卡死主程序。 

部分图片遗漏是由于以前并未记录正在重试的图片,一旦修改状态后发生 ID 大的比ID小的提前下载完成很久,那么他们之间如果有空白文章,程序重启,未下载完的没有被记录,那么就会被遗漏。 

那么记录当前正在下载的就很有必要了。首先记录正在下载的,程序中断再启动会取到上次正在下载的最小值  ,从最小值向后取,这样就能够保证不遗漏文章。

收获: 嗯,思路要严谨,清晰。当很容易绕懵的时候就动动笔。

=======================================================================

路径正确,图片下不下来

解决:  原因是因为图片被压缩过,在浏览器可以直接看到,但是下载下来就是被压缩过的格式。 既然知道了是这里的问题,那么一定要将这个图片和其它 图片区别开,嗯,看了一下ResponseHeader  果然有不同                  

        这样进行判断 然后对图片解压缩一下就可以了

收获:  下载下来的东西不对,要仔细看看响应头,一般会有所发现。

 ======================================================================

  webp格式的图片未能处理。 Bitmap 不识别。被当作了垃圾文件。

解决:  需要知道这个图片的特殊之处在哪才能特殊处理,然而这次响应头并没有帮到我什么忙,只给我image/jpg  嗯,原来它也是会骗人的。 那么想区分一个文件的类型怎么才最靠谱呢,文件头。可我又不想将来路不明的东西下载下来之后再去判断它,好吧,我不是得到了文件的byte[] 么。那为了看的清楚些,我把它转换成了16进制的字符串数组。下载下来一个文件,用VS打开也是这样的序列,所以我能清晰的知道哪里代表什么从而进行对比。通过这我就可以去文件中找保存文件类型的对应位置去取了。嗯,最艰难的判断完了,就剩下转换了,这个是网上找的dll文件,当然 ,如果我清晰的知道webp jpg 的文件结构,那么自己也是可以写转换方法的。这个有待后来学习。

收获:   首先获得了两个非常棒的dllWebp bitmap 其次,对文件结构理解的多了。

            Webp格式确实是个好东西,加载飞快。当然,支持的比较少。

   webp  是谷歌推出的,为了提高网页中图片的加载速度的一种新的图片格式。它较之JPE           G格式更小,使用这个格式图片提及比jpeg还要小上40%左右。webp格式的缺点也明显,           就是它的编码速度要比其他图片慢上8倍,解析速度也要慢1.5倍左右,但是对于用户来说         ,编码速度是和他们无关的。虽然解析较慢,但是由于其大幅度降低了图片的体积,所以             较之其他图片速度还是要快上一倍左右。只得一提的是它居然可以做到有损和无损压缩, 不影响实际图片清晰度。

           特点: 标注 webp 在 16进制序列8 9 10 11 这四  个位置,翻译过来就是WEBP 。可以通           过这里准确的判断其格式。转换的库是两个

         1. Noesis.Drawing.Imaging.WebP.dll      2. NoesisWebP.dll
  
          很简单易用,不过 NoesisWebP.dll 需要手动添加到bin下。

=========================================================================


伍 : 路径不是链接,而是Base64码。导致图片没下载到我们服务器
 如果你不知道什么是Base64 ,那么你一定用过迅雷,很多网站提供的迅雷下载链接就是            经过Base64加密的。可以用来在http环境下传递更长的信息。

         这个解决起来简单,C#就能帮你完成这一切,前提是你准确的要找到Base64码的所在, img 标签中Base 64  是由 data: 开始的 后面会有 ” base64, “    ,把它之后的东西都取出来
        就是Base64编码了。不要忽略了它最后面是可能会有一个或者两个“ = ” 符号的。

       当你去出来之后 那么就一句话  Convert.FromBase64String(“base64”) 这样就可以获得byte[],
       然后就随你怎么玩了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多