Ich lerne Web Crawler zu schreiben und fand einige großartige Beispiele, um mich zu starten, aber da ich neu bin, habe ich ein paar Fragen in Bezug auf die Codierungsmethode.
Das Suchergebnis zum Beispiel finden Sie hier: Suchergebnis
Wenn ich mir die HTML-Quelle für das Ergebnis anschaue, sehe ich Folgendes:
<HR><CENTER><H3>License Information *</H3></CENTER><HR>
<P>
<CENTER> 06/03/2014 </CENTER> <BR>
<B>Name : </B> WILLIAMS AJAYA L <BR>
<B>Address : </B> NEW YORK NY <BR>
<B>Profession : </B> ATHLETIC TRAINER <BR>
<B>License No: </B> 001475 <BR>
<B>Date of Licensure : </B> 01/12/07 <BR>
<B>Additional Qualification : </B> Not applicable in this profession <BR>
<B> <A href="http://www.op.nysed.gov/help.htm#status"> Status :</A></B> REGISTERED <BR>
<B>Registered through last day of : </B> 08/15 <BR>
Wie kann ich das HTMLAgilityPack verwenden, um diese Daten von der Site zu verwerfen?
Ich habe versucht, ein Beispiel wie unten gezeigt zu implementieren, bin mir aber nicht sicher, wo ich die Änderung vornehmen soll, damit sie die Seite crawlen kann:
private void btnCrawl_Click(object sender, EventArgs e)
{
foreach (SHDocVw.InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension( ie.FullName ).ToLower();
if ( filename.Equals( "iexplore" ) )
txtURL.Text = "Now Crawling: " + ie.LocationURL.ToString();
}
string url = ie.LocationURL.ToString();
string xmlns = "{http://www.w3.org/1999/xhtml}";
Crawler cl = new Crawler(url);
XDocument xdoc = cl.GetXDocument();
var res = from item in xdoc.Descendants(xmlns + "div")
where item.Attribute("class") != null && item.Attribute("class").Value == "folder-news"
&& item.Element(xmlns + "a") != null
//select item;
select new
{
Link = item.Element(xmlns + "a").Attribute("href").Value,
Image = item.Element(xmlns + "a").Element(xmlns + "img").Attribute("src").Value,
Title = item.Elements(xmlns + "p").ElementAt(0).Element(xmlns + "a").Value,
Desc = item.Elements(xmlns + "p").ElementAt(1).Value
};
foreach (var node in res)
{
MessageBox.Show(node.ToString());
tb.Text = node + "\n";
}
//Console.ReadKey();
}
Die Crawler-Helper-Klasse:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace CrawlerWeb
{
public class Crawler
{
public string Url
{
get;
set;
}
public Crawler() { }
public Crawler(string Url)
{
this.Url = Url;
}
public XDocument GetXDocument()
{
HtmlAgilityPack.HtmlWeb doc1 = new HtmlAgilityPack.HtmlWeb();
doc1.UserAgent = "Mozilla/4.0 (conpatible; MSIE 7.0; Windows NT 5.1)";
HtmlAgilityPack.HtmlDocument doc2 = doc1.Load(Url);
doc2.OptionOutputAsXml = true;
doc2.OptionAutoCloseOnEnd = true;
doc2.OptionDefaultStreamEncoding = System.Text.Encoding.UTF8;
XDocument xdoc = XDocument.Parse(doc2.DocumentNode.SelectSingleNode("html").OuterHtml);
return xdoc;
}
}
}
tb
ist eine mehrzeilige Textbox ... Also möchte ich folgendes anzeigen:
Name
WILLIAMS AJAYA L
Address
NEW YORK NY
Profession
ATHLETIC TRAINER
License No
001475
Date of Licensure
1/12/07
Additional Qualification
Not applicable in this profession
Status
REGISTERED
Registered through last day of
08/15
Ich möchte, dass das zweite Argument zu einem Array hinzugefügt wird, da der nächste Schritt wäre, in eine SQL-Datenbank zu schreiben ...
Ich bin in der Lage, die URL vom IE zu bekommen, der das Suchergebnis hat, aber wie kann ich es in meinem Skript kodieren?
Dieser kleine Ausschnitt sollte Ihnen den Einstieg erleichtern:
HtmlDocument doc = new HtmlDocument();
WebClient client = new WebClient();
string html = client.DownloadString("http://www.nysed.gov/coms/op001/opsc2a?profcd=67&plicno=001475&namechk=WIL");
doc.LoadHtml(html);
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div");
Sie verwenden grundsätzlich die WebClient
Klasse, um die HTML-Datei herunterzuladen, und laden Sie dann diesen HTML- HtmlDocument
in das HtmlDocument
Objekt. Dann müssen Sie XPath verwenden, um die DOM-Struktur abzufragen und nach Knoten zu suchen. Im obigen Beispiel werden "Knoten" alle div
Elemente im Dokument enthalten.
Hier eine kurze Referenz zur XPath-Syntax: http://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx