0
votes

Difficulté à réutiliser le même HTTP après le passant d'un sous à une fonction

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 et le http sur une fonction pour récupérer le titre de sa page intérieure. Il est important que je passe à la fois le lien et le http sur la fonction afin de réutiliser le même http que j'ai utilisé dans la première place < /strong >.

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 gethttp (byval http, byval link) comme variante . J'obtiens même le résultat lorsque je vais pour gethttp (byval http, byval link) en tant que chaîne ou gethttp (byval http, lien byval) . De plus, je n'ai pas explicitement défini explicitement lien sous forme de chaîne ou http comme xmlhttp60 dans les paramètres de fonction.

J'ai essayé avec (fonctionne parfaitement): xxx

Quelle est la bonne façon de passer HTTP entre le sous et la fonction afin de réutiliser le même HTTP?


8 commentaires

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 explicite. Donc, dans ce cas, gethttp (byval http sous XMLHTTP60, BYVAL Link en tant que chaîne) en chaîne . 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 et getinfo sont appelés à partir de.


@omegastripes - gethttp est appelé à partir de getinfo (que je suppose s'appelle directement)


3 Réponses :


1
votes

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


2 commentaires

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.



1
votes

Quelque chose comme ce qui suit devrait faire ce que vous voulez atteindre: xxx


0 commentaires

0
votes

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 BYREF forte> suffira. Passer la variable BYREF passe les modifications apportées à l'instance HTTP dans la fonction au sous-serveur pour une utilisation en dehors de la fonction. Les modifications apportées à HTTP dans la fonction seront donc transmises au sous et ne seront pas perdues. Vous utiliserez la même instance de l'objet HTTP dans les deux endroits. Le passage de HTTP BYVAL ne transmettra pas les modifications apportées à HTTP dans la fonction au sous-produit. Changez votre déclaration de paramètres de fonction comme suit.

    Function getHTTP(ByRef Http, ByVal link) As Variant


0 commentaires