我一直在尝试从linkedin中基于关键字搜索来刮取帖子内容。在stackoverflow社区的帮助下,我可以用R脚本操作URL和搜索linkedin的关键词。但是现在,在滚动了10次之后,我想只抓取那些在锚标签中包含电子邮件ID的帖子。这就是如果帖子中有锚标签,html在linkedin中的显示方式。
我无法确定如何编写xpath,以使我能够同时刮取包含正常文本的跨度以及锚标签。这是我一直在尝试的。
library(RSelenium)
library(rvest)
library(stringr)
library(xml2)
try(rsDriver(port = 4444L, browser = 'firefox'))
remDr <- remoteDriver()
remDr$open()
remDr$navigate("https://www.linkedin.com/login")
user <- remDr$findElement(using = 'id',"username")
user$sendKeysToElement(list("xxxx",key="tab"))
pass <- remDr$findElement(using = 'id',"password")
pass$sendKeysToElement(list("xxxx",key="enter"))
ex<-c("jobs in delhi","jobs in mumbai","jobs in bangalore","how to get a job in india")
for(b in 1:4){
urls[b] = paste0("https://www.linkedin.com/search/results/content/?keywords=",ex[b],"&origin=CLUSTER_EXPANSION")
}
j<-1
a1<-vector()
final<-vector()
for (b in 1:4) {
remDr$navigate(urls[b])
for(i in 1:10){
remDr$executeScript(paste("scroll(0,",i*10000,");"))
Sys.sleep(5)
}
page_source<-remDr$getPageSource()
a1 <- xml2::read_html(page_source[[1]]) %>% try(html_nodes(xpath="//a[contains(text(), '@')]/parent::span/parent::div[@class, 'feed-shared-text__text-view feed-shared-text-view white-space-pre-wrap break-words ember-view']"))%>% html_text()
p1 <- length(a1)
if(p1!=0){
for(k in 1:p1){
final[j]<-a1[k]
j<-j+1
}
}
}
请注意,我已经给了用户id和pass为 "XXXX"。如果有人能帮我用正确的xpath查询,我将感激不尽。
这应该选择你想要的帖子。
//div[@class='feed-shared-text__text-view feed-shared-text-view white-space-pre-wrap break-words ember-view'][.//a[contains(.,"@")]]
为了方便地得到每篇文章的文本,我想你可以用:
string((//div[@class='feed-shared-text__text-view feed-shared-text-view white-space-pre-wrap break-words ember-view'][.//a[contains(.,"@")]])[1])
EDIT :
或
(//div[@class="feed-shared-update-v2__description-wrapper ember-view"][.//a[contains(.,"@")]])[1]//text()[normalize-space()]
其中[1]是要递增的值(从1到你得到的总帖子数)。
要提取单页显示的帖子的文本。
string(//div[@class="feed-shared-update-v2__description-wrapper ember-view"][.//a[contains(.,"@")]])
编辑2。 要提取在搜索结果页上显示的帖子的文本。
(//div[@class="feed-shared-update-v2__description-wrapper ember-view"][.//a[contains(.,"@")]])[i]/div[1]//text()[normalize-space()]
或
string((//div[@class="feed-shared-update-v2__description-wrapper ember-view"][.//a[contains(.,"@")]])[i]/div[1])
其中[i]是要递增的值(从1到符合您的 "电子邮件条件 "的帖子总数)。