Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Google Patent Treffer je Zeile anzeigen

Google Patent Treffer je Zeile anzeigen
06.06.2019 14:01:22
Laura
Hallo zusammen,
ich habe ein Problem, was so ähnlich schon einmal im Forum gelöst wurde:
https://www.herber.de/forum/archiv/1212to1216/1212237_Google_Treffer_je_Zelle_anzeigen_lassen.html
Das Makro, was ich dann benutzt habe sah so aus:

Sub Patentsuche()
Dim IEApp As Object, result As Object, Zelle As Range
Set IEApp = CreateObject("InternetExplorer.Application")
'IEApp.Visible = True
For Each Zelle In Range("B3:B8")
IEApp.navigate "https://www.google.com/search?tbo=p&tbm=pts&hl=en&q=" & Zelle.Text
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Document.readyState = "complete"
Set result = IEApp.Document.getElementById("resultStats")
If Not result Is Nothing Then Zelle.Offset(0, 1) = result.innerText
Next
IEApp.Quit
Set IEApp = Nothing
End Sub

Das hat auch super funktioniert, wenn ich z. Bsp. auf folgender Seite gesucht habe:
https://www.google.com/search?tbo=p&tbm=pts&hl=en&q=(preparation)+OR+(method*)+AND+(oral)+intitle:flurbiprofen&num=10
Leider muss ich zu Google Patents wechseln, da ich auch nach Jahreszahlen sortieren muss. Und bei https://patents.google.com/?q=(preparation)+OR+(method*)+AND+(oral)+intitle:aspirin
heißt jetzt das Element anders, sodass mir die Zeile
Set result = IEApp.Document.getElementById("resultStats")
natürlich einen Laufzeitfehler gibt. Ich habe versucht auf „count“ zu wechseln oder auf Class(„style-scope search results“), aber ich schaffe es nicht auf der Website etwas auszulesen. Liegt das an der Website oder frage ich das falsche ab?
Vielen Dank im Voraus!
Liebe Grüße,
Laura

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
06.06.2019 16:58:03
Zwenn
Hallo Laura,
Du hast in Deinem ClassName einen Bindestrich vergessen. Nicht "style-scope search results" sondern "style-scope search-results". Das ist aber egal, denn diese CSS-Klasse wird auf der Seite so wahnsinnig oft verwendet, dass sie völlig ungeeignet für Deine Zwecke ist. Deshalb habe ich mir das mal näher angesehen, habe mich im DOM-Inspector durchgeklickt und ein paar Versuche aus Excel heraus für den Seitenaufruf getestet.
Der Such-Container ist in einem Tag namens "section" gekapselt. Das gibt es auch nur einmal auf der Seite. Also kann man es direkt abgreifen. Innerhalb des HTML-Bereichs von "section" werden die Suchtreffer in Tags namens "article" gekapselt. Unter Deinem Testlink gibt es 10 davon. Die kann man in einer For-Each Schleife durchgehen.
Das folgende Makro geht bis zu diesem Punkt und listet den Text jedes article in einer Zelle der aktuellen Tabelle ab A1 nach unten auf:

Sub GooglePatents()
Const googleGrundURL As String = "https://patents.google.com/"
Dim browser As Object
Dim url As String
Dim suchTermURL As String
Dim knotenSectionTag As Object
Dim knotenArticleTags As Object
Dim knotenArticel As Object
Dim zeile As Long
suchTermURL = "?q=(preparation)+OR+(method*)+AND+(oral)+intitle:aspirin"
url = googleGrundURL & suchTermURL
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'URL aufrufen und warten bis Seite vollständig geladen wurde
Set browser = CreateObject("internetexplorer.application")
browser.Visible = True
browser.Navigate url
Do Until browser.ReadyState = 4: DoEvents: Loop
'Manuelle Wartezeit, damit der Suchergebnis-Container nachgeladen werden kann
'Application.Wait (Now + TimeSerial(pause_stunden, pause_minuten, pause_sekunden))
Application.Wait (Now + TimeSerial(0, 0, 3))
'Der Google Suchergebnis-Container steht im ersten und einzigen Tag namens section
Set knotenSectionTag = browser.document.getElementsByTagName("section")(0)
If Not knotenSectionTag Is Nothing Then
'Die Suchtreffer sind in Tags namens article gekapselt
Set knotenArticleTags = browser.document.getElementsByTagName("article")
For Each knotenArticel In knotenArticleTags
zeile = zeile + 1
Cells(zeile, 1).Value = knotenArticel.innertext
Next knotenArticel
Else
MsgBox "kein Treffer"
End If
End Sub

