Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在需要对象交互的站点上使用XML HTTP请求_Json_Xml_Vba_Http_Web Scraping - Fatal编程技术网

Json 在需要对象交互的站点上使用XML HTTP请求

Json 在需要对象交互的站点上使用XML HTTP请求,json,xml,vba,http,web-scraping,Json,Xml,Vba,Http,Web Scraping,我正在做一个项目,从许多网站上搜集信息。我有很多网站没有问题,主要是通过修改URL以通过相关标准或发布AJAX请求来处理它们。我是个新手,所以我正在寻求帮助 我遇到过一个网站,在那里我需要与页面上的对象进行交互,以获取更多信息。以下网站就是一个例子: 如果您访问该网站并进入底部,则会有更多品牌,单击“查看”将显示其他产品。单击后,仅返回这些文件的HTML 对于其他网站,我使用以下方法从中获取信息执行页面对象操作后,是否有办法通过XML HTTP方法处理页面? 任何帮助都将不胜感激。目前,我假设

我正在做一个项目,从许多网站上搜集信息。我有很多网站没有问题,主要是通过修改URL以通过相关标准或发布
AJAX
请求来处理它们。我是个新手,所以我正在寻求帮助

我遇到过一个网站,在那里我需要与页面上的对象进行交互,以获取更多信息。以下网站就是一个例子:

如果您访问该网站并进入底部,则会有更多品牌,单击“查看”将显示其他产品。单击后,仅返回这些文件的
HTML

对于其他网站,我使用以下方法从中获取信息执行页面对象操作后,是否有办法通过XML HTTP方法处理页面?

任何帮助都将不胜感激。目前,我假设我将不得不坚持使用InternetExplorer对象来抓取此类网站

选项显式
公共分公司sbKF()
Dim conn作为ADODB连接
将rsIn设置为ADODB.Recordset
将HTMLDoc设置为HTMLDocument
暗弦
作为字符串的Dim strPost
Set conn=CurrentProject.Connection
Set rsIn=New ADODB.Recordset
设置HTMLDoc=New MSHTML.HTMLDocument
rsIn.开放式pcstrInput、conn、adOpenStatic、adLockReadOnly
rsIn.MoveLast:rsIn.MoveFirst
不做rsIn.EOF
'为输入大小创建URL和Post提交。
strUrl=”http://www.[Site].com“
strPost=“阶段=2&sop=TyreSize&ssq=1&vnp=&vmk=&vch=&vmo=&drd=”
'返回文档正文结果
HTMLDoc.body.innerHTML=fnPostXmlHttp(strUrl,strPost)
下一个
环
端接头
公共函数fnPostXmlHttp(ByVal strUrl作为字符串,ByVal strScript作为字符串)
Dim XMLHttpRequest作为对象
像弦一样的暗弦
设置XMLHttpRequest=CreateObject(“MSXML2.XMLHTTP”)
XMLHttpRequest.Open“POST”,strUrl,False
XMLHttpRequest.setRequestHeader“内容类型”、“应用程序/x-www-form-urlencoded”
XMLHttpRequest.send(strScript)
而XMLHttpRequest.ReadyState 4
多芬特
温德
fnPostXmlHttp=XMLHttpRequest.responseText
端函数

如果您查看www.blackcircles.com的HTML响应,您将看到javascript代码片段:

。。。
var newTyresActionUrl;
var查找地址;
$(文档).ready(函数(){
newTyresActionUrl=new BC.classes.productV6SearchPage('https://www.blackcircles.com/order/tyres',
{“Error”:false,“VariantFitments”:[{“Name”:“All Season”,“VariantType”:11,“SeasonalType”:true,“TruckType”:false,“FriendlyName”:“allseason”,“Count”:17,
...
“TakeoverCss”:“\u003clink id=\“brandtakeover css\”rel=\u0027样式表\u0027类型=\u0027text/css\u0027 href=\u0027/templates/bcstyles/css/goodyear effgrip perf.css\u0027\u003e”,
“宽度”,
“个人资料”,
“边缘”,
“速度”,
“方法”,
是的,
""
);
addToBasket=new BC.classes.addToBasket('https://www.blackcircles.com/order/tyres“订单”、“卡车/车库”);
...
实际上,大括号内的部分表示一个JSON对象,其中包含网页数据上显示的所有内容,解析它,转换为数组并输出到工作表,如下面的示例代码所示。将模块导入VBA项目以进行JSON处理。

选项显式
子测试_黑圈()
作为字符串的Dim sResp
Dim vJSON作为变量
将状态设置为字符串
我想我会坚持多久
暗黄
Dim aData()
Dim aHeader()
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.blackcircles.com/order/tyres/search?width=205&profile=55&rim=R16&speed=V&vehicle-make=&postcode=&delivery=1&findTyre=,False
.发送
sResp=.responseText
以
sResp=getFragment(sResp,“new BC.classes.productV6SearchPage”,“new BC.classes.addtobasket”)
sResp=getFragment(sResp,“{”,“}”)
sResp=“{”&sResp&“}”
解析sResp、vJSON、sState
i=1
附页(1)
.Cells.Delete
.Cells.WrapText=False
对于数组中的每个vItem(_
“制造商”_
“汽车制造商”_
“全部”_
“交易”_
“最佳”_
“休息”_
“搜索参数”_
)
.Cells(i,1)。值=vItem
JSON.ToArray vJSON(vItem),aData,aHeader
输出阵列单元(i+2,1),A头
输出2darray.Cells(i+3,1),aData
.Columns.AutoFit
i=i+UBound(aData,1)+5
下一个
以
端接头
子输出阵列(oDstRng作为范围,aCells作为变型)
使用oDstRng
.Parent.Select
使用.Resize(1,UBound(aCells)-LBound(aCells)+1)
.NumberFormat=“@”
.Value=aCells
以
以
端接头
子输出2dArray(oDstRng作为范围,aCells作为变体)
使用oDstRng
.Parent.Select
使用。调整大小(_
UBound(aCells,1)-LBound(aCells,1)+1_
UBound(aCells,2)-LBound(aCells,2)+1)
.NumberFormat=“@”
.Value=aCells
以
以
端接头
函数getFragment(_
sourceText作为字符串_
起始模式为字符串_
endPattern作为字符串_
)作为字符串
暗星
startPos=InStr(sourceText,startPattern)
如果startPos=0,则退出函数
变暗部分文本
partText=Mid(源文本、startPos+Len(startPattern))
暗尾端
endPos=InStrRev(零件文本,endPattern)
如果endPos=0,则退出函数
getFragment=Left(partText,endPos-1)
端函数

顺便说一句,应用了类似的方法。

网站API的可用性使web抓取更加简单。如果您通过XHR从网站获取数据,那么