让我来为您详细讲解 "c# 爬取优酷电影信息(2)" 的完整攻略。
攻略概述:
本攻略将介绍如何使用 c# 爬取优酷电影信息。我们将使用 HttpClient 来发送 GET 请求,获取电影页面的 HTML 内容。然后,使用 HtmlAgilityPack 解析 HTML 内容,从而提取电影信息。最后,我们将使用 Console.WriteLine() 函数将结果输出到控制台。
步骤一:设置 HttpClient
首先,我们需要设置 HttpClient 的属性。首先,将 user-agent 设置为浏览器的用户代理,这样我们可以通过网站的安全验证。其次,将 accept-encoding 设置为 gzip,这样可以通过压缩减少网络传输量。最后,设置 cookie-container,以便在之后的请求中保存 cookie。
以下是设置 HttpClient 的代码:
HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })
{
BaseAddress = new Uri("https://movie.youku.com/")
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip");
client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("deflate");
client.DefaultRequestHeaders.Connection.ParseAdd("keep-alive");
client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };
client.Timeout = TimeSpan.FromMilliseconds(3000);
client.DefaultRequestHeaders.Host = "movie.youku.com";
client.DefaultRequestHeaders.Referrer = new Uri("https://www.baidu.com/s?ie=UTF-8&wd=%E4%BC%98%E9%85%B7");
client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
client.DefaultRequestHeaders.Cookie.Clear();
var cookieContainer = new CookieContainer();
foreach (var cookie in cookies)
{
cookieContainer.Add(new Uri("https://movie.youku.com/"), new Cookie(cookie.Key, cookie.Value));
}
client.DefaultRequestHeaders.Add("Cookie", cookieContainer.GetCookieHeader(new Uri("https://movie.youku.com/")));
步骤二:发送 GET 请求并获取 HTML 代码
在设置 HttpClient 之后,我们将使用该客户端发送 GET 请求获取优酷电影页面的 HTML 代码。以下是与此相关的代码:
var response = await client.GetAsync("https://movie.youku.com/?spm=a2hww.12622565.m_6543.5~1~2~A");
response.EnsureSuccessStatusCode();
var html = await response.Content.ReadAsStringAsync();
此代码将向服务器发送 GET 请求,并在响应中返回 HTML 代码。在此代码中,我们使用了 EnsureSuccessStatusCode() 方法,此方法确保服务器成功响应。如果服务器返回错误代码,则该方法会引发异常。
步骤三:解析 HTML 代码
可以使用 HtmlAgilityPack 库解析 HTML 代码。这里我们将使用 HtmlDocument 类来解析HTML。以下是解析 HTML 的代码:
var document = new HtmlDocument();
document.LoadHtml(html);
步骤四:从 HTML 中提取信息
在获得 HTML 代码并解析HTML之后,我们可以从 HTML 代码中提取所需的数据。我们将使用 XPath 查询语言,通过查询 HTML中的元素来提取所需数据。以下是查询电影名称和播放链接的 XPath 表达式:
//*[@class='p-thumb']//img/@alt
//*[@class='p-thumb']//@href
此代码可在 HTML 中寻找所有 class 属性为 "p-thumb" 的元素,然后分别提取所有 img 子元素的 alt 属性和所有 href 子元素的值。
以下是提取电影名称和播放链接的代码:
var names = document.DocumentNode.SelectNodes(@"//*[@class='p-thumb']//img/@alt");
var links = document.DocumentNode.SelectNodes(@"//*[@class='p-thumb']//@href");
for (int i = 0; i < names.Count; i++)
{
Console.WriteLine(names[i].InnerHtml);
Console.WriteLine(links[i].GetAttributeValue("href", ""));
Console.WriteLine();
}
注意:此代码假设 HTML 代码中的 "电影名称"和 "播放链接" 都包含在 h1 和 a 标签中。
我们将使用 SelectNodes() 方法将 XPath 查询语言作为参数传递,然后从结果集中提取所有匹配的元素。
最后,我们使用 Console.WriteLine() 函数输出电影名称和播放链接。
以下代码展示如何完整爬取优酷电影信息并输出:
static async Task Main(string[] args)
{
var cookies = new Dictionary<string, string>
{
{ "_abc", "123" },
{ "_d1s", "14383" },
{ "data_ori", "%7B%22type%22%3A%22all%22%2C%22area%22%3A%22cn%22%2C%22num%22%3A20%2C%22curpage%22%3A1%7D" },
{ "cna", "J2GWEc4UQtQCAX8G6/Hxbb3J" },
};
HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })
{
BaseAddress = new Uri("https://movie.youku.com/")
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip");
client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("deflate");
client.DefaultRequestHeaders.Connection.ParseAdd("keep-alive");
client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };
client.Timeout = TimeSpan.FromMilliseconds(3000);
client.DefaultRequestHeaders.Host = "movie.youku.com";
client.DefaultRequestHeaders.Referrer = new Uri("https://www.baidu.com/s?ie=UTF-8&wd=%E4%BC%98%E9%85%B7");
client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
client.DefaultRequestHeaders.Cookie.Clear();
var cookieContainer = new CookieContainer();
foreach (var cookie in cookies)
{
cookieContainer.Add(new Uri("https://movie.youku.com/"), new Cookie(cookie.Key, cookie.Value));
}
client.DefaultRequestHeaders.Add("Cookie", cookieContainer.GetCookieHeader(new Uri("https://movie.youku.com/")));
var response = await client.GetAsync("https://movie.youku.com/?spm=a2hww.12622565.m_6543.5~1~2~A");
response.EnsureSuccessStatusCode();
var html = await response.Content.ReadAsStringAsync();
var document = new HtmlDocument();
document.LoadHtml(html);
var names = document.DocumentNode.SelectNodes(@"//*[@class='p-thumb']//img/@alt");
var links = document.DocumentNode.SelectNodes(@"//*[@class='p-thumb']//@href");
for (int i = 0; i < names.Count; i++)
{
Console.WriteLine(names[i].InnerHtml);
Console.WriteLine(links[i].GetAttributeValue("href", ""));
Console.WriteLine();
}
Console.ReadLine();
}
示例说明1:
我们已经知道如何获取电影页面的 HTML 代码,现在我们将演示如何使用正则表达式来解析 HTML。此代码使用了regex包,首先使用正则表达式从 a 元素中提取链接和电影的名称。注意,此方法在处理大量的HTML代码时并不是最好的办法。
以下是示例代码:
var reg = new Regex(@"<a href=""(.*?)\.(html|shtml|swf)""\s+title=""(.*?)"">", RegexOptions.Singleline);
var matches = reg.Matches(html);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[3].Value);
Console.WriteLine(match.Groups[1].Value);
Console.WriteLine();
}
此代码中,我们使用正则表达式来匹配所有 a 元素,并从中提取链接和电影名称。
示例说明2:
我们可以使用HtmlAgilityPack包来解析HTML,所有掌握XPath查询语言是非常重要的,以下代码显示如何在HTML中查找特定类型的视频(电影和电视剧)。
var document = new HtmlDocument();
document.LoadHtml(html);
var divs = document.DocumentNode.SelectNodes(@"//div[@class='yk-content']//div[@class='box-series']");
foreach (var div in divs)
{
var h1s = div.SelectNodes(".//h1");
if (h1s != null)
{
var title = h1s.FirstOrDefault()?.InnerHtml?.Trim() ?? string.Empty;
if (title.EndsWith("电视剧") || title.EndsWith("电影"))
{
Console.WriteLine(title);
var aspns = div.SelectNodes(".//aspn");
if (aspns == null) continue;
foreach (var aspn in aspns)
{
var spans=aspn.SelectNodes(".//span[@class='title']");
if (spans == null) continue;
foreach (var span in spans)
{
Console.WriteLine(span.InnerHtml.Trim());
}
}
Console.WriteLine();
}
}
}
在这个例子中,我们将所有名为 "class" 的容器 div 元素中的所有 "box-series" div 元素查询出来,并检查它们的标题以确定它们是电影还是电视剧。在电影或电视剧 div 元素找到时我们在该 div下寻找 aspn 元素,aspan 元素包含为人所知的内容,然后我们再查询子元素 span,以便输出视频名称。
以上就是 "c# 爬取优酷电影信息(2)" 的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 爬取优酷电影信息(2) - Python技术站