抓取Google Play商店

wol*_*god 4 google-apps-marketplace

我正在抓取Google应用商店.我使用Firefox + firebug来查看请求和响应.但一个参数我不明白.例如:加载下一页时的URL"",它发布一个param pagTok,其值为"EgIIKA ==:S:ANO1ljJ4wWQ"我不知道这个值来自哪里?任何人都可以帮忙吗?

Mar*_*ins 11

调查

由于谷歌最近更改了他们的分页逻辑,现在它需要一个令牌,我发现自己试图研究如何手动生成这些令牌,或者将其从每个响应中检索到的HTML中删除.所以,让我们弄脏手.

使用Fiddler2,我能够隔离一些令牌样本,查看为Play商店的每个"Paging"发出的请求.

这是整个请求:

POST https://play.google.com/store/search?q=a&c=apps HTTP/1.1
Host: play.google.com
Connection: keep-alive
Content-Length: 123
Origin: https://play.google.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)       Chrome/39.0.2171.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Accept: */*
X-Client-Data: CIe2yQEIpLbJAQiptskBCMG2yQEInobKAQjuiMoBCImSygE=
Referer: https://play.google.com/store/search?q=a&c=apps
Accept-Encoding: gzip, deflate
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2

** Post Body **
start=0&num=0&numChildren=0&pagTok=GAEiAggU%3AS%3AANO1ljLtUJw&ipf=1&xhr=1&token=bH2MlNeViIRJA8dT-zhaKrfNH7Q%3A1420660393029
Run Code Online (Sandbox Code Playgroud)

现在我们知道请求是什么,下一步是跟踪更多请求以尝试隔离一些令牌形成逻辑.

这是我能找到的3个请求令牌:

"GAEiAggU%3AS%3AANO1ljLtUJw","GAEiAggo%3AS%3AANO1ljIeRQQ","GAEiAgg8%3AS%3AANO1ljIM1CI"

寻找模式

我们大脑真正擅长的一件事就是找到模式,这是我发现的关于令牌形成的东西:

1 - 开头:"GAEiA"

2 - 后跟:两个随机字符

3 - 后续:"%3AS%3"

4 - 后跟:11个随机字符

浏览器Javascript欺骗x手动HTTP请求

在大多数情况下,在浏览器上执行相同的请求将不会产生与使用代码,手动发出Http请求相同的结果.为什么?因为Javascript.

谷歌是一个沉重的JS用户,所以它会利用它自己的技巧来欺骗你.

如果您查看HTML,您将看不到与上述模式匹配的令牌,相反,您会发现以下内容:

u0026c\\u003dapps\42,\42GAEiAghQ:S:ANO1ljLxWBY\42,\0420\42,\0420\42,\0420\42]\n

如果你仔细观察,你会发现你的令牌在这个"随机字符串"中.您所要做的就是将":S:"替换为"%3AS%".

胜利的正则表达式

如果将正则表达式应用于页面,您将能够找到令牌,然后手动将%SAS字符串替换为%SAS%.

这是我最终使用的那个(由最好的Regex在线Builder提供支持

生成的正则表达式:

/GAEi+.+:S:.{11}\42/

正则表达式的文本含义:

  • 匹配包含字符串GAE的字符串
  • 然后是角色i 1次或更多次
  • 任何字符后跟1次或更多次
  • 后跟字符串:S:
  • 其次是任何角色11次
  • 后跟字符串\ 42

TL:DR

令牌进入HTML,但它被Google"屏蔽",使用Javascript"取消屏蔽"它(只有在使用Selenium等浏览器引擎时才可以运行).

为了获取下一页的pagToken,请阅读当前页面html,抓取它(上面的逻辑),在下一个请求中使用它,重复.

我希望它有所帮助,对于文本墙感到抱歉,我希望尽可能清楚

  • 你的解释对我很有帮助,谢谢!我建议另外一点进行整合.一些随机字符串包含"**\\ u003d**",必须将其转换为"**=**". (2认同)