Ich weiß nicht, ob Du ab der Stelle weiter kommst. Aber der HTML-Quelltext eines einzelnen article hat folgenden Aufbau, aus dem Du Dir die gewünschten Werte raussezieren kannst:
(Die Zeilenumbrüche mit den Unterstrichen am Ende kommen von der Forensoftware)

<article class="result style-scope search-result-item">
<state-modifier class="result-title style-scope search-result-item" act='{"type": " _
OPEN_RESULT", "result": "$result"}' data-result="patent/NO156816B/en">
<a class="style-scope state-modifier" id="link" href="#">
<h3 class="style-scope search-result-item">
<raw-html class="style-scope search-result-item">
<span class="style-scope raw-html" id="htmlContent" style="display: inline;">
A method for preparing an oral farmasoeytisk preparation of aspirin.
</span>
</raw-html>
</h3>
</a>
</state-modifier>
<div class="abstract layout horizontal start style-scope search-result-item">
<div class="figureViewButtonWrap style-scope search-result-item">
<img class="thumbnail style-scope search-result-item" style="display: none;" src=""> _
<div class="figureViewButton layout horizontal style-scope search-result-item">
<iron-icon class="style-scope search-result-item x-scope iron-icon-0" icon="icons: _
chevron-right">
<svg xmlns="http://www.w3.org/2000/svg" class="style-scope iron-icon"
style="width: 100%; height: 100%; display: block; pointer-events: none;" viewBox= _
"0 0 24 24"
preserveAspectRatio="xMidYMid meet" focusable="false">
<g class="style-scope iron-icon">
<path class="style-scope iron-icon" d="M 10 6 L 8.59 7.41 L 13.17 12 l -4.58 4. _
59 L 10 18 l 6 -6 Z" />
</g>
</svg>
</iron-icon>
</div>
</div>
<div class="flex style-scope search-result-item">
<h4 class="metadata style-scope search-result-item">
<span class="active style-scope search-result-item">EP</span>
<span class="not_active style-scope search-result-item">US</span>
<span class="active style-scope search-result-item">JP</span>
<span class="active style-scope search-result-item">AU</span>
<span class="not_active style-scope search-result-item">CA</span>
<span class="not_active style-scope search-result-item">DE</span>
<span class="not_active style-scope search-result-item">DK</span>
<span class="not_active style-scope search-result-item">FI</span>
<span class="unknown style-scope search-result-item">GR</span>
<span class="unknown style-scope search-result-item">IE</span>
<span class="unknown style-scope search-result-item">NO</span>
<span class="unknown style-scope search-result-item">NZ</span>
<span class="unknown style-scope search-result-item">PT</span>
<span class="unknown style-scope search-result-item">ZA</span>
<template class="style-scope search-result-item" is="dom-repeat"></template> _
<span class="bullet-before style-scope search-result-item">
<template class="style-scope search-result-item" is="dom-if"></template>
<span class="style-scope search-result-item">NO156816B</span>
<template class="style-scope search-result-item" is="dom-if"></template>
</span>
<span class="style-scope search-result-item">
<span class="bullet-before style-scope search-result-item">
<raw-html class="style-scope search-result-item">
<span class="style-scope raw-html" id="htmlContent" style="display: inline;"& _
gt;
Curt Henry Appelgren
</span>
</raw-html>
</span>
</span>
<span class="style-scope search-result-item">
<span class="bullet-before style-scope search-result-item">
<raw-html class="style-scope search-result-item">
<span class="style-scope raw-html" id="htmlContent" style="display: inline;"& _
gt;
Haessle Ab
</span>
</raw-html>
</span>
</span>
</h4>
<h4 class="dates style-scope search-result-item">
Priority 1981-04-27 • Filing 1982-04-26 • Publication 1987-08-24
</h4>
<template class="style-scope search-result-item" is="dom-if"></template>
<raw-html class="style-scope search-result-item">
<span class="style-scope raw-html" id="htmlContent" style="display: inline;"></ _
span>
</raw-html>
</div>
<template class="style-scope search-result-item" is="dom-if"></template>
<template class="style-scope search-result-item" is="dom-if"></template>
</div>
</article>

