[NervJS/taro]编译成百度小程序被百度蜘蛛抓取,url后被加上大量taroTimeStamp参数导致收录异常

2024-07-15 356 views
7
相关平台

百度小程序

小程序基础库: 3.320.32 使用框架: React

复现步骤

测试的taro版本是 3.4.6

直接编译成小程序提交给百度平台,审核过了以后,查看索引收录,会发现一大堆的相同页面,我这里出现了1600多条低质量页面,url前面路径完全一样,只不过url后面TaroTimeStamp挂了不同的值

这个地址是baiduapp的蜘蛛爬取的

对于这些链接,百度提示:资源内容低质则无法被搜索索引,请尽快修复或 删除死链

错误原因:该页面内容空短,不符合索引要求,请修改后重新提交

有问题的链接(从1600多条里面任选3条共参考):

/pages/index/index?%24taroTimestamp=1650014884199&%2524taroTimestamp=1649991556745&%252524taroTimestamp=1649968514119&%25252524taroTimestamp=1649892730538&%2525252524taroTimestamp=1649816854870

/pages/index/index?%24taroTimestamp=1650133248471&%2524taroTimestamp=1650079123259&%252524taroTimestamp=1650024688141&%25252524taroTimestamp=1649968624472&%2525252524taroTimestamp=1649968597357

/pages/index/index?%24taroTimestamp=1650112016426&%2524taroTimestamp=1650111757652&%252524taroTimestamp=1650100893370&%25252524taroTimestamp=1650090070493&%2525252524taroTimestamp=1650068412300

期望结果

在baiduapp蜘蛛抓取小程序内容时,不应该出现 TaroTimeStamp的参数 链接仅仅应该是:

/pages/index/index

实际结果

同一个url,后面出现大量不同的TaroTimeStamp的值

有问题的链接(从1600多条里面任选3条共参考):

/pages/index/index?%24taroTimestamp=1650014884199&%2524taroTimestamp=1649991556745&%252524taroTimestamp=1649968514119&%25252524taroTimestamp=1649892730538&%2525252524taroTimestamp=1649816854870

/pages/index/index?%24taroTimestamp=1650133248471&%2524taroTimestamp=1650079123259&%252524taroTimestamp=1650024688141&%25252524taroTimestamp=1649968624472&%2525252524taroTimestamp=1649968597357

/pages/index/index?%24taroTimestamp=1650112016426&%2524taroTimestamp=1650111757652&%252524taroTimestamp=1650100893370&%25252524taroTimestamp=1650090070493&%2525252524taroTimestamp=1650068412300

环境信息
👽 Taro v3.4.6

  Taro CLI 3.4.6 environment info:
    System:
      OS: Windows 10
    Binaries:
      Node: 16.13.2 - D:\ProgramData\Miniconda3\envs\tarojs3\node.EXE
      npm: 8.1.2 - D:\ProgramData\Miniconda3\envs\tarojs3\npm.CMD

回答

3

求解,我这边也有这样的情况。

8

@Chen-jj @luckyadam 两位大佬帮看下。 百度小程序的抓取是根据用户访问的路径抓取的,taroTimestamp参数一直变,导致百度小程序抓取时将一个地址当作N个页面来抓取了。

6

看地址,不一次执行了onLoad,而是很多次 /pages/wenda/major/major?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995 同时还进行了多次urlencode,导致出现 %2524 符号,要进行两次urldecode @Chen-jj ,我先和百度小程序沟通一下,他们的抓取原理,再来找您沟通。

1

这里是不是也讨论一下,如果有$taroTimestamp的情况下,进行一下覆盖?而不是新加。

2

也不是新加吧,你看上面的代码,只是改了 options 一次。新页面 onLoad,又是新的 options 对象了。就算百度扔相同的 options 对象进来,设置相同 keyname 的属性也不会出现多条数据。。

9

恩,具体看了一下代码,确实是。 /pages/wenda/major/major?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995 他们进行了几次urlencode赞成的。 ?%24taroTimestamp=1646197398086&%2524taroTimestamp=1646164884874&%252524taroTimestamp=1646121526181&%25252524taroTimestamp=1646099787995 %24 %2524 %252524 %25252524 😂😂😂,导致每次都进添加一次新的$taroTimestamp

9

如果spider来抓,其实不能加timestamp,否则会被认为是不同资源,或者根据来抓的蜘蛛UA,碰到蜘蛛就不要加timestamp

0

