JavaScript陷入了Selenium for Python的泥潭

时间:2018-10-07 23:28:05

标签: javascript python ajax selenium web-scraping

因此,当您向下滚动页面时,我想抓取一个使用JavaScript / AJAX生成其他结果的网站。我正在将Python 3.7与Selenium Chrome无头运行。但是,随着抓取的进行,您最终将获得数量不断增加的代码,这会使我的机器运行缓慢,直到停止为止。甚至像–

这样的简单操作
from itertools import groupby
from operator import itemgetter

d = {}
new_lod = sorted([(j, i[j]) for i in lod for j in i], key=itemgetter(0))
for k, g in groupby(new_lod, key=itemgetter(0)):
    d[k] = [i[1] for i in list(g)]

# {0: [3523, 7245], 1: [3524, 7246, 20898], 2: [3540, 7247, 20899], 3: [7248, 20900], 4: [3541, 20901], 5: [3542, 7249, 20902], 6: [7250]}

–生长需要几秒钟。我运行了一个测试,以查看代码库在从最初的大约50万个字符的初始长度扩展到2500万个字符– 50倍后的数百个结果之后增长了多少!我的问题是这样:

1)有什么方法可以让Selenium删除先前的代码(类似于您可以在Chrome的“检查元素”模式下删除它的方法),以保持大小可管理?

2)还是我忽略了其他一些简单的解决方案?

1 个答案:

答案 0 :(得分:1)

一个建议是查看正在运行的javascript,并在python中执行类似的操作,而不是仅仅依赖于硒。

我不知道您在做什么网站,但听起来它正在进行一系列AJAX调用,加载另一页和另一页结果(图像/帖子/任何内容)。

对JS进行反向工程-可能一遍又一遍地执行相同的AJAX调用,传入一个或两个参数。弄清楚JS如何计算传入的参数(是时间戳,还是接收到的“最后一个”元素的ID等)

然后,而不是让硒来工作,而是使用python请求,执行等效的POST。检索数据(可能是json或html),将其解析为您需要的内容,然后重复。

根据您要查找的站点,这可能快几个数量级。