Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 25
1
Excel

По ключевым словам осуществляется поиск информации в сети интернет и первые 10 ссылок заносятся в базу данных

20.04.2023, 22:04. Показов 741. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет, пишу курсовую, идея которой изложена в заголовке. В общем у меня уже нет идей как это можно реализовать, пытался парсить гугл, очень сложно и в ссылках всякий мусор(код ниже), с яндексом парсинг должен быть проще, но там проблема в том, что никак в ссылке не получается передать запрос, писать надо код на VBA, но я пытался и на питоне, но тоже шлак вышел. тема курсовой если вдруг нужна вот: Создание информационной технологии для формирования базы данных информационных ресурсов (по ключевым словам осуществляется поиск информации в сети интернет и первые 10 ссылок заносятся в базу данных)

у меня простая юзерформа, где есть текстбокс и командбтн, когда нажимаешь на кнопку открывается эксплорер(специально сделал видимым пока что)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Private Sub CommandButton1_Click()
    Dim ie As Object ' Объект Internet Explorer
    Dim html As Object ' Объект HTMLDocument
    Dim linkTags As Object ' Коллекция тегов <a> (гиперссылки)
    Dim linkTag As Object ' Объект HTMLLinkElement
    Dim myText As String
    Dim i As Integer
    Dim ws As Worksheet ' Рабочий лист
 
    ' Создаем экземпляр Internet Explorer
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True ' Делаем окно Internet Explorer видимым
 
    ' Открываем веб-страницу
    myText = TextBox1.Value
 
    ' Заменяем все пробелы на знак +
    For i = 1 To Len(myText)
        If Mid(myText, i, 1) = " " Then
            myText = Replace(myText, " ", "+")
        End If
    Next i
 
    ie.Navigate "https://www.google.com/search?q=" & myText ' Здесь указываем URL страницы, которую хотим спарсить
 
    ' Ждем, пока страница загрузится полностью
    Do While ie.Busy Or ie.readyState <> 4
        DoEvents
    Loop
 
    ' Получаем объект HTMLDocument из текущей веб-страницы
    Set html = ie.document
 
    ' Создаем или находим лист "база данных"
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("база данных")
    On Error GoTo 0
    If ws Is Nothing Then
        ' Если лист не существует, создаем новый лист
        Set ws = ThisWorkbook.Sheets.Add(, ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "база данных"
    End If
 
    ' Находим последнюю заполненную строку в столбце A на листе "база данных"
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row + 1
 
    ' Находим коллекцию тегов <a> (гиперссылки)
    Set linkTags = html.getElementsByTagName("a")
 
    ' Записываем ссылки в столбец A на лист "база данных"
    Dim linkText As String
    For i = 0 To 20
        Set linkTag = linkTags.Item(i)
        linkText = linkTag.href ' Извлекаем значение атрибута href (ссылка)
        ws.Cells(lastRow, 1).Value = linkText ' Записываем ссылку на лист "база данных"
        lastRow = lastRow + 1
    Next i
 
    ' Освобождаем ресурсы
    ' ie.Quit
    Set linkTag = Nothing
    Set linkTags = Nothing
    Set html = Nothing
    Set ie = Nothing
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2023, 22:04
Ответы с готовыми решениями:

поиск по ключевым словам в базе данных
Добрый день! Помогите, пожалуйста, разобраться . я пишу поисковик по ключевым словам по базе данных...

Фильтрация данных: поиск записей Vk по ключевым словам
Добрый день! Пишу скрипт поиска записей вк по ключевым словам.Столкнулся с проблемой, если наше...

Поиск по ключевым словам и запись данных в файл (python)
Добрый день. Я начинающий кодер на python. Мне требуется помощь. Я пишу бота для Telegram, мне...

Реализовать поиск данных по ключевым словам на компьютере и в интернете
Получится ли написать программу с интерфэйсом?Ну что-то пишешь,а она отвечает ну или по словам...

5
14 / 10 / 4
Регистрация: 19.07.2016
Сообщений: 101
21.04.2023, 13:31 2
Не вижу трудности, заменить гугл на яндекс. Всё работает

ie.Navigate "https://yandex.by/search/?text=" & myText
1
831 / 323 / 42
Регистрация: 10.05.2021
Сообщений: 1,408
Записей в блоге: 10
21.04.2023, 13:46 3
Snaypi, здравствуйте
Цитата Сообщение от Snaypi Посмотреть сообщение
Visual Basic
1
2
3
4
5
For i = 1 To Len(myText)
   If Mid(myText, i, 1) = " " Then
      myText = Replace(myText, " ", "+")
   End If
Next i
красота
Достаточно одной строки вместо цикла: myText = Replace(myText, " ", "+")
1
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 25
21.04.2023, 14:16  [ТС] 4
Цитата Сообщение от Jack Famous Посмотреть сообщение
красота
Достаточно одной строки вместо цикла: myText = Replace(myText, " ", "+")
Да я по вба не спец, так что вот так накатил

Добавлено через 8 минут
Цитата Сообщение от Fck_This Посмотреть сообщение
Не вижу трудности, заменить гугл на яндекс. Всё работает
ie.Navigate "https://yandex.by/search/?text=" & myText
И правда, идет поиск. Я просто смотрел через эксплорер, а там в url кодировке шел поиск.
В общем, если сделать так, то поиск идет, ссылки добавляет, но проблема в том что тегов <a> очень много и них хранятся не только ссылки на страницы, но и какие-то яндексовские ссылки. Чтобы отобрать нужные теги <a> надо сначала пропарсить все теги <li> потом найти тег <div class="Organic organic Typo Typo_text_m Typo_line_s i-bem" data-bem="{&quot;organic&quot;:{}}"> внутри этого еще один <div class="VanillaReact OrganicTitle OrganicTitle_multiline Typo Typo_text_l Typo_line_m organic__title-wrapper"> и наконец оттуда взять тег <a> и достать аттрибут href. Сложность в том, что вообще нет мыслей как забрать именно их.
0
14 / 10 / 4
Регистрация: 19.07.2016
Сообщений: 101
21.04.2023, 16:28 5
Лучший ответ Сообщение было отмечено Snaypi как решение

Решение

Цитата Сообщение от Snaypi Посмотреть сообщение
Да я по вба не спец, так что вот так накатил

Добавлено через 8 минут

И правда, идет поиск. Я просто смотрел через эксплорер, а там в url кодировке шел поиск.
В общем, если сделать так, то поиск идет, ссылки добавляет, но проблема в том что тегов <a> очень много и них хранятся не только ссылки на страницы, но и какие-то яндексовские ссылки. Чтобы отобрать нужные теги <a> надо сначала пропарсить все теги <li> потом найти тег <div class="Organic organic Typo Typo_text_m Typo_line_s i-bem" data-bem="{&quot;organic&quot;:{}}"> внутри этого еще один <div class="VanillaReact OrganicTitle OrganicTitle_multiline Typo Typo_text_l Typo_line_m organic__title-wrapper"> и наконец оттуда взять тег <a> и достать аттрибут href. Сложность в том, что вообще нет мыслей как забрать именно их.
Неправда всё это
Вот так получаем линки на элемент ссылки
Visual Basic
1
2
3
4
5
6
Set linksClass = HTML.getElementsByClassName("link serp-item__title-link")
If linkTags.Length > 0 Then
For iEach = 0 To linksClass.Length
   MsgBox linksClass(iEach).href
Next iEach
End If
По сути linkClass содержит те самые ссылки

Добавлено через 18 минут
Поправочка
По сути linkClass содержит те самые ссылки. Единственный нюанс, у меня в IE 10 ссылок на страницу. Получается, что если нужно 20 - нужно перейти на вторую и повторить процесс, тогда организуем цикл
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
sMyText = "купить+покемона"
sLink = "https://yandex.by/search/?text=" & sMyText & "&lr=157&" 
For iRepeat = 1 to 2
   sLink = sLink & "p=" & iRepeat - 1
   Set linksClass = HTML.getElementsByClassName("link serp-item__title-link")
   If linkTags.Length > 0 Then
      For iEach = 0 To linksClass.Length
         MsgBox linksClass(iEach).href
      Next iEach
   End If
Next iRepeat
Обращаю ваше внимание на добавку lr=157 - это показатель региона запроса. Вам нужно указать какой-либо и лучше для своего, поскольку без него мне сразу антиспам пришёл. Если не лень заморачиваться - можно взять таблицу региона и парсить ещё и lr для каждого пользователя, который это будет юзать. Ну и немного ждать между запросами, наверное. Для этого можно таймер добавить

Добавлено через 4 минуты
Ах да, ещё говорят Selenium библиотека есть под VBA. Для навигации и парсинга подходит, причём можно даже и не в IE, а банально в хроме\мозилле. Сам не пользовался пока что, руки не дошли, только скачал, т.к. задача, возможно, такая появится.
1
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 25
21.04.2023, 17:31  [ТС] 6
В общем я сейчас поизучал и изменил немного код. В теории все должно быть идеально вба ищет класс Link Link_theme_normal OrganicTitle-Link organic__url link i-bem, который находится в теге <a>, где есть атрибут href, и я получаю ту самую ссылку, но в строке 59 ошибка "Object variable or With block variable not set", и я не понимаю как ее пофиксить. Как я понял объект пуст, но почему?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Private Sub CommandButton1_Click()
    Dim ie As Object ' Объект Internet Explorer
    Dim html As Object ' Объект HTMLDocument
    Dim linkTags As Object ' Коллекция тегов <a> (гиперссылки)
    Dim linkTag As Object ' Объект HTMLLinkElement
    Dim myText As String
    Dim i As Integer
    Dim ws As Worksheet ' Рабочий лист
 
    ' Создаем экземпляр Internet Explorer
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True ' Делаем окно Internet Explorer видимым
 
    ' Открываем веб-страницу
    myText = TextBox1.Value
 
    ' Заменяем все пробелы на знак +
    For i = 1 To Len(myText)
        If Mid(myText, i, 1) = " " Then
            myText = Replace(myText, " ", "+")
        End If
    Next i
 
    ie.Navigate "https://yandex.ru/search/?text=" & myText ' Здесь указываем URL страницы, которую хотим спарсить
 
    ' Ждем, пока страница загрузится полностью
    Do While ie.Busy Or ie.readyState <> 4
        DoEvents
    Loop
 
    ' Получаем объект HTMLDocument из текущей веб-страницы
    Set html = ie.Document
 
    ' Создаем или находим лист "база данных"
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("база данных")
    On Error GoTo 0
    If ws Is Nothing Then
        ' Если лист не существует, создаем новый лист
        Set ws = ThisWorkbook.Sheets.Add(, ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "база данных"
    End If
 
    ' Находим последнюю заполненную строку в столбце A на листе "база данных"
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row + 1
 
    ' Находим коллекцию тегов <a> (гиперссылки)
    Set linkTags = html.getElementsByClassName("Link Link_theme_normal OrganicTitle-Link organic__url link i-bem")
    
 
    ' Записываем ссылки в столбец A на лист "база данных"
    Dim linkText As String
    Dim linkClass As Object
    Dim classText As String
    
    For i = 0 To 20
        Set linkTag = linkTags.Item(i)
        linkText = linkTag.href ' Извлекаем значение атрибута href (ссылка)
        ws.Cells(lastRow, 1).Value = linkText ' Записываем ссылку на лист "база данных"
        lastRow = lastRow + 1
    Next i
 
    ' Освобождаем ресурсы
    ' ie.Quit
    Set linkTag = Nothing
    Set linkTags = Nothing
    Set html = Nothing
    Set ie = Nothing
End Sub
Добавлено через 5 минут
Цитата Сообщение от Fck_This Посмотреть сообщение
Вот так получаем линки на элемент ссылки
Visual BasicВыделить код
1
2
3
4
5
6
Set linksClass = HTML.getElementsByClassName("link serp-item__title-link")
If linkTags.Length > 0 Then
For iEach = 0 To linksClass.Length
   MsgBox linksClass(iEach).href
Next iEach
End If
По сути linkClass содержит те самые ссылки
Не видел ваш ответ, сейчас попробую так накатить
0
21.04.2023, 17:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2023, 17:31
Помогаю со студенческими работами здесь

Поиск данных по ключевым словам, их обработка и вывод результатов в другой файл
Здравствуйте! Подскажите как можно решить такую задачу - имеется 2 файла, в одном таблица с...

Какие бывают методы поиска и анализа информации по ключевым словам
Нужны именно научные методы и алгоритмы. И какие из них оптимальны и почему?

Поиск по ключевым словам
Вот сообственно поиск по ключевому слову через запросы sql,как организовать его вывод в на экран...

Поиск по ключевым словам
Я использую функцию if (_tcsstr(pBook-&gt;ptszWord, m_Find)=NULL) bFound = FALSE; ...

Поиск по ключевым словам
Я создал таблицу в mysql под названием `search` с четырьмя столбиками `id`, `title`, `description`,...

Поиск по ключевым словам
Здравствуйте! как сделать поиск файлов по ключевым словам? и чтобы эти ключевые слова читались из...

Поиск по ключевым словам
Добрый день имеется лог файл, в который записывается все, что набиралось на клавиатуре. Допустим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru