分享我的妹子图站技术方案

in 编程

MM驿站 - 艺术与美的境界

https://www.mmyizhan.com

网站

web展示采用wordpress,目的是为了尽快上线,也想过自己写,不过实在是不想写CRUD了。

大家对wp的印象通常是臃肿,优化一下其实也很快的,不想折腾的,装上redis插件,再加一个wp缓存插件,网络不差的情况下200-500ms没问题的。

爬虫

选型时有三种选择:

  1. pyspider
  2. scrapy
  3. 自写脚本

自写脚本先排除,我想用框架试试。

scrapy的部署需要scrapyd+前者的可视化管理工具,当然不是必须,写完scrapy的脚本也可以直接运行,但需要自己配置去重,总体来说略微麻烦。

最后选中pyspider,也是一路趟坑,详情可以看我的这篇文章《PySpider 使用过程中的问题记录》,这里我说两个最受不了的两个点:

  1. pyspider运行一段时间莫名报错,scheduler连不上,到现在也无解
  2. 代理ip问题

    pyspider在使用代理ip:0.0.0.0请求A页面失败,当它下次重试时,还是会使用0.0.0.0这个ip,这就只能使用squid的cache_peer功能,使其暴露一个固定的代理ip,然后让squid来选择parent_proxy,如下图所示

    Snipaste_2019-09-03_13-14-20

    假如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机器人也被封号了 : )

Responses
  1. 技术

    图片为什么不放到OSS或七牛?这样水印问题就可以通过参数解决了

    Reply
    1. 花墨
      @技术

      1. 域名需要备案

      2. 流量贵,被D下肉疼

      Reply
  2. 技术

    爬了哪些站?分享下啊

    Reply
    1. 花墨
      @技术

      搜索“妹子图”,从第一页挨着看,好多可爬

      Reply