图片抓取思路

 qiu 

  当你的工作成为一种体力劳动,而自己无法从中获得新的体验和知识的时候,需要警惕究竟发生了什么。在一段安逸的日子后,尤其的需要做些尝试。几个月前的一次尝试,过程中由于一些原因没能进行下去,下面是我的一些尝试,总结一下。

做什么?

  抓取一个旅游景点网站的导览图片,并按照省市区+景区名称命名,以文件目录方式或mongodb存储。网站原貌左侧面板是城市区划目录树,右侧面板是对应行政区下的景区(分析发现最多显示该行政区下的100个景区);点击右侧面板景区如颐和园,重新又开启了一个页面,我们需要获取的目标图片为该页面下的景区游览图:
  meet99-guide   

设计思路

设计大体分为三个步骤;前两步为预处理前的准备,最后是下载;说来简单,中间有很多具体实现的细节要去考虑:

  1. 获取行政区划及其对应的网址;这部分因为几乎是固定的,抓取完毕即可按日期持久化存储为本地文件;–(预处理)
  2. 根据行政区划网址进一步分析并获取其下所有的景区链接地址,抓取完毕即可按日期持久化存储为本地文件;–(预处理)
  3. 根据行政区划下的景区链接进一步分析导览图片所的DOM节点对应的uri,下载文件,存储在mongodb中;–(抓取)

用到的一些开源库:

开源库 类型 备注
Json.Net 高效的.Net JSON框架库 解析响应返回的json数据
HtmlAgilityPack 一个支持用XPath来解析HTML的类库 解析前端html元素和标签
ScrapySharp 从Url获取Html数据,提供CSS选择器的方式解析Html节点 ScrapySharp的Html解析是基于大名鼎鼎的HtmlAgilityPack来实现的

  

问题1-403 Forbidden

  很自然自然想到分析导览图的url,通过后台伪造请求头,来批量请求地址下载导览图。尤其是需要伪造Referer,因为网站往往通过Referer来限定只有本站的请求才可以访问到图片,音频等资源,从而防止资源被盗链。

什么是HTTP Referer?
  简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。

接着按照思路开始请求了图片地址,结果出现403 Forbidden;

解决方案

咨询了老一辈程序员的些建议,并Google参考了下面两篇文章:

  1. 解决图片引用由于对方防盗链处理加载失败的解决方法
  2. 利用 Nginx 实现静态资源的反向代理

用nginx做反向代理,在配置文件nginx.conf中,http→server→location 下设置proxy_pass来指定当前代理的图片网站资源父目录的相对地址,程序中通过解析图片链接来获取图片名称并动态拼接在location所指定的url后面;设置proxy_set_header referer来指定Referer;

server {
    listen       8011;
    server_name  localhost;

    location /image/ {
        proxy_pass 代理资源地址;
        proxy_set_header referer  referer头信息;
        }
    }

问题2-IP频繁请求被限制

  此次尝试当请求到50条左右,服务端返回500错误,试了让主线程等待10秒后再次请求结果还是500错误;浏览器也无法访问主站,大概会被限制一天时间无法访问;
  从网上找了一些代理IP,通过Http代理设置类WebProxy的 方法类来代理访问,但全是失效的,还有一个代理IP实际跳转到它的网站;搞得我有点懵,难道是我方法不对?求大神们指导

代理IP有什么用?

  • 突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站。
  • 访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务。
  • 突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国 外的代理服务器试试。
  • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  • 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。

最后一点是”隐藏真实IP”是我们所关心的,那就可以用代理IP做网络爬虫。

解决思路

  1. 有的网站提供付费的高匿IP接口,可以批量获取,来做IP代理池
  2. adsl动态ip拨号服务器,动态切换断开来获取IP,没有深入了解

最后

  meet99-LXCrawler