我正在使用Selenium/python自动向下滚动社交媒体网站并抓取帖子.我目前正在提取所有的文字在一个"打" 后滚动一定的次数(下面的代码),而是我想只提取每个滚动后的新装入的文字.
例如,如果页面最初包含文本"A,B,C",那么在第一次滚动后它显示"D,E,F",我想要存储"A,B,C",然后滚动,然后存储"D,E,F"等.
我想要提取的具体项目是帖子的日期和消息文本,可以分别使用css选择器'.message-date'和'.message-body'(例如dates = driver.find_elements_by_css_selector('.message-date'))获得.
任何人都可以建议如何在每次滚动后只提取新加载的文本?
这是我当前的代码(在我完成滚动后提取所有日期/消息):
from selenium import webdriver
import sys
import time
from selenium.webdriver.common.keys import Keys
#load website to scrape
driver = webdriver.PhantomJS()
driver.get("https://stocktwits.com/symbol/USDJPY?q=%24USDjpy")
#Scroll the webpage
ScrollNumber=3 #max scrolls
print(str(ScrollNumber)+ " scrolldown will be done.")
for i in range(1,ScrollNumber): #scroll down X times
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3) #Delay between 2 scrolls down to be sure the page loaded
## I WANT TO SAVE/STORE ANY NEWLY …Run Code Online (Sandbox Code Playgroud) 我在 R 中有一个列表,my_list2如下例所示。
我想以最小化峰值 RAM 使用的方式将项目添加到列表中。
有没有比使用该append函数更节省内存的方法?
我知道最好的做法是创建一个“空”列表,然后按照my_list2下面的示例填充它,但这不是一个选项,因为该列表已经存在。
# If I could create the list from scratch I'd do it list this:
my_list <- vector('list', 10)
for (i in 1:10) {
my_list[[i]] <- i
}
# Is there a better way than the 'append' function?
my_list2 <- list(1)
for (i in 2:10) {
my_list2 <- append(my_list2, i)
}
Run Code Online (Sandbox Code Playgroud) 我读过在 R 中执行嵌套 foreach 循环的正确方法是通过嵌套运算符%:%(例如https://cran.r-project.org/web/packages/foreach/vignettes/nested.html)。
但是,使用这种方法时,不能在内循环和外循环之间添加代码——请参见下面的示例。
有没有办法创建嵌套的、并行的 foreach 循环,以便可以在内循环和外循环之间添加代码?
更一般地说,我想到的显而易见的方法有什么问题,即简单地用%dopar%运算符而不是%:%运算符嵌套两个 foreach 循环?请参阅下面的简单示例。
library(foreach)
# Set up backend
cl = makeCluster(6)
registerDoParallel(cl)
on.exit(stopCluster(cl))
# Run nested loop with '%:%' operator. Breaks if adding code between the inner and outer loops
foreach(i=1:2) %:%
# a = 1 #trivial example of running code between outer and inner loop -- throws error
foreach(j = 1:3) %dopar% {
i * j
}
# Run nested loop using …Run Code Online (Sandbox Code Playgroud) 我正在使用 RSelenium 自动向下滚动社交媒体网站并保存帖子。有时我到达网页底部,由于没有更多数据可用,因此无法加载更多帖子。我只想能够检查是否是这种情况,以便我可以停止尝试滚动。
如何判断是否可以在 RSelenium 中继续滚动?下面的代码说明了我正在尝试做的事情 - 我想我只需要“if”语句的帮助。
FYI有用于在Python这样的解决方案在这里(基本上检查,如果页面高度迭代是不同的),但我不能在河想出如何实现它(或任何其他解决方案)
# Open webpage
library(RSelenium)
rD = rsDriver(browser = "firefox")
remDr = rD[["client"]]
url = "https://stocktwits.com/symbol/NZDCHF"
remDr$navigate(url)
# Keep scrolling down page, loading new content each time.
ptm = proc.time()
repeat {
remDr$executeScript("window.scrollTo(0,document.body.scrollHeight);")
Sys.sleep(3) #delay by 3sec to give chance to load.
# Here's where i need help
if([INSERT CONDITION TO CHECK IF SCROLL DOWN IS POSSIBLE]) {
break
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 R 的 xml2 包获取 XML 文件中所有属性的名称。
我可以使用该函数获取单个级别的属性名称xml_attrs(),但无法弄清楚如何获取所有级别的属性。请参阅下面的示例。
非常感谢任何帮助。
library(xml2)
library(dplyr)
# Make up some data
dat <- read_xml(
"<LEVEL1 attr_lvl1='a'>
<LEVEL2 attr_lvl2='b'>
</LEVEL2>
<LEVEL2 attr_lvl2='c'>
</LEVEL2>
</LEVEL1>"
)
# I know how to get the attributes for each level...
names(xml_attrs(dat)) #"attr_lvl1"
names(xml_attrs(xml_child(dat, 'LEVEL2'))) #"attr_lvl2"
# Want code which returns the names of attributes across
# *all* levels, i.e. should return "attr_lvl1", "attr_lvl2"
Run Code Online (Sandbox Code Playgroud)