Falls Du damit nicht klar kommst, sag mal bescheid, was Du auslesen willst. Am besten dann mit Beispielmappe, in der man sehen kann, welche Werte wo hingeschrieben werden sollen.
Viele Grüße,
Zwenn
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
07.06.2019 09:15:07
Laura
Hallo Zwenn,
erstmal herzlichen Dank für deine Antwort!
Das Makro hilft mir zwar momentan nicht weiter, ist aber trotzdem super interessant und funktioniert einwandfrei (im Moment fragen wir die Daten, die mit deinem Makro ausgelesen werden können über die automatische Web Suche von Excel bei epo ab. Deshalb toll, dass es auch eine Alternative dazu gibt :) Ich werde bei mir auch deinen Vorschlag der Wartezeit einbauen.
Ich habe mal ein Beispiel meiner aktuellen Datei hochgeladen: https://www.herber.de/bbs/user/130271.xlsm
In Spalte B stehen Suchbegriffe, in Spalte C gibt mir das Makro die Anzahl der Ergebnisse die Google gefunden hat und die Dauer der Suche aus, in Spalte D kürze ich das Ganze auf nur die Anzahl.
Jetzt muss ich aber auch einen Zeitraum in den Suchbegriff mitaufnehmen. Mein erster (simpler) Ansatz war einfach die url zu ändern: https://www.herber.de/bbs/user/130272.xlsm
Dabei stoße ich aber auf das Problem, dass die ID nicht mehr existiert und ich schaffe es nicht, das richtige Feld zu finden. Aus deiner vorherigen Antwort gehe ich davon aus, dass du dich damit sehr viel besser auskennst als ich...
Ich hoffe, diesmal habe ich es besser erklärt.
Liebe Grüße,
Laura
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
07.06.2019 10:57:13
Zwenn
Hallo Laura,
man kann die URL einfach um Deinen Datumswunsch ergänzen. Das ist ja nur ein weiterer Parameter. Man kann auch die angezeigten Suchergebnisse pro Seite auf 100 stellen und man kann natürlich auch alle Suchseiten zu einem Suchterm durchgehen.
Was Du aber eigentlich auslesen willst hast Du noch nicht verraten. Es wird doch kaum nur die Menge der Suchtreffer sein. Die Zeit, die Google braucht, um das Ergebnis zu liefern dürfte vermutlich völlig irrelevant sein. Deshalb würde ich Spalte C komplett wegfallen lassen. Je nachdem, ob für unterschiedliche Suchterme unterschiedliche Nach-Diesem-Datum-Werte benötigt werden, kann man eine Spalte für diesen Parameter einführen. Wenn es immer das gleiche Datum ist, würde ich das über eine Zelle festlegen und zur Laufzeit in die URL einbauen.
Das ist aber alles Verwaltung und grundlegender Seitenaufruf. Welche Werte brauchst Du?
Viele Grüße,
Zwenn
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
07.06.2019 11:12:33
Laura
Hallo Zwenn,
es geht wirklich nur um die Anzahl der Suchtreffer... ja, vielleicht etwas trivial :P Da es sich um eine große Anzahl von Suchbegriffen handeln wird, ist es einfacher eine Vorauswahl anhand der Treffer bei Google zu treffen.
Das Datum kann in einer Zelle eingebaut werden, es würde für alle Abfragen das gleiche Datum sein. Es hapert aber bei mir mit dem Einbauen in die URL. Hat das bei dir geklappt?
Spalte C ist nur da, weil es für mich der einfachste Weg war, aber du hast Recht, die Zeit ist uninteressant.
Liebe Grüße,
Laura
AW: Google Patent Treffer je Zeile anzeigen
09.06.2019 22:57:34
Zwenn
Hallo Laura,
ich habe mir heute Zeit genommen, mich mit Deinem kleinen Projekt zu bschäftigen. Was Du möchtest ist nicht trivial. Wenn die Anzahl der Suchergebnisse eben das ist, was Du brauchst, dann werden die ausgelesen. Denn auf welche Inhalte einer Seite man am Ende zugreift spielt keine Rolle. Ich fand das nur ungewöhnlich :-)
Das Datum zur Begrenzung, ab wann Ergebnisse ausgewiesen werden ist ein Parameter, wie der Suchterm. Man kann über Parameter sehr gut gezielte URLs aufbauen, die man auslesen will. Dazu mal die folgende Erklärung zum Aufbau von URLs.
Grundsätzlich gibt es zwei Methoden, wie eine Seite mit Daten umgeht, die ein Nutzer eingibt, um sie an den Server zu senden. Die eine Methode ist Post. Für uns ist das die schlechtere, weil alle Daten für uns "unsichtbar" an den Server gesendet werden. https://www.quoka.de/alle-rubriken/kleinanzeigen.html verwendet Post. Die URL oben im Browser bleibt immer die gleiche, egal was Du als Suchbegriff eingibst.
Die meisten Seiten verwenden aber glücklicherweise die Methode Get. Bei der Verwendung von Get werden die Daten, die wir z.B. als Suchterm eingeben, als Parameter in die URL aufgenommen. Wenn Du z.B. auf https://www.ebay.de/ als Suchbegriff 'Kissen' eingibst, sieht die URL oben im Browser nach dem Absenden der Suchanfrage so aus:
https://www.ebay.de/sch/i.html?_odkw=ikea&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR12.TRC2.A0.H0.XKissen.TRS0&_nkw=Kissen&_sacat=0
Das wirkt etwas kryptisch, hat aber System. Hinter der GrundURL https://www.ebay.de/sch/i.html folgen die Parameter. Der erste Parameter und somit die Parameterliste, wird immer mit einem Fragezeichen (?) eingeleitet. Allen weiteren Parametern der Liste wird ein Kaufmansund (&) vorangestellt. Für das Ebay-Beispiel ergibt sich also folgene Aufschlüsselung:
https://www.ebay.de/sch/i.html
?_from=R40
&_trksid=p2380057.m570.l1313.TR12.TRC2.A0.H0.Xkissen.TRS0
&_nkw=kissen
&_sacat=0

