请教一个 Python 爬虫,抓取 JS 变量的问题

2020-06-25 23:05:48 +08:00
 Colorful

现在获取到的值是

"<script> window._xxxx = {}</script>"

window._xxxx 里面是一个对象

我想获取 window._xxxx 这个变量,但是在 console 里面直接打印_xxxx 也是可以获取到值的,所以想请教下如何获取到这个值?

我用的是 scrapy 框架,网上有说可以用 selenium 可以解决这个问题,还在看。

2527 次点击
所在节点    Python
13 条回复
supermoonie
2020-06-25 23:11:42 +08:00
正则提取 {} 整个内容,然后转 JSON
Colorful
2020-06-25 23:24:17 +08:00
@supermoonie

# soup3 = re.compile('window._xxxx = (.*?);', re.S)
soup3 = re.findall("window._xxxx = (.*?)",soup2)

这两种方法都试过但都不行...
是我写的有问题?
ClericPy
2020-06-25 23:29:51 +08:00
我自己写框架调用无头浏览器拿变量也就三四行...

正则的话, 你正则写错了吧? 没原始代码不容易拼,

r' window\._xxxx = ([\s\S]*?)</script>'

你这又 xxx 又空 {} 的, 还是好好学学正则吧, 最怕盲猜需求
musi
2020-06-25 23:34:32 +08:00
正则转 json 吧。匹配不到就是正则表达式写的有问题,再好好看看。能不用 selenium 就不用 selenium
Colorful
2020-06-25 23:35:15 +08:00
@ClericPy 搞定了,要先转 str 再正则才可以
Colorful
2020-06-25 23:35:41 +08:00
@musi 先转 str 再正则就可以了。为什么说能不用 selenium 就不用 selenium ?
supermoonie
2020-06-25 23:39:40 +08:00
@Colorful python 正则不太会,给你一段 js 的吧

/.*_xxxx=({.*})<.*/.exec("<script> window._xxxx = {'foo': 'bar'}</script>".replace(/\s/g, ''))
supermoonie
2020-06-25 23:40:31 +08:00
@Colorful 因为 selenium 要运行浏览器,属于重量级的操作
ClericPy
2020-06-25 23:41:34 +08:00
@Colorful ... 你是把 Tag 对象给正则了... 我以为提前已经 outerHTML 或者 text 了, 早点休息吧, 大过节的能不写代码就不写代码
supermoonie
2020-06-25 23:42:29 +08:00
@ClericPy 大过节的,写写自己的代码吧🐶
Colorful
2020-06-25 23:44:44 +08:00
@supermoonie 懂了,感谢普及
lithbitren
2020-06-26 11:05:35 +08:00
以前还不会正则的时候碰到过这种,直接

i = html.find('window._xxxx = ')

获得头坐标,然后再

j = html.find('</script>', i)

获得尾坐标,然后再

json.loads(html[i + len('window._xxxx = '): j])

就可以得到对象了。。
warcraft1236
2020-06-30 10:00:20 +08:00
scrapy 为啥不直接用 css 提取 script 里边的内容,然后直接截取 {} 里边的内容就好了,连正则都不需要调,简单的很

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX