Всем привет.
Так как нужны парсеры, собственно начал изучать эту тему.
Ну с простыми запросами проблем нет, делаешь запрос - разбираешь ответ.
Но сейчас многие сайты (если не большинство) работают с js. Мой старый разработчик писал мне парсеры к сайтам, ответ которых парсился как раз через JsonConverter. Но даже разобрав его парсеры я не смог понять как именно посылать запрос к серверу чтобы он вернул текст для разбора.
Подскажите, пожалуйста, кто разбирается в теме куда копать, что почитать? Может строчку где искать в Source соде страницы нужную?
В идеале хотелось бы не циклом запросы делать а парсить страницу
Для тестов создал файл, который парсит продукты магазина. Сразу скажу что сделал я его очень костыльно ибо запросы находятся в цикле котрый идет по номерам товаров каталога, так что там особо заморачиваться с разбором ответа не стал, написал так чтобы было нормально.
Буду благодарен любому совету.
Прикладываю файл и текущий код.
Так как нужны парсеры, собственно начал изучать эту тему.
Ну с простыми запросами проблем нет, делаешь запрос - разбираешь ответ.
Но сейчас многие сайты (если не большинство) работают с js. Мой старый разработчик писал мне парсеры к сайтам, ответ которых парсился как раз через JsonConverter. Но даже разобрав его парсеры я не смог понять как именно посылать запрос к серверу чтобы он вернул текст для разбора.
Подскажите, пожалуйста, кто разбирается в теме куда копать, что почитать? Может строчку где искать в Source соде страницы нужную?
В идеале хотелось бы не циклом запросы делать а парсить страницу
Для тестов создал файл, который парсит продукты магазина. Сразу скажу что сделал я его очень костыльно ибо запросы находятся в цикле котрый идет по номерам товаров каталога, так что там особо заморачиваться с разбором ответа не стал, написал так чтобы было нормально.
Буду благодарен любому совету.
Прикладываю файл и текущий код.
| Код |
|---|
Option Explicit
Const NF As String = "NOT FOUND"
Sub StartPars()
Const StURL As String = "https://5ka.ru/special_offers/"
Dim ReqRes$, tmpName$
Dim MyRequest
Dim x&, lr&
Dim r As Range
If Not IsEmpty([A2]) Then Range("A2").Resize(Cells(Rows.Count, 1).End(xlUp).Row, 3).ClearContents
Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
For x = 616 To 617 '17000
MyRequest.Open "GET", StURL & x & "/"
MyRequest.send
ReqRes = MyRequest.responsetext
lr = Cells(Rows.Count, 1).End(xlUp).Row + 1
tmpName = ClearResp(GetParsInfo(ReqRes, "<a href=""/special_offers/" & x & "/"">", "</a>"))
If Not tmpName = NF Then
Set r = Cells(lr, 1).Offset()
r(, 1) = tmpName
r(, 2) = GetParsInfo(ReqRes, "<span data-price=""", """ class=""cost")
r(, 3) = ClearResp(GetParsInfo(ReqRes, "<span class=""cost__brake"">", "</sup></span>"), "<sup>", True)
r(, 4) = x
If IsNumeric(r(, 2)) And IsNumeric(r(, 3)) Then r(, 5) = r(, 2) / r(, 3)
End If
ReqRes = ""
Next
End Sub
Function GetParsInfo(ParseResponse As String, StartStr As String, EndStr As String) As String
Dim st&, et&
On Error GoTo errH
st = Application.WorksheetFunction.Search(StartStr, ParseResponse) + Len(StartStr)
et = Application.WorksheetFunction.Search(EndStr, Mid(ParseResponse, st, Len(ParseResponse) - st))
GetParsInfo = Mid(ParseResponse, st, et - 1)
Exit Function
errH:
GetParsInfo = NF
End Function
Function ClearResp(ResponseStr As String, Optional delim As String = """, Optional ReplD As Boolean = False) As String
Dim NewStr$, tmpRepl$
Dim x&
Dim tmpStr As Variant
On Error GoTo errH
If ReplD Then tmpRepl = "." Else tmpRepl = ""
For Each tmpStr In Split(ResponseStr, delim)
x = x + 1
If x > 1 Then NewStr = NewStr & tmpRepl & tmpStr Else NewStr = NewStr & tmpStr
Next
ClearResp = NewStr
Exit Function
errH:
ClearResp = ResponseStr
End Function
|
Изменено: - 29.11.2017 17:12:35