MM驿站 - 艺术与美的境界
网站
web展示采用wordpress,目的是为了尽快上线,也想过自己写,不过实在是不想写CRUD了。
大家对wp的印象通常是臃肿,优化一下其实也很快的,不想折腾的,装上redis插件,再加一个wp缓存插件,网络不差的情况下200-500ms没问题的。
爬虫
选型时有三种选择:
- pyspider
- scrapy
- 自写脚本
自写脚本先排除,我想用框架试试。
scrapy的部署需要scrapyd+前者的可视化管理工具,当然不是必须,写完scrapy的脚本也可以直接运行,但需要自己配置去重,总体来说略微麻烦。
最后选中pyspider,也是一路趟坑,详情可以看我的这篇文章《PySpider 使用过程中的问题记录》,这里我说两个最受不了的两个点:
- pyspider运行一段时间莫名报错,scheduler连不上,到现在也无解
代理ip问题
pyspider在使用代理ip:0.0.0.0请求A页面失败,当它下次重试时,还是会使用0.0.0.0这个ip,这就只能使用squid的cache_peer功能,使其暴露一个固定的代理ip,然后让squid来选择parent_proxy,如下图所示
假如192.168.0.1这个ip被ban了,这条请求就会进入重试队列,那么下次重试时,就会出现两个问题:
- squid再次使用这个ip怎么办?
- 我想知道哪个ip被ban了怎么操作?(也就是squid刚才使用了哪个父代理)
不只是pyspider,只要是这种依赖squid这类代理服务器的都会有这种问题。
有人可能会说,定时检测这三个代理ip 是否可用就好了,检测到不可用的就删掉,然后更新squid配置文件。
我想说,这种方法就是错误的。
代理ip:192.168.0.1在访问A网站时被ban,但此时代理ip仍然可用,仍然可以访问B、C、D网站,那此时这个代理ip是可用还是不可用?如果是不可用直接删掉的话,是不是意味着每爬一个网站都要写一套检测ip是否可用的代码?
如果是自写脚本的话,我是这么解决的:
我有10+个拨号vps,我写了一套管理工具,当我请求管理工具api的get接口时,会随机返回一个代理节点的信息,其中包括ip、端口、自定义id,自定义id是用来区分节点的,我用拨号vps的所在地拼音做id,当我请求到一个节点后,我使用这个ip作为代理来访问A网站,如果发现触发验证或者ip被ban,此时我会向管理工具发送
/api/switch?id=节点ID
请求,表示这个节点不可用,管理工具会删掉这个ip并通知相应节点重新拨号,然后重新获取新的节点。用squid是无法实现上述操作的,也可能是我没查到,如果大家有好的想法,欢迎讨论。
发布
爬虫取到数据后,会将图片下载到本地并将这套图的信息插入到数据库,我写了一个小工具,每天定时从数据库中取5套图,执行加水印、压缩、发布操作,发布成功后会删掉本地的原始信息。
加水印没什么可说的,程序的第一版是有压缩功能的,使用的是腾讯优图,windows客户端版,用易语言写了个模拟按键,自动点击压缩。
此时出现了个笑话,我在本地测试没问题后就部署到服务器上,第二天发现图片没被压缩,于是我远程桌面连上去运行自动点击程序,一套下来也没问题啊,折腾半天才想起来,服务器上没显卡,关掉远程桌面就没法自动点了 : (
迫不得已只能运行在虚拟机中,跑了一段时间后,实在不想天天开机,又看了下压缩情况,从20k压缩到15k也没什么意义,毕竟别人在上传图片时可能已经压缩过一遍了,最终废除了这一步骤,加完水印直接发布。
wordpress发布有两种方式,xmlrpc、RESTful API和MySQL直接插入,xmlrpc曾出现过漏洞,推荐后两种方式。
后来又写了个QQ机器人插件,发布完成后,会将今日发布的套图链接和标题发送到群里,运行一个月后效果非常好,网站链接也红了,QQ机器人也被封号了 : )
本文由 花墨 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
图片为什么不放到OSS或七牛?这样水印问题就可以通过参数解决了
1. 域名需要备案
2. 流量贵,被D下肉疼
爬了哪些站?分享下啊
搜索“妹子图”,从第一页挨着看,好多可爬