Php 如何通过在键值对中传递超过1个值的嵌入式查询编辑url

Php 如何通过在键值对中传递超过1个值的嵌入式查询编辑url,php,r,url,Php,R,Url,我正试图抓取以下url,但速度非常慢,因为我必须通过更改键值对并为每个值加载一个新页面来进行顺序抓取。注意键是相同的,只需要更改值 library(data.table) library(magrittr) library(jsonlite) readr::read_lines("http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=364334&q

我正试图抓取以下url,但速度非常慢,因为我必须通过更改键值对并为每个值加载一个新页面来进行顺序抓取。注意键是相同的,只需要更改值

library(data.table)
library(magrittr)
library(jsonlite)
    
readr::read_lines("http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=364334") %>% fromJSON %>% as.data.table
问题是我有数千个billid,一个接一个地加载页面需要数百小时

我尝试了一些查询字符串更改组合,但没有一个被接受

 "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=364334,100025"

 "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=364334 AND 100025"
我收到web服务器返回的语法错误:
pg_query():查询失败:错误:语法错误位于或接近

我想我不熟悉url格式,这就是为什么我不能找到正确的查询字符串。下面是10个随机BillID。你能试着把它们放在一个查询中吗

c("100025", "147025", "6025", "119025", "118025", "98025", "123025", 
"224025", "313025", "18025")

您需要使用
sprintf
/
paste0
分别创建每个url

library(jsonlite)
library(readr)

urls <- sprintf('http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=%s', billIDs)
urls
# [1] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=100025"
# [2] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=147025"
# [3] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=6025"  
# [4] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=119025"
# [5] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=118025"
# [6] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=98025" 
# [7] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=123025"
# [8] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=224025"
# [9] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=313025"
#[10] "http://218.248.45.166:8092/vssWB/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID=18025" 

一个更好的选择可能是并行进行

-包裹

library(jsonlite)
library(readr)
library(future.apply)
library(glue)
-代码

#//创建URL

URL pg_查询,我认为是一个php函数,但其余的是一些东西else@LawrenceCherone剩下的是R代码。如果您可以使URL(具有多个ID)在浏览器中成功运行,我将在代码中执行其余的修复。@LawrenceRone:如果您可以设计URL字符串,使其突破单个ID的障碍(您可以使用我提供的列表中的多个帐单ID-复制并粘贴到浏览器URL)我会接受并投票支持你的回答。这是我已经在做的事情。问题是这太慢了。它一页一页地加载每一页。如果你读了我的问题,我已经有了顺序页面的解决方案,但这将需要我数千个ID的许多小时。我想修改url,这样我们可以在一次加载中读取多个ID。这看起来很有趣@akrun。我从来不知道
的未来。应用
软件包。但是在执行第一行时,我得到了一个不祥的警告:`warning message:[ONE-TIME warning]Forked processing(>=1.13.0)在将来从RStudio运行R时被禁用,因为它被认为是不稳定的。因此,计划(“多核”)将退回到计划(“顺序”),计划(“多进程”)将退回到计划(“多段”)——而不是像过去那样退回到计划(“多核”)。`一个基本问题:在服务器瓶颈持续存在的情况下,这将如何加快清除速度。
library(jsonlite)
library(readr)
library(future.apply)
library(glue)
# // create the urls
urls <- as.character(glue('http://218.248.45.166:8092/vssWB',
   '/vss00CvStatusData.php?pAction=LoadDetails&pWorkBillID={billIDs}')) 
# // now set the number of workers
future::plan(multiprocess, workers = length(urls))
options(future.globals.maxSize= +Inf) 
out <- future.apply::future_lapply(urls, function(x) read_lines(x) %>%
   fromJSON)
future::plan(sequential) 
billIDs <- c("100025", "147025", "6025", "119025", "118025", "98025", "123025", 
     "224025", "313025", "18025")