J'ai écrit un script à l'aide de XHR pour analyser le lien du premier message à partir de cette site web puis Passé le lien code> code> et le my script semble fonctionner de bonne manière, mais je ne suis pas sûr de faire tout le temps de la bonne façon. La raison de ma confusion est que je reçois le résultat lorsque j'utilise comme J'ai essayé avec (fonctionne parfaitement): p> Quelle est la bonne façon de passer HTTP entre le sous et la fonction afin de réutiliser le même HTTP? P>
blockQuote> p> http code> sur une fonction pour récupérer le titre de sa page intérieure. Il est important que je passe à la fois le lien code> code> et le
http code> sur la fonction afin de réutiliser le même http que j'ai utilisé dans la première place < /strong >
. gethttp (byval http, byval link) comme variante code>. J'obtiens même le résultat lorsque je vais pour
gethttp (byval http, byval link) en tant que chaîne code> ou
gethttp (byval http, lien byval) code>. De plus, je n'ai pas explicitement défini explicitement
lien sous forme de chaîne code> ou
http comme xmlhttp60 code> dans les paramètres de fonction. P>
3 Réponses :
Quelque chose comme ça pourrait être approprié:
Sub GetInfo() Const base As String = "https://stackoverflow.com" Const url As String = "https://stackoverflow.com/questions/tagged/web-scraping" Dim Html As HTMLDocument Dim firstLink As String, postTitle As String firstLink = base & Replace(GetPage(url).querySelector(".summary .question-hyperlink") _ .getAttribute("href"), "about:", "") Debug.Print firstLink postTitle = GetPage(firstLink).querySelector("h1[itemprop='name'] > a").innerText Debug.Print postTitle End Sub Function GetPage(url As String) As HTMLDocument Dim Html As HTMLDocument Static Http As XMLHTTP60 If Http Is Nothing Then Set Http = New XMLHTTP60 'log in here End If With Http .Open "GET", url, False .send If .Status = 200 Then Set Html = New HTMLDocument Html.body.innerHTML = .responseText Else Debug.Print .Status 'warn user End If End With Set GetPage = Html End Function
Salut Tim, tu es presque là. La seule chose qui n'a pas encore été mise en œuvre est HTTP dans Sub et Fonction. Vous avez peut-être remarqué que j'ai fait la moitié de la gratte dans Sub et le reste de celui-ci dans une fonction, en passant ainsi des questions HTTP. En fait, je veux faire la gratte dans les deux endroits individuellement, il est donc nécessaire que le même HTTP existe dans les deux endroits. Merci.
C'était le point de centraliser l'extraction en un seul endroit: vous ne pouvez pas utiliser le HTTP dans deux endroits à la même heure (car il ne peut pas faire de connexions simultanées), alors pourquoi ne pas le garder au même endroit? Tout ce dont vous avez besoin dans toutes les autres méthodes est un document HTML - il n'est pas nécessaire de gérer la récupération dans ces méthodes.
Quelque chose comme ce qui suit devrait faire ce que vous voulez atteindre:
Si j'ai compris votre problème correctement et que vous avez besoin de modifications apportées à l'instance HTTP dans la fonction à transmettre à votre sous-correspondant, puis passez http Function getHTTP(ByRef Http, ByVal link) As Variant
Ce forum est pour le code qui a des erreurs logiques. Si votre code fonctionne bien et que vous souhaitez simplement l'améliorer, vous devriez poster sur l'examen du code à la place.
À moins qu'il y ait une raison de ne pas être explicite, je vous recommande être i> explicite. Donc, dans ce cas,
gethttp (byval http sous XMLHTTP60, BYVAL Link en tant que chaîne) en chaîne code>. Tous les autres exemples que vous avez fournis utilisent des variantes, que ce soit implicitement ou explicitement, ce que vous avez vu fonctionner correctement.
Il n'y a aucune raison de transmettre l'objet HTTP - il complique non coolforme votre code sans aucun gain réel: les frais généraux de la filature d'un autre objet sont négligeables.
Oui, @tim Williams. Le code que j'ai collé ci-dessus est simplement un exemple. Passer HTTP à une fonction importe parce que j'ai réutilisé que HTTP d'analyser le contenu de la profondeur différente d'un site après la connexion.
Même lorsque le code fonctionne, j'aurais pu faire la majeure partie de cela de manière erronée et c'est ce que ma question concerne @freeflow.
Aurait pu être utile d'être un peu plus explicite à propos de cette exigence
Pourriez-vous s'il vous plaît ajouter le code où
gethttp code> et
getinfo code> sont appelés à partir de.
@omegastripes -
gethttp code> est appelé à partir de
getinfo code> (que je suppose s'appelle directement)