Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel VBA网页抓取问题_Excel_Vba - Fatal编程技术网

Excel 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

我正在构建一个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 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