当你的工作成为一种体力劳动,而自己无法从中获得新的体验和知识的时候,需要警惕究竟发生了什么。在一段安逸的日子后,尤其的需要做些尝试。几个月前的一次尝试,过程中由于一些原因没能进行下去,下面是我的一些尝试,总结一下。
做什么?
抓取一个旅游景点网站的导览图片,并按照省市区+景区名称命名,以文件目录方式或mongodb存储。网站原貌左侧面板是城市区划目录树,右侧面板是对应行政区下的景区(分析发现最多显示该行政区下的100个景区);点击右侧面板景区如颐和园,重新又开启了一个页面,我们需要获取的目标图片为该页面下的景区游览图:
设计思路
设计大体分为三个步骤;前两步为预处理前的准备,最后是下载;说来简单,中间有很多具体实现的细节要去考虑:
- 获取行政区划及其对应的网址;这部分因为几乎是固定的,抓取完毕即可按日期持久化存储为本地文件;–(预处理)
- 根据行政区划网址进一步分析并获取其下所有的景区链接地址,抓取完毕即可按日期持久化存储为本地文件;–(预处理)
- 根据行政区划下的景区链接进一步分析导览图片所的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参考了下面两篇文章:
用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做网络爬虫。
解决思路
- 有的网站提供付费的高匿IP接口,可以批量获取,来做IP代理池
- adsl动态ip拨号服务器,动态切换断开来获取IP,没有深入了解
最后