标签: rselenium

使用 Selenium Python 解析 HTML 并读取 HTML 表格

我正在将我的一些网络抓取代码从 R 转换为 Python(我无法让 geckodriver 与 R 一起工作,但它可以与 Python 一起工作)。无论如何,我试图了解如何使用 Python 解析和读取 HTML 表。快速背景,这是我的 R 代码:

doc <- htmlParse(remDr$getPageSource()[[1]],ignoreBlanks=TRUE, replaceEntities = FALSE, trim=TRUE, encoding="UTF-8")

WebElem <- readHTMLTable(doc, stringsAsFactors = FALSE)[[7]]
Run Code Online (Sandbox Code Playgroud)

我会将 HTML 页面解析为 doc 对象。然后我会从 开始doc[[1]],然后遍历更高的数字,直到看到我想要的数据。在这种情况下,我doc[[7]]看到了我想要的数据。然后我将读取该 HTML 表并将其分配给 WebElem 对象。最终我会把它变成一个数据框并使用它。

所以我在 Python 中所做的是这样的:

html = None
doc = None
html = driver.page_source
doc = BeautifulSoup(html)
Run Code Online (Sandbox Code Playgroud)

然后我开始玩,doc.get_text但我真的不知道如何获得我想看到的数据。我想看到的数据就像一个 10x10 的矩阵。当我使用 R 时,我只会使用doc[[7]]并且该矩阵几乎处于完美的结构中,我可以将其转换为数据帧。但是,我似乎无法用 Python 做到这一点。任何建议将不胜感激。

更新:

我已经能够使用 Python 获取我想要的数据——我关注了这个博客,用 Python 创建了一个数据框:Python Web-Scraping。这是我们在该博客中抓取的网站:最受欢迎的狗品种 …

python selenium beautifulsoup web-scraping rselenium

5
推荐指数
1
解决办法
1万
查看次数

R 以编程方式更改 IP 地址

当前通过将不同的字符串传递给html_session()方法来更改 user_agent 。

有没有办法在抓取网站时更改计时器上的 IP 地址?

r rcurl httr rselenium rvest

5
推荐指数
1
解决办法
5824
查看次数

通过导航 doPostBack 使用 R 抓取网站

我想从网站下面定期提取一个表格。

单击积木名称(BLOK 16 A, BLOK 16 B, BLOK 16 C, ...)时,价格表会发生变化。URL 不改变,页面通过触发改变

javascript:__doPostBack('ctl00$ContentPlaceHolder1$DataList2$ctl04$lnk_blok','')
Run Code Online (Sandbox Code Playgroud)

在搜索 google 和 starckoverflow 后,我尝试了 3 种方法。

我尝试过的没有 1:这不会触发 doPostBack 事件。

postForm( "http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44", ctl00_ContentPlaceHolder1_DataList2_ctl03_lnk_blok="ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok")
Run Code Online (Sandbox Code Playgroud)

