资讯专栏INFORMATION COLUMN

抖图 一期

yy736044583 / 836人阅读

摘要:最近看到抖音那么火,心想着是不是要做个抖图,就这样,拖拖拉拉就开始干了。一个多月了,终于有成果了。二期会对这个爬虫做出修改,优化,希望能够一次性完成所有的爬取工作。

换了新公司,没什么时间写博客了。最近看到抖音那么火,心想着是不是要做个“抖图”,就这样,拖拖拉拉就开始干了。一个多月了,终于有成果了。

准备工作

从某图片网 爬了8w张图片,爬的只是链接(因为是链接,所以后面出现一些问题)

将链接存到本地的mysql数据库

用express 写了一些接口

前端用react 做了这个滑动的交互和首页的刷新

技术点

爬图片网站,我用的方法比较笨。中间经过本地文件中转了一下,执行效率不是很好,为了防止对方反爬虫,我设置了一个定时器,2秒钟一次。爬到第二天早上还没结束。二期会对这个爬虫做出修改,优化Promise,希望能够一次性完成所有的爬取工作。

后端我用的是node,使用mysqlyi的包,拼凑一个插入语句,把所有的数据存进去。

要开始写接口了。写了两个接口,一个是根据前端传值页数和每页多少条,到数据库进行分页查询①,记得上面提到过我爬取的都是图片链接,你访问别人cdn上的图片,人家肯定不乐意,所以就有了防盗链技术,当然也就有了反防盗链技术,我是用的node转发图片请求②。

前端用的是react + dva,首页用了swiper③的插件。

技术方面难度不到,就不上github地址了。贴几段看看就好。

① nodejs、mysql 分页查询

/**
 * @description 分页查询
 * @param {number} pageNo 一页多少条
 * @param {number} pageSize 多少页
 */
function funcSelectImgs(pageNo, pageSize) {

  let promise1 = new Promise((resolve) => {
    let SQLSelect = `select * from girl_img_tbl limit ${(pageNo - 1) * (pageSize)}, ${pageSize};`
    connection.query(`${SQLSelect}`, function (error, results, fields) {
      if (error) throw error;
      let arr1 = []
      results.map((item, index, arr) => {
        arr1.push(item.girl_img_url)
      })
      resolve(arr1)
    })
  });

  let promise2 = new Promise((resolve) => {
    let SQLSelect = `select  count(*) from girl_img_tbl;`
    connection.query(`${SQLSelect}`, function (error, results, fields) {
      if (error) throw error;
      resolve(results);
    });
  })

  return Promise.all([promise1, promise2]);
}

② 为了反防盗链,使用nodejs转发图片请求,使用request库

var options = {
    url: str,
    headers: {
      "Referer": "targetUrl"
    }
  };
  request(options)
    .on("error", function (err) {
      console.log(err)
    })
    .pipe(res);

③ 在react中使用swiper

  if (this.swiper) {
      this.swiper.slideTo(0, 0)
      this.swiper.destroy();
      this.swiper = null;
    }
    this.swiper = new Swiper(this.refs.lun, {
      direction: "vertical",
      lazy: {
        loadPrevNext: true,
        loadPrevNextAmount: 2
      },
    });
  }

...
// render方法中使用

{arrImgUrls.map((urlItem, index, arr) => { return (
{this.handleImgClick(urlItem)}}>
) })}

刚才有提到为了反防盗链,我用我的nodejs服务器转发图片请求。我的是1M的腾讯云服务器,转发图片速度太慢了。昨天升级到了10M,两天时间就要36块钱,太贵了。

贴上链接吧,http://115.159.47.17:8081/ 我没买域名,直接用的ip地址。估计明天就限速了,我就升级了两天时间8月8号和8月9号。不过现在也能打开,不过会很慢。看大家需求吧,如果有喜欢的话,私信我,我看是继续升级带宽,还是换家服务器厂商。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96784.html

相关文章

  • 每周前端开源推荐第一期

    摘要:每周前端开源推荐第一期一直以来大家都觉得是一个放在根目录的静态,这个开源库可以让增加动画动态修改图片甚至使用视频摄像头捕捉。体验地址一个类似的前端框架,和不同的是更语义化。 每周前端开源推荐第一期 favico.js Make a use of your favicon with badges, images or videos 一直以来favicon.ico大家都觉得是...

    浠ラ箍 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<