如何在网站上设置下拉框,以便选择选项并抓取数据

时间:2019-05-29 16:06:06

标签: html excel vba web-scraping

网站已更改,因此我无法再从中抓取数据。我相信只需要更改下面的设定线,但尝试了许多操作,但都没有成功。恐怕我对这方面的知识不是很了解,但是其余代码仍在工作。例如url为https://www.gurufocus.com/stock/CFWFF/insider,它是内幕交易表,我正尝试按其下拉列表并将其更改为100而不是10:

t = Timer
noTable = 0
Do
    Set DropDown = doc.querySelectorAll(".el-dropdown-menu__item")
    lastDropDrownItemIndex = DropDown.Length - 1
    If Timer - t > MAX_WAIT_SEC Then
        noTable = 1
        Exit Do
    End If
Loop While lastDropDrownItemIndex < 1
If noTable = 1 Then GoTo noTableEscape
DropDown.Item(lastDropDrownItemIndex).Click

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,不确定您到底要做什么,但是在您抓取的网站上提供了API,我认为这可能会使您的生活更加轻松。简而言之,这意味着它提供了一种使用URL中嵌入的一些参数来请求数据的简便方法。它以JSON格式返回请求的数据。

在以下代码中,我将使用XMLHTTP请求方法和JSON解析器。为此,您将需要以下内容:

  1. JSON parser,它可以帮助您解析下载的数据。按照安装说明将其导入您的项目中
  2. Microsoft Scripting Runtime库的引用。 JSON解析器需要它。
  3. Microsoft WinHTTP Services, Version 5.1库的引用。它使您可以使用HTTP请求对象。

出于演示目的,以下代码将仅在立即窗口中显示第一个条目的名称和位置。您可以修改代码以适合您的需求。

Sub test()
Dim req As New WinHttpRequest
Dim jsonResponse As String
Dim jsonParsed As Object
Dim url As String
Dim pageNum As Integer
Dim numPerPage As Integer
pageNum = 1 'You can change this parameter to navigate in different pages
numPerPage = 100 'You can change this parameter to control the number of entries
url = "https://www.gurufocus.com/reader/_api/stocks/OTCPK:CFWFF/insider?page=" & pageNum & "&per_page=" & numPerPage & "&sort=date%7Cdesc"

With req
    .Open "GET", url, False
    .setRequestHeader "Accept", "application/json, text/plain, */*"
    .setRequestHeader "Authorization", ThisWorkbook.Worksheets("The name of your Worksheet").Range("A1").Value 'I have stored a string that is essential to the request in cell A1
    .send
    jsonResponse = .responseText
End With
Set jsonParsed = JsonConverter.ParseJson(jsonResponse)
Debug.Print jsonParsed("data")(1)("name") 'get the name parameter of the first entry
Debug.Print jsonParsed("data")(1)("position") 'get the position parameter of the first entry

End Sub

请注意,对于我的请求,有一个很长的字符串,该字符串已存储在单元格A1中。该字符串如下所示:

  

轴承   eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImUxYjAwMmYxMjczMGRiMTBmMmZkYjJkNDk0YTU4NjRmZDZjOWY3ZGI4ZmI1NDY1NTQ2MzZlMGJhNzkxODUxNmY4NTM2ZWIzZDNhODhmN2VmIn0.eyJhdWQiOiIyIiwianRpIjoiZTFiMDAyZjEyNzMwZGIxMGYyZmRiMmQ0OTRhNTg2NGZkNmM5ZjdkYjhmYjU0NjU1NDYzNmUwYmE3OTE4NTE2Zjg1MzZlYjNkM2E4OGY3ZWYiLCJpYXQiOjE1NTkwNzA3OTcsIm5iZiI6MTU1OTA3MDc5NywiZXhwIjoxNTY5NDM4NzkzLCJzdWIiOiIiLCJzY29wZXMiOltdfQ.mZ4DqhUk9YAU6JYDBScF8MJ_zHPyL94bAec7LxZTaWipcWf9uesdGDMDC9v_7W-6zrtXAUWhk4YAL70E5rpPjM7gusYH0RfO48O2PnaV8gsqXoNCFwFBOHuxh109q7X0YsNkfX2wX8m3XigtK9A_YAGID7wxgX96lwzBevsDJ3borHMcJlQtxidF_Bq2D5WPASsuy3jdY80HkOCR1y4eaSIswBEtK5rPj_xy7VXRbYGhLklqw4wgHgq4blfaHnVVmPXf6k8mx45ye8vPecS-w9kjuDOHVn2mvU6mpBzqEpbH4lqpiqmYG7M-CvB1joEAcMQtcilCvsdfKOusoC2MU4_vPtF3Q4ZFVaEcXIQgomdKtFa_XGpCudit45b2rEFacKMUENqLj_sPwYkgM1IPl1lQfR-VpigqnCHPAxVQAPzqwJvS6CxuYOPmvnrx23fBAillP7LtDHwHtlMpgZUjdB5y6IWsia76crM4kbkrKn3zc8xoAGb1fIrgJlY-9hOzrwsmrchantEdYOFZjcMJvhCnlfvnEm6kT2Sdcu4o6TndTZJjrVmD4mb-jNGy4kw_mAx1DfyqR7GLtCVSzcSLKgrrwCJEL22K2bfXH 2HExXvgLFbPXivVZJc70TnF9lJmx_dx79cxAm7szFGIdrs56bAC4mdKpvKL3BNmVY-J-G0

相同的字符串也应该对您有用。

结果如下:

Brown, James Michael
Senior Officer

100个数据条目中的每个条目都具有以下结构:

enter image description here

遍历所有条目也很容易。例如,要打印所有条目的名称,您将必须执行以下操作:

Dim item As Object
For Each item In jsonParsed("data")
    Debug.Print item("name")
Next item

最后,您还可以遍历每个条目的所有参数。例如,以下代码为第一个条目打印所有参数及其对应的值:

Dim key As Variant
For Each key In jsonParsed("data")(1).Keys
    Debug.Print key & ": " & jsonParsed("data")(1)(key)
Next key 

这样,您基本上可以访问每个条目所需的任何参数。