我们从这个网站上购买了小部件,这些小部件在其自己的网页上提供了每个部件的详细信息。示例:http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND。我必须找到我们数据库中的所有零件,并将“制造商”和“制造商零件编号”值添加到其字段中。
有人告诉我,Visual Basic有一种访问网页并提取信息的方法。如果有人可以向我指出从哪里开始的正确方向,我相信我可以弄清楚。
谢谢。
最佳答案
如何使用HTMLAgilityPack(VB.Net)抓取网站
我同意htmlagilitypack是完成此操作的最简单方法。与仅使用Regex相比,它更不容易出错。以下将是我如何处理爬取。
下载htmlagilitypack * dll后,创建一个新的应用程序,通过nuget添加htmlagilitypack,并对其进行引用。如果可以使用Chrome,它将允许您检查页面以获取有关信息所在位置的信息。右键单击要捕获的值,然后在其中找到表(略微跟随HTML)。
下面的示例将从“定价”表中的该页面中提取所有值。我们需要知道表的XPath值(此值用于指示htmlagilitypack查找内容),以便我们创建的文档查找我们的特定值。这可以通过查找值所在的任何结构并右键单击复制XPath来实现。由此我们得到...
//*[@id="pricing"]
请注意,有时您从Chrome浏览器获得的XPath可能会很大。您通常可以通过在值所在的表中查找唯一的东西来简化它。在此示例中,它是“id”,但在其他情况下,它很容易成为标题或类等。
这个XPath值寻找ID等于价格的东西,这就是我们的表。当我们进一步看时,我们看到我们的值在tbody,tr和td标签内。 HtmlAgilitypack无法与tbody配合良好,请忽略它。我们新的XPath是...
//*[@id='pricing']/tr/td
该XPath表示在页面内查找定价ID,然后在其tr和td标签内查找文本。现在我们添加代码...
Dim Web As New HtmlAgilityPack.HtmlWeb
Dim Doc As New HtmlAgilityPack.HtmlDocument
Doc = Web.Load("http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND")
For Each table As HtmlAgilityPack.HtmlNode In Doc.DocumentNode.SelectNodes("//*[@id='pricing']/tr/td")
Next
要提取值,我们只需引用在循环中创建的表值及其内部文本成员。
Dim Web As New HtmlAgilityPack.HtmlWeb
Dim Doc As New HtmlAgilityPack.HtmlDocument
Doc = Web.Load("http://www.digikey.ca/product-search/en?lang=en&site=ca&KeyWords=AE9912-ND")
For Each table As HtmlAgilityPack.HtmlNode In Doc.DocumentNode.SelectNodes("//*[@id='pricing']/tr/td")
MsgBox(table.InnerText)
Next
现在我们有了弹出值的消息框...您可以切换消息框以填充数组列表或以任何希望的方式存储值。现在,只需对您希望获得的任何其他表执行相同的操作。
请注意,创建的Doc变量是可重用的,因此,如果您想循环浏览同一页面中的另一个表,则不必重新加载该页面。这是一个好主意,尤其是在您发出许多请求,不想猛击网站的情况下,并且如果要自动执行大量剪贴簿操作,则会在两次请求之间花费一些时间。
刮刮真的很容易。这是基本思想。玩得开心!
关于asp.net - 通过Visual Basic从网站检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14859781/