我很抱歉从字面上垃圾邮件 selenium 线程。
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", element)
这是我用来在动态生成的列表(Instagram粉丝)上向下滚动的代码。这是一个有限的列表,所以滚动越低,滚动就越小,因为在顶部列表中只有12个元素,而在底部它由所有的关注者组成。我的问题是我有一些数据丢失:当我扫描2个账户406,分别280追随者,刮刀返回只有392和264用户名.我检查了页面的HTML酱料,看看丢失是否是由于数据生成/抓取/数据处理。看起来“完全”生成的HTML列表分别有392个和264个元素。因此,元素加载到页面上的方式存在问题。我不知道是什么原因导致了这些损失,我想是互联网的打嗝加上大块的滚动(每次滚动之前和之后大约有2-3秒的停顿,所以加载时间不是问题)。返回到
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", element)
我想把卷轴做得更精细一点。随着滚动条越来越小,滚动条保持不变的大小,我不能预设像素数量。显然,如果使用固定的因子来乘以scrollheight,比如1/2或3/4 bcs,滚动不会到达列表的末尾。在我看来,我需要一个动态因子,它随着滚动循环的每次迭代而增加,类似于
for i in range(max_followers):
q=i/max_followers
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight*q", element)
因此每个滚动将向下移动~1个元素/迭代。但是当我运行这样的代码时,我会得到一个错误:
selenium.common.exceptions.JavascriptException: Message: javascript error: q is not defined
我想这是可以理解的,我还没有在js中定义变量。有没有办法在execute_script中定义q,并将python中生成的值(i,max_followers)传递给jscript?
2条答案
按热度按时间sg3maiej1#
可以向
execute_script
传递多个参数。jv4diomz2#
您可以在将字符串传递给Javascript之前对其进行格式化。在Python3中实现这一点的标准方法是f-strings,它使用{}来引用变量。
这就是用计算出的
q
替换q
。你可以在这里阅读更多关于f-string语法的内容:https://realpython.com/python-f-strings/。