有没有办法加快 dryscrape eval_script() 的执行速度?
Is there a way to speed up dryscrape eval_script() execution?
我正在使用 dryscrape 抓取网页(因为我需要 javascript 渲染部分)并且我正在使用 eval_script() 来抑制一些基于 javascript 的错误检查页。我抑制的这个脚本基本上是我需要避免的 onkeyup
侦听器,因为它强制用户只能从下拉列表中选择 select 选项。
这是评估脚本 -
session.eval_script("$('#input_elem').removeAttr('onblur onclick onkeyup');")
现在,与我在同一域上不需要任何 javascript 修改(因此没有 eval_script())的页面的其他实现相比,整体抓取需要更长的时间.
我使用 time.time()
做了一些分析,以查看脚本在哪里变慢,实际上,它在 eval_script() 步骤上花费了很长时间。这是结果 -
Starting to access at 0.00997018814087
Visited page https://*****/***.aspx 1.30053019524
First eval script run done 5.97628307343
Second eval script run done 9.61053919792
xpath 1 9.6632771492
xpath 2 9.7702870369
xpath 3 9.90402317047
xpath of button to be clicked 9.91756606102
Button clicked 9.97191905975
Second page visited 10.4508111477
Loop 1 else 10.4525721073
xpath 4 10.5330061913
xpath 5 10.6111950874
xpath 6 10.6918411255
xpath 7 10.7721481323
Range begins 10.8208150864
3
Range ends 13.0008580685
虽然当我循环遍历 table 元素时,它大约需要 2 秒,但是两个 eval_script() 步骤加起来大约需要 8 秒。
当我在 Chrome 开发工具控制台中执行此操作时,相同的脚本会立即 运行。
为什么 dryscrape 实施需要这么多时间?
在 eval_script() 中使用 jQuery 似乎是罪魁祸首。我能够使用普通 javascript -
显着减少脚本执行时间
session.eval_script("document.getElementById('input_elem')").removeAttribute('onblur');
我不得不在同一元素上使用两行来执行两个单独的属性删除步骤。
现在这些是我的分析日志 -
Starting to access at 0.0151550769806
Visited page https://*****/***.aspx 1.73412919044
First eval script run done 1.77594304085
First eval script part 2 run done 1.81522011757
Second eval script run done 1.85607099533
xpath 1 1.94704914093
xpath 2 2.03846216202
xpath 3 2.13886809349
xpath of button to be clicked 2.26395010948
Button clicked 2.27277112007
Second page visited 3.30618906021
Loop 1 else 3.38708400726
xpath 4 3.46828198433
xpath 5 3.54840707779
xpath 6 3.63034701347
xpath 7 3.7106590271
Range begins 3.75155210495
3
Range ends 5.91926407814
即使是现在,range
循环中的每一步都需要大约 0.7 秒,我打算进一步减少。
我正在使用 dryscrape 抓取网页(因为我需要 javascript 渲染部分)并且我正在使用 eval_script() 来抑制一些基于 javascript 的错误检查页。我抑制的这个脚本基本上是我需要避免的 onkeyup
侦听器,因为它强制用户只能从下拉列表中选择 select 选项。
这是评估脚本 -
session.eval_script("$('#input_elem').removeAttr('onblur onclick onkeyup');")
现在,与我在同一域上不需要任何 javascript 修改(因此没有 eval_script())的页面的其他实现相比,整体抓取需要更长的时间.
我使用 time.time()
做了一些分析,以查看脚本在哪里变慢,实际上,它在 eval_script() 步骤上花费了很长时间。这是结果 -
Starting to access at 0.00997018814087
Visited page https://*****/***.aspx 1.30053019524
First eval script run done 5.97628307343
Second eval script run done 9.61053919792
xpath 1 9.6632771492
xpath 2 9.7702870369
xpath 3 9.90402317047
xpath of button to be clicked 9.91756606102
Button clicked 9.97191905975
Second page visited 10.4508111477
Loop 1 else 10.4525721073
xpath 4 10.5330061913
xpath 5 10.6111950874
xpath 6 10.6918411255
xpath 7 10.7721481323
Range begins 10.8208150864
3
Range ends 13.0008580685
虽然当我循环遍历 table 元素时,它大约需要 2 秒,但是两个 eval_script() 步骤加起来大约需要 8 秒。 当我在 Chrome 开发工具控制台中执行此操作时,相同的脚本会立即 运行。 为什么 dryscrape 实施需要这么多时间?
在 eval_script() 中使用 jQuery 似乎是罪魁祸首。我能够使用普通 javascript -
显着减少脚本执行时间session.eval_script("document.getElementById('input_elem')").removeAttribute('onblur');
我不得不在同一元素上使用两行来执行两个单独的属性删除步骤。
现在这些是我的分析日志 -
Starting to access at 0.0151550769806
Visited page https://*****/***.aspx 1.73412919044
First eval script run done 1.77594304085
First eval script part 2 run done 1.81522011757
Second eval script run done 1.85607099533
xpath 1 1.94704914093
xpath 2 2.03846216202
xpath 3 2.13886809349
xpath of button to be clicked 2.26395010948
Button clicked 2.27277112007
Second page visited 3.30618906021
Loop 1 else 3.38708400726
xpath 4 3.46828198433
xpath 5 3.54840707779
xpath 6 3.63034701347
xpath 7 3.7106590271
Range begins 3.75155210495
3
Range ends 5.91926407814
即使是现在,range
循环中的每一步都需要大约 0.7 秒,我打算进一步减少。