参数一变,就当成不同资源了,作为百度蜘蛛来说没错,但是作为小程序这边,相同的资源,内容没有发生变化,或者说内容是静态的情况下,确实不应该加timestamp,否则对于cache也不友好

2

作为小程序来说,Taro 只知道 onLoad 触发了,并且能接收 options 参数,并不知道有蜘蛛来抓。

原因应该就是多次对 url encode 造成的,或许他们需要一个 encode 是幂等的 url。

9

同样遇到这个问题 目前有几个比较畸形的解决方式

1. urlencode的时候会把 "$" 符号编码,解决方式:"$"替换成一个不会被编码的 "_" 或者其它的符号

https://github.com/NervJS/taro/blob/a025bcbb226ed3d01ed218c269a05d2e98109a46/packages/taro-runtime/src/dsl/common.ts#L121

// 换成 _taroTimestamp 来标记 不知道去掉这个会不会有影响。。。
options._taroTimestamp = Date.now()

2. 做了一点测试 百度小程序onInit生命周期比onLoad生命周期要提前

https://github.com/NervJS/taro/blob/fdedea25c89902bfcf0d02290a403d95cbaae9cf/packages/taro-swan/src/runtime-utils.ts#L21

// 这里 直接还原成 onLoad 会损失一部分性能
config.page[0] = 'onLoad'

@Chen-jj 大佬有时间看下 还有没有更合理的方案

3

@yuconora $ 改为 _ 可以的,没有副作用,但即使不被编码还是会生成这样的长串吧?

另外这还和 onInit 有关系么?

9

@Chen-jj 神策统计这边也会抓取到$taroTimestamp参数, 在统计某个带参数的页面时, 由于$taroTimestamp时间戳值不一样, 导致统计时无法统计准确。 所以想知道,$taroTimestamp 目前的作用是? 是否可以干掉或者考虑让用户自己去开启或者关闭? 像神策这种第三方统计的SDK一般都是通过获取当前的路由参数来获取页面参数, 例如下图所示属性: image

6

@Chen-jj

百度小程序onInit 和onLoad 测试流程大概是这样的

  1. taro 新建一个项目 选取 taro-hooks 模板
taro init test
  1. 打开百度开发工具并导入小程序目录 正常开启 可看到页面参数这一栏会出现 $taroTimestamp 参数

    未修改-百度
  2. 修改 node_modules/@tarojs/plugin-platform-swan/dist/runtime.js 242 行代码 把config.page[0] 赋值为 "onLoad"

    Snipaste_2022-05-10_17-00-43
  3. 重新编译项目

    修改后
  4. 可以看到 $taroTimestamp 参数消失了 猜测百度小程序生命周期onInit里面修改options可能会影响到页面参数 (而分享web化这一操作会对 页面参数 这里进行 一次urlencode 浏览器页面刷新一次就会重新urlencode一次 详见第七条操作)

生命周期mark
  1. 做一个对比 百度小程序 新建一个原生页面 不做任何修改 页面参数正常 origin

只在onInit 里面修改options 参数 与第二条一致 会出现$taroTimestamp 参数

onInit

只在onLoad 里面修改 与第四条一致 不会出现 $taroTimestamp 参数

onLoad
  1. 另附上出现多次urlencode的复现操作(使用百度代码片段方式模拟) 导入百度开发工具 填上测试Appid
    swanide://fragment/43be9b7af794457c29f25c82e398a1b11652178051043

    选择预览->分享web化 -> 浏览器预览

    share

在浏览器中多次刷新 就会出现长连接 大致的过程如下 刷新->页面添加新的$taroTimestamp 参数(最开始的已经编码成%24taroTimestamp 不会被认定成 $taroTimestamp,所以会添加新的) ->url编码页面参数(包含前面已编码过的"$" , 多次刷新,多次编码)

onInit里面 修改为_taroTimestamp 则不会出现长连接(onLoad里面修改则不影响页面参数这一部分)

所以会猜测与onInit有关 Taro转换成小程序页面的实现目前没深入理解😂 才会有以上比较畸形的解决方式

3

@Chen-jj $符号导致重复抓取的问题已经百度小程序进行了沟通,确实是有问题,他们会排期解决这个问题。 但对于 @yuconora 反馈的问题,确实想知道一下为何要加$taroTimeStamp参数,百度小程序那边也想知道,不然就算处理了$号的问题,导致业务的其他问题不一定能处理。

4

@yuconora 感谢提供详细的测试说明。同时根据 @bigmeow 提供的场景,的确不应该修改 options 对象,我们尝试换一种实现的。

1

关注