我尝试过的没有 2: selenium remote 似乎可以在 ( http://localhost:4444/ ) 上工作,但 remotedriver 无法导航。返回此错误。(checkError(res) 中的错误:httr 调用中的未定义错误。httr 输出:length(url) == 1 不是 TRUE)

library(RSelenium)
startServer()
remDr <- remoteDriver()
remDr <- remoteDriver(remoteServerAddr = "localhost" 
                  , port = 4444L, browserName = "firefox")
remDr$open()
remDr$getStatus()
remDr$navigate("http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44")
Run Code Online (Sandbox Code Playgroud)

我尝试过的没有 3:这是触发 dopostback 事件的另一种方式。它不导航。

base.url <- "http://www.kentkonut.com.tr/tr/modul/projeler/",
event.target <- 'ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok',
action <- "daire_fiyatlari.aspx?id=44" …
Run Code Online (Sandbox Code Playgroud)

r web-scraping rcurl rselenium rvest

5
推荐指数
1
解决办法
1401
查看次数

使用 Chrome 在 RSelenium 中设置代理

如何设置 RSelenium(通过 Chrome)以使用具有用户名/密码身份验证的代理服务器?

这是我到目前为止所拥有的(其中 ip、端口、用户名和密码被实际值替换)。

## Run the Selenium server
selServ <- wdman::selenium(verbose = TRUE)

## Set browser options
eCaps <- list(chromeOptions = list(
                  args = c('--disable-notifications',
                           '--window-size=1280,900',
                           agent,
                           '--proxy-server=http://ip:port',
                           '--proxy-auth=username:password',
                           )))

## Create remote driver
rd <- remoteDriver(port = 4567L,
                   browserName = "chrome",
                   extraCapabilities = eCaps)

## Open browser window
rd$open()

## Navigate to page
rd$navigate("https://www.google.com")
Run Code Online (Sandbox Code Playgroud)

到目前为止没有运气......有什么想法吗?

selenium r rselenium

5
推荐指数
0
解决办法
671
查看次数

无论端口打开/关闭,启动 RSelenium 浏览器

问题:是否有一个函数可以在尚未打开的情况下打开 selenium 浏览器,或者关闭当前浏览器并重置端口并重新启动浏览器?

理由:我在 RSelenium 中处理偶尔会崩溃的大循环,因此有时我不知道循环代码中端口是否打开或浏览器是否打开。我想要一个 RSelenium 启动器,无论浏览器是否打开或端口是否正在使用,它都会启动浏览器。

尝试:我使用 tryCatch() 尝试了这种方法,但如果我尝试启动它两次,我仍然会收到 wdman 错误,表明端口已打开:

browserpreference <- "chrome"
tryCatch({rD <- rsDriver(port = 4444L, browser = paste0(browserpreference))}
  ,error=function(rD,remDr){
          try(remDr$close(), silent=T)
          try(rD$server$stop(),silent=T)
          try(suppressWarnings(rm(rD, envir = .GlobalEnv)), silent=T)
          try(suppressWarnings(rm(remDr, envir = .GlobalEnv)), silent=T)
          gc()
          rD <- rsDriver(port = 4444L, browser = paste0(browserpreference))
        })
Run Code Online (Sandbox Code Playgroud)

如果我尝试两次,我会收到此错误:

Error in wdman::selenium(port = port, verbose = verbose, version = version,  : 
  Selenium server signals port = 4444 is already in use.
Run Code Online (Sandbox Code Playgroud)

谢谢!

selenium r ropensci rselenium

5
推荐指数
1
解决办法
1526
查看次数

使用 RSelenium:找不到 Java

我正在尝试使用RSelenium包在R上执行代码来执行一些网络抓取,但我在第一步就被阻止了。加载库后,我尝试运行这行代码:

rmDr <- rsDriver(browser = "chrome", chromever = 'latest')
Run Code Online (Sandbox Code Playgroud)

但控制台返回:

java_check() 中的错误:未找到 JAVA 路径。请检查JAVA是否已安装。

Java 确实安装在我的计算机上,但我猜该路径不是包正在等待的路径。有人知道我可以在哪里修改 RSelenium 包代码中的路径以便我可以运行它吗?需要注意的是,我在公司计算机上工作,因此我没有所有管理权限。

感谢您的帮助!

r web-scraping rselenium

5
推荐指数
1
解决办法
1万
查看次数

更快的 Rselenium 替代品

我正在为此页面创建一个刮板:https : //www.oddsportal.com. 由于页面使用 javascript 渲染,我决定使用 Rselenium。我的目标是为今年的每场比赛争取赔率。我在页面上使用登录表单,因为我设置了自己的博彩公司来显示这些比赛。我已经为这些匹配抓取了 50 000 个 URL,现在我使用 Rselenium 打开每个 URL 并抓取特定数据。我想知道这个问题是否有更好的解决方案,因为我的脚本主要针对 remDr$navigate(url) 部分花费的时间太长。我还尝试了更快的 splashr 包,但我无法登录并查看我需要的博彩公司。也尝试了 webdriver 包,但无法设置我需要的用户代理,以免出现 404 错误。我使用 findElements 但也许如果我在导航到 URL 后呈现页面并使用 html_nodes 抓取它可以节省一些时间。我也尝试禁用 css,但在 R 中找不到任何适用于 phantomjs 或无头 chromedriver 的可行解决方案。感谢您提前回复。到目前为止,这是我用于测试 20 个 URL 的脚本:

pjs <- wdman::phantomjs()

eCap <- list(phantomjs.page.settings.userAgent 
             = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", phantomjs.page.settings.loadImages = FALSE, phantomjs.phantom.cookiesEnabled = FALSE, phantomjs.phantom.javascriptEnabled = TRUE)

remDr <- remoteDriver(browserName = "phantomjs", port = 4567L, extraCapabilities = eCap)
remDr$open()

#login to …
Run Code Online (Sandbox Code Playgroud)

r web-scraping phantomjs rselenium

5
推荐指数
0
解决办法
681
查看次数

无法在 RSelenium 中使用 phantomjs 启动会话

无法phantomjs使用开始新会话rsDriver。其他浏览器工作正常,但是当我尝试phantomjs它的选项时它不起作用,我无法完全理解错误输出的含义。我该如何解决这个问题?

require(RSelenium)
remDr=rsDriver(port = 4460L, browser = c("phantomjs"))
checking Selenium Server versions:
BEGIN: PREDOWNLOAD
BEGIN: DOWNLOAD
BEGIN: POSTDOWNLOAD
checking chromedriver versions:
BEGIN: PREDOWNLOAD
BEGIN: DOWNLOAD
BEGIN: POSTDOWNLOAD
checking geckodriver versions:
BEGIN: PREDOWNLOAD
BEGIN: DOWNLOAD
BEGIN: POSTDOWNLOAD
checking phantomjs versions:
BEGIN: PREDOWNLOAD
BEGIN: DOWNLOAD
BEGIN: POSTDOWNLOAD
[1] "Connecting to remote server"

Selenium message:Unable to create session from {
  "desiredCapabilities": {
    "browserName": "phantomjs",
    "javascriptEnabled": true,
    "nativeEvents": true,
    "version": "",
    "platform": "ANY"
  },
  "capabilities": {
    "firstMatch": [ …
Run Code Online (Sandbox Code Playgroud)

r phantomjs rselenium

5
推荐指数
1
解决办法
183
查看次数

通过带有嵌入式传单 svg 等的 RSelenium 提取基础数据

我想提取有关此链接中每个广告的信息。现在,我已经到了可以自动单击 的阶段See Ad Details,但是有很多底层数据并不容易整理成一个整洁的数据框。

library(RSelenium)
rs <- rsDriver()
remote <- rs$client
remote$navigate(
  paste0(
    "https://www.facebook.com/ads/library/?", 
    "active_status=all&ad_type=political_and_issue_ads&country=US&", 
    "impression_search_field=has_impressions_lifetime&", 
    "q=actblue&view_all_page_id=38471053686"
  )
)

test <- remote$findElement(using = "xpath", "//*[@class=\"_7kfh\"]")
test$clickElement()
## Manually figured out element
test <- remote$findElement(using = "xpath", "//*[@class=\"_7lq0\"]")
test$getElementText()
Run Code Online (Sandbox Code Playgroud)

输出文本本身很乱,但我相信通过一些时间和努力,它可以被整理成有用的东西。问题是在处理底层数据

  1. 图表,这似乎只是一个图像,和
  2. Leaflet svg,当光标悬停在数据上时显示数据。

我不知道如何系统地提取此图像,尤其是传单 svg。在这种情况下,我将如何获取每个广告,然后提取详细信息中可用的完整数据?

r web-scraping leaflet reactjs rselenium

5
推荐指数
1
解决办法
312
查看次数

完全结束 RSelenium 会话的正确方法?

从 R 完全结束 RSelenium 会话(包括其所有组成部分)的“正确”方法是什么?

背景

当使用 RSelenium 进行浏览器自动化时,有许多技术相互作用,有时会产生奇怪的错误,其中 R 会话中的所有内容都被清理,但某些底层 chrome / chromedriver / phantom.js / selenium /(其他?)进程还没有' t结束了。当尝试将来的 RSelenium 会话时,这可能会导致问题。

到目前为止我所知道的

RSelenium 文档展示了两种关闭整个过程某些部分的方法:

方法一

close浏览器,然后是stop服务器:

# start a chrome browser
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate("http://www.google.com/ncr")
remDr$navigate("http://www.bbc.com")
remDr$close()

# stop the selenium server
rD[["server"]]$stop()
Run Code Online (Sandbox Code Playgroud)

方法二

删除rD(远程驱动程序)对象,并调用垃圾收集:

# start a chrome browser
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate("http://www.google.com/ncr")
remDr$navigate("http://www.bbc.com")
remDr$close()

# stop the selenium server
rD[["server"]]$stop()
Run Code Online (Sandbox Code Playgroud)

我发现的另一件事(来自关于 python 的类似问题)是 …

r rselenium

5
推荐指数
1
解决办法
1413
查看次数