2017-06-19 2 views
0

Je veux tirer le meilleur résultat de recherche pour une requête LinkedIn.Tirer le résultat de recherche de LinkedIn en utilisant le pack d'agilité html

Dans ce violon: https://dotnetfiddle.net/Vtwi7g

passant à 'html' var ce lien:
https://www.linkedin.com/search/results/index/?keywords=firstname%3Ajohn%20AND%20lastname%3Adoe%20AND%20company%3Amicrosoft%20AND%20title%3Aceo&origin=GLOBAL_SEARCH_HEADER

Je veux premier résultat: https://www.linkedin.com/in/john-doe-63803769/

  • Je suppose que les besoins du programme quelques informations d'identification pour se connecter à LinkedIn en premier - comment puis-je les transmettre?

  • J'ai essayé d'inspecter l'élément pour voir son emplacement - comment parcourir le DOM pour obtenir le premier résultat?

Répondre

1

Ce sera plus compliqué avec lié dans la recherche. Leur recherche a été fermée pour les utilisateurs non autorisés.

Tout d'abord, vous devez vous connecter avec votre navigateur, puis prendre vos cookies de session li_at et _lipt.

LinkedIn ne rend pas la liste des résultats directement au format html. Il rend de grands objets JSON dans l'élément <code>, puis utilise JS pour le rendre.

Votre application de la console devrait être comme ceci:

static void Main(string[] args) 
{ 
    var html = @"https://www.linkedin.com/search/results/index/?keywords=firstname%3Ajohn%20AND%20lastname%3Adoe%20AND%20company%3Amicrosoft%20AND%20title%3Aceo&origin=GLOBAL_SEARCH_HEADER"; 

    HtmlWeb web = new HtmlWeb(); 
    web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest2); 
    var htmlDoc = web.Load(html); 

    var codeElement = htmlDoc.DocumentNode.SelectNodes("//code[starts-with(@id,'bpr-guid')][last()]"); 
    var json = WebUtility.HtmlDecode(codeElement.Last().InnerText); 
    var obj = JsonConvert.DeserializeObject<Rootobject>(json); 
    var profiles = obj.included.Where(i => i.firstName != null); 
    foreach(var profile in profiles) 
    { 
     Console.WriteLine("Profile Name: " + profile.firstName + ";" + profile.lastName + ";" + profile.occupation + ";https://www.linkedin.com/in/" + profile.publicIdentifier); 
    } 
    Console.ReadKey(); 
} 
public static bool OnPreRequest2(HttpWebRequest request) 
{ 
    var cookies = "li_at={YOURCOOKIEHERE};" + 
        "_lipt={YOURCOOKIEHERE}"; 
    request.Headers.Add(@"cookie:" + cookies); 
    return true; 
} 


public class Rootobject 
{ 
    public Included[] included { get; set; } 
} 


public class Included 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public string occupation { get; set; } 
    public string objectUrn { get; set; } 
    public string publicIdentifier { get; set; } 
} 

A la fin, il imprimera

Profile Name: John;Doe;ceo at Microsoft;https://www.linkedin.com/in/john-doe-8102b868 
Profile Name: John;Doe;Ceo at Microsoft;https://www.linkedin.com/in/john-doe-63803769 
Profile Name: John;Doe;CEO at Microsoft;https://www.linkedin.com/in/john-doe-2151b69b 
+0

J'ai installé pack agilité html, mais je reçois des erreurs de compilation - JsonConvert, HttpWebRequest, WebUtility n'existe pas , Aucune surcharge pour OnPreRequest2 correspond à ..PreRequestHandler - quels autres espaces de noms dois-je inclure? –

+0

nvm, j'ai dû installer NewtonSoft.Json version 9, puisque 10 ne fonctionne pas avec VS2012 .. btw, j'ai une autre exigence simple - lire la variable de recherche html à partir d'un fichier/table et de vider la sortie à un fichier/table. Seriez-vous intéressé à coder ceci pour une carte-cadeau amazon de 25 $? –