Wie Du siehst werden bei so einer einfachen Anfrage bereits 4 Parameter übergeben. Was die im einzelnen machen ist für die Erklärung irrelevant. Jeder Parameter hat einen Namen gefolgt von einem Gleichheitszeichen und dem Wert, der den Daten entspricht, die wir dem Webserver übergeben.
Genau so ist es auch bei der Seite von Google für die Patentabfrage. Der erste Parameter ist der Suchbegriff und als zweiten Parameter übergeben wir einfach das Datum, nach dem die Ergebnisse in der Treffermenge liegen sollen.
https://patents.google.com/
?q=(preparation)+OR+(method*)+AND+(oral)+intitle:aspirin
&after=priority:20091231

Es kann durchaus mehr Parameter geben. So habe ich Dir im letzten Posting mitgeteilt, man kann die Suchtreffer auf 100 pro Seite stellen und man kann die Seiten durchgehen. Auch das geht über solche Parameter. Auf vielen Seiten (z.B. Amazon) kann man auch einfach Parameter weglassen und bekommt trotzdem angezeigt, was man will. Damit muss man rumspielen und rumprobieren. Für die Programmierung kann man sich so die gewünschten URLs gezielt aufbauen und optimieren.
Soweit zur kleinen URL-Parameterkunde :-)
In der Datei findest Du eine Tabelle, die ich so aufgebaut habe, wie ich sie sinnvoll finde. Wenn Du das Auslesen über den Button startest, werden immer alle Anfragen abgerufen. Deshalb wird die Tabelle beim Start nach oben gescrollt und vorhandene Werte werden gelöscht. Ab Zeile 15 wird dann mitgescroll, um eine Sichtkontrolle über den Fortschritt zu haben. Du kannst Die Tabelle bei Bedarf einfach kopieren. Das Makro arbeitet immer auf der Tabelle, auf der der Button zum Start geklickt wurde.
Die Eingabe des Datums für den zweiten Parameter habe ich auf drei Zellen für Jahr, Monat und Tag verteilt. Das soll der Übersichtlichkeit dienen. Ich habe etwas überlegt, wie man das am besten löst, denn das Format muss zwingend eingehalten werden, damit der Parameter so arbeitet wie gewünscht. Man kann in die Zellen schreiben was man will, aber für Monat und Tag habe ich Dropdownlisten mit richtigen Werten hinterlegt.
Mir ist beim ersten Testlauf aufgefallen, dass für Asperin sehr wenige Suchtreffer ausgewiesen wurden, wo es doch neulich noch 380 ohne das Datum waren. Ich glaube das lag an einem Schreibfehler im Suchterm. Das Wort Asperin hast Du in der hochgeladenen Beispieltabelle in Klammern gesetzt. Wenn man die wegnimmt werden wieder die 380 gefunden. Die Eingrenzung mit den Klammern ist meiner Meinung nach falsch, weil davor steht 'intitle:'. Die Klammern gehören dann zum gesuchten Text nehme ich an.
Wie der Suchterm aufgebaut ist habe ich ansonsten nicht weiter untersucht. Er sieht für die drei Beispiele sehr gleichförmig aus. Aber ich nehme an, da steht z.B. nicht immer oral drin, da es auch andere Verabreichungsformen gibt. Damit man aber trotzdem nicht immer alles zusammenkopieren oder eintippen muss, habe ich eine Formel drumgelegt, die immer nur das Wort aus Spalte 1 in den restlichen Term zieht. Ich weiß nicht ob es wichtig ist, habe aber dafür gesorgt, dass es in Kleinbuchstaben umgewandelt wird.
Was ich auch nicht getetstet habe, ist ob es möglich ist größere Mengen von URLs am Stück auszulesen. Versucht man die Suchmaschine von Google so zu automatisieren, ist nach 35 Zugriffen Schluss. Dann wird eine Captcha Seite aufgerufen. Falls Du in dieses Problem läufst, musst Du zwischen den Aufrufen Pausen einbauen, die Google denken lassen, die Aufrufe werden von einem Menschen gemacht. Es muss dann also langsam genug werden. Du könntest Dazu z.B. einfach die Pause vergrößern, die wir für das Nachladen des Suchcontainers eingebaut haben.
Hier ist die Datei:
https://www.herber.de/bbs/user/130306.xlsm
Viele Grüße,
Zwenn
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
11.06.2019 08:47:33
Laura
Hallo Zwenn,
vielen, vielen Dank für deine ausführliche Antwort!!!
Die URL-Parameterkunde war sehr interessant, ist mir noch nie aufgefallen, dass es auch "versteckte" Parameter gibt.
Die Tabelle funktioniert einwandfrei und macht auch vom Aufbau Sinn. Und ja, die Suchbegriffe unterscheiden sich minimal, also steht dort nicht immer oral.
In das Problem mit dem Captcha bin ich auch schon reingelaufen. Ich werde mal versuchen, ob ich die Pausen vergrößern kann, allerdings frage ich eigentlich keine große Anzahl ab, deshalb sollte es in der Regel kein Problem sein.
Vielen Dank für deine Zeit und Hilfe :D
Liebe Grüße,
Laura
Anzeige
AW: Google Patent Treffer je Zeile anzeigen
11.06.2019 23:28:07
Zwenn
Hallo Laura,
schön dass es so für Dich funktioniert :-) Was die Pausen wegen der Captchas angeht, würde ich mich an den bekannten 35 Abrufen orientieren, ab denen das Problem auftritt. Du könntest Dir Tabellen mit entsprechend vielen Anfragen machen. Z.B. 30 und dann ein paar Minuten Pause machen, bevor Du Tabelle 2 abrufst.
Auf Ebay gingen damals etwa 400 Abrufe. Danach habe ich immer eine Pause von 10 Minuten eingelegt, um weitere Abrufe zu machen. Ich habe allerdings alles in einer Tabelle gemacht und mitgezählt, wieviele Abrufe getätigt wurden und dann die 10 Munuten automatisiert abgewartet und das Makro dann einfach weiterlaufen lassen. Ebay hat diese Begrenzung allerdings inzwischen abgeschafft.
Viele Grüße,
Zwenn
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige