我需要将此网页中的所有项目链接(URL)放入一个由中断分隔的文本文件中(换句话说,像这样的列表:“项目#1”“项目#2”等。
http://dota-trade.com/equipment?order=name是网页,如果您向下滚动,它会继续显示大约 500-1000 件商品。
我必须使用什么编程语言或者我将如何做到这一点。我也有使用 imacros 的经验。
我需要将此网页中的所有项目链接(URL)放入一个由中断分隔的文本文件中(换句话说,像这样的列表:“项目#1”“项目#2”等。
http://dota-trade.com/equipment?order=name是网页,如果您向下滚动,它会继续显示大约 500-1000 件商品。
我必须使用什么编程语言或者我将如何做到这一点。我也有使用 imacros 的经验。
您需要下载 HtmlAgilityPack
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient();
var sourceCode = wc.DownloadString("http://dota-trade.com/equipment?order=name");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(sourceCode);
var node = doc.DocumentNode;
var nodes = node.SelectNodes("//a");
List<string> links = new List<string>();
foreach (var item in nodes)
{
var link = item.Attributes["href"].Value;
links.Add(link.Contains("http") ? link : "http://dota-trade.com" +link);
}
int index = 1;
while (true)
{
sourceCode = wc.DownloadString("http://dota-trade.com/equipment?order=name&offset=" + index.ToString());
doc = new HtmlDocument();
doc.LoadHtml(sourceCode);
node = doc.DocumentNode;
nodes = node.SelectNodes("//a");
var cont = node.SelectSingleNode("//tr[@itemtype='http://schema.org/Thing']");
if (cont == null) break;
foreach (var item in nodes)
{
var link = item.Attributes["href"].Value;
links.Add(link.Contains("http") ? link : "http://dota-trade.com" + link);
}
index++;
}
System.IO.File.WriteAllLines(@"C:\Users\Public\WriteLines.txt", links);
}
}
}
我建议使用任何支持正则表达式的语言。我经常使用 ruby,所以我会做这样的事情:
require 'net/http'
require 'uri'
uri = URI.parse("http://dota-trade.com/equipment?order=name")
req = Net::HTTP::Get(uri.path)
http = Net::HTTP.new(uri.host, uri.port)
response = http.request(request)
links = response.body.match(/<a.+?href="(.+?)"/)
这不是我的想法,但 links[0] 应该是一个匹配对象,之后的每个元素都是一个匹配项。
puts links[1..-1].join("\n")
最后一行应该转储您想要的内容,但可能不包括主机。如果您希望包含主机,请执行以下操作:
puts links[1..-1].map{|l| "http://dota-trade.com" + l }.join("\n")
请记住,这是未经测试的。