Excel VBA网页抓取问题
我正在构建一个VBA网络刮板来抓取一个项目的所有名称和价格。我是VBA的新手,对这个查询的最终细节有疑问 我想让它访问这个刀的网站,把名字和价格,并存储在表上,移动到下一个项目,一旦在该页上完成,继续到下一页,直到所有项目都已刮掉。有人能指出我在完成这个项目时犯的错误吗Excel VBA网页抓取问题,excel,vba,Excel,Vba,我正在构建一个VBA网络刮板来抓取一个项目的所有名称和价格。我是VBA的新手,对这个查询的最终细节有疑问 我想让它访问这个刀的网站,把名字和价格,并存储在表上,移动到下一个项目,一旦在该页上完成,继续到下一页,直到所有项目都已刮掉。有人能指出我在完成这个项目时犯的错误吗 Sub printnumbs() ' Dim i As Integer For i = 0 To 10 Range("D6").Offset(0, (i * 2)).Value = i + 2 Next i ' End S
Sub printnumbs()
'
Dim i As Integer
For i = 0 To 10
Range("D6").Offset(0, (i * 2)).Value = i + 2
Next i
'
End Sub
Sub scrape()
Dim i2 As Integer
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
With ie
.Visible = True
For i2 = 1 To 2
'Max is For i2 = 0 To 400
.navigate "https://www.knifecenter.com/kc_new/store_store.html?ttl=Hunting%20and%20Bushcraft%20Knives&desc=Hunting%20Bushcraft&wnWWWCAT_1datarq=video&wnWWWCAT_1datarq=notepad&s=" & (i2 + (i2 * 30))
Application.Wait (Now + TimeValue("0:00:02"))
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Dim doc As HTMLDocument
Set doc = ie.document
While ie.readyState <> 4
Wend
On Error Resume Next
Dim i As Integer
For i = 0 To 29
Range("B9").Offset(i + (i2 * 30), (0)).Value = doc.getElementsByClassName("maincontent")(0).getElementsByClassName("product_listing")(0).getElementsByClassName("row-fluid")(0).getElementsByClassName("listing_item span4")(0).getElementsByClassName("price-row")(0).getElementsByClassName("left-col")(0).innerText
Range("C9").Offset(i + (i2 * 30), (0)).Value = doc.getElementsByClassName("maincontent")(0).getElementsByClassName("product_listing")(0).getElementsByClassName("row-fluid")(0).getElementsByClassName("listing_item span4")(0).getElementsByClassName("price-row")(0).getElementsByClassName("product_name")(0).innerText
Next i
Next i2
ie.Quit
Application.EnableEvents = True
End With
'
End Sub
Sub printnumbs()
'
作为整数的Dim i
对于i=0到10
范围(“D6”)。偏移量(0,(i*2))。值=i+2
接下来我
'
端接头
次级刮伤()
作为整数的Dim i2
模糊的物体
设置ie=CreateObject(“InternetExplorer.Application”)
与ie
.Visible=True
对于i2=1到2
'最大值适用于i2=0到400
.导航“https://www.knifecenter.com/kc_new/store_store.html?ttl=Hunting%20and%20Bushcraft%20Knives&desc=Hunting%20Bushcraft&wnWWWCAT_1datarq=video&wnWWWCAT_1datarq=notepad&s=“&(i2+(i2*30))
Application.Wait(现在+时间值(“0:00:02”))
做
多芬特
循环直到ie.readyState=readyState\u完成
作为HTMLDocument的Dim doc
Set doc=ie.document
而ie.readyState 4
温德
出错时继续下一步
作为整数的Dim i
对于i=0到29
范围(“B9”)。偏移量(i+(i2*30),(0))。值=doc.getElementsByClassName(“主要内容”)(0)。getElementsByClassName(“产品列表”)(0)。getElementsByClassName(“行流体”)(0)。getElementsByClassName(“列表项跨度4”)(0)。getElementsByClassName(“价格行”)(0)。getElementsByClassName(“左列”)(0)。innerText
范围(“C9”)。偏移量(i+(i2*30),(0))。值=doc.getElementsByClassName(“maincontent”)(0)。getElementsByClassName(“产品列表”)(0)。getElementsByClassName(“行流体”)(0)。getElementsByClassName(“列表项span4”)(0)。getElementsByClassName(“价格行”)(0)。getElementsByClassName(“产品列表项”)(0)。innerText
接下来我
下一个i2
即退出
Application.EnableEvents=True
以
'
端接头
为什么需要自定义VBA从这样的站点获取数据。自动化流程所需的代码在其他站点上不起作用(因为每个站点的设置都不同),也不值得花时间开发和保持代码。这绝对不是一个初学者的项目
有时候,好的旧拷贝和粘贴可以很好地发挥作用。转到网页,CTRL+A CTRL+C,在Excel中右键单击,粘贴特殊内容,文本。重复。
完成后,删除不需要的行,或者制作简单的公式来告诉哪些行有您的数据
这里是所有的“名称+价格”从所有6页上的链接,你发送。我花了更多的时间写出这个答案,而不是获得数据:
Sub Web_Data()
Const URL As String = "https://www.knifecenter.com/kc_new/store_store.html?ttl=Hunting%20and%20Bushcraft%20Knives&desc=Hunting%20Bushcraft&wnWWWCAT_1datarq=video&wnWWWCAT_1datarq=notepad&s="
Dim http As New XMLHTTP60, html As New HTMLDocument, page As Long, row As Long
Dim topic As HTMLHtmlElement
For page = 1 To 151 Step 30
With http
.Open "GET", URL & page, False
.send
html.body.innerHTML = .responseText
End With
For Each topic In html.getElementsByClassName("listing_item span4")
With topic.getElementsByClassName("product_name")
If .Length Then row = row + 1: Cells(row, 1) = .Item(0).innerText
End With
With topic.getElementsByClassName("our_price")
If .Length Then Cells(row, 2) = .Item(0).innerText
End With
Next topic
Next page
End Sub
你知道如何将数据从这里复制到Excel吗?这个网站不是最容易抓取的。为了节省时间,我用
class=“listing\u item span4”
遍历了所有div,并解析了它们的内部文本
我建议您观看以下视频:
试试看。如果有可靠的方法,为什么要坚持使用IE。获取所有数据的时间不应超过5秒:
Sub Web_Data()
Const URL As String = "https://www.knifecenter.com/kc_new/store_store.html?ttl=Hunting%20and%20Bushcraft%20Knives&desc=Hunting%20Bushcraft&wnWWWCAT_1datarq=video&wnWWWCAT_1datarq=notepad&s="
Dim http As New XMLHTTP60, html As New HTMLDocument, page As Long, row As Long
Dim topic As HTMLHtmlElement
For page = 1 To 151 Step 30
With http
.Open "GET", URL & page, False
.send
html.body.innerHTML = .responseText
End With
For Each topic In html.getElementsByClassName("listing_item span4")
With topic.getElementsByClassName("product_name")
If .Length Then row = row + 1: Cells(row, 1) = .Item(0).innerText
End With
With topic.getElementsByClassName("our_price")
If .Length Then Cells(row, 2) = .Item(0).innerText
End With
Next topic
Next page
End Sub
要添加到库中的引用:
1. Microsoft HTML Object Library
2. Microsoft XML, V6.0 ''Or whatever version you have
这只是我需要的基本版本。我开始在这个领域的业务,并希望了解从这个网站和其他网站的所有刀具,工具和其他配件的平均价格。我希望这个网站能够正常工作,这样我就可以更好地理解这个查询,这样我就可以将它更新到我需要的任何网页,以获得我需要的数据。这不像有一个神奇的“从所有页面中刮取数据”关键字。每个页面的设置都不同,您需要掌握一些VBA编码技能,以便使代码适应不同的页面。如果这能激励你学习,那就太好了!如果您正在寻找一种更快的方法,请复制并粘贴。谢谢您的帮助。不,我不知道如何快速地将数据复制并粘贴到Excel中,我也不知道如何用几个简单的公式来组织数据,所以我选择了VBA路线。显然,我在用VBA编写时有点过火,但如果你能解释一下快速组织数据的方法,我会很感激。没问题,过度思考问题是一个常见的错误,因为有些人倾向于跳转到简单问题的复杂解决方案。我可以根据我自己的经验说,让解决方案尽可能简单会让你省去很多麻烦。您以前使用过Excel Web查询吗?你有没有检查过为网页抓取而构建的众多应用程序和插件(比如Firefox和Chrome)呢?没有。我从来不知道它们的存在。你喜欢哪一个?我没有试过,因为我不需要。关键是,谷歌搜索是一个起点,它可以查看现有的解决方案,并了解更多有关该过程的信息。非常感谢你!这是完美的,将是我需要保持跟踪所有这些信息
1. Microsoft HTML Object Library
2. Microsoft XML, V6.0 ''Or whatever version you have