c# 爬取优酷电影信息(2)

让我来为您详细讲解 "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技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 强制显示、隐藏(IE\Mozilla)浏览器的滚动条实现代码

    强制显示或隐藏浏览器滚动条是网页制作中经常使用的技巧之一。下面我们就来详细讲解如何实现该功能。 方法一:使用CSS样式来控制滚动条 使用CSS样式可以对滚动条进行样式定制,并且可以通过设置overflow属性来控制是否显示滚动条。 隐藏滚动条 要隐藏滚动条,可以将body、html标签的overflow属性设置为hidden: body, html { ov…

    css 2023年6月10日
    00
  • 标记语言——为文字指定CSS样式

    标记语言可以为文字指定CSS样式,这里我们主要讨论的是HTML语言,它是最常用的标记语言之一。通过HTML的标记,可以让浏览器知道如何显示文本和其他元素,同时也可以通过CSS样式来对文本进行格式化。 以下是详细的攻略过程: 步骤一:编写HTML代码 首先,需要编写一个HTML文件来呈现网页内容。在HTML文件中,可以使用标记来指定文本和其他元素的格式化方式。…

    css 2023年6月9日
    00
  • 本文的主角 vertical-align使用介绍

    vertical-align 是 CSS 中的一个属性,用于控制元素的垂直对齐方式。在 Web 开发中,垂直对齐是一个常见的问题,vertical-align 属性可以帮助我们解决这个问题。下面是一个完整攻略,包含了 vertical-align 属性的使用介绍和两个示例说明。 vertical-align 属性的使用介绍 vertical-align 属性…

    css 2023年5月18日
    00
  • CSS实现带箭头的提示框效果【示例代码】

    下面是针对CSS实现带箭头的提示框效果的详细攻略: 1. 准备工作 在开始制作之前,需要准备好以下资源: HTML结构 CSS代码 在 HTML 结构中,需要一个包裹提示框的容器,比如一个 <div> 标签,和触发提示框的元素,比如一个按钮或者一个链接。 2. CSS 样式 2.1 容器样式 首先,需要给容器设置一些样式,包括背景颜色,边框,圆角…

    css 2023年6月9日
    00
  • 最新版本的CSS选择器浏览器支持情况

    最新版本的CSS选择器浏览器支持情况是指在最新版本的CSS规范中定义的各种选择器在各个主流浏览器中的支持情况。下面我们将从不同种类的选择器来介绍它们的浏览器支持情况。 元素选择器 元素选择器是最基本也是最常见的一种CSS选择器,在所有的浏览器中都有非常好的支持,也就是说无论你使用哪种浏览器,都可以放心使用元素选择器来选择相应的HTML元素。下面是一个例子: …

    css 2023年6月9日
    00
  • 深入解读CSS的OOCSS和SMACSS以及BEM

    标题:深入解读CSS的OOCSS和SMACSS以及BEM 作为网站的作者,你需要深入理解和掌握 CSS 的一些重要的技术,其中 OOCSS、SMACSS 和 BEM 是其中比较重要的三种技术。 OOCSS OOCSS(Object-Oriented CSS)是一种 CSS 样式编写的方法,它的主要思想是将样式与 HTML 结构分离开来,将样式抽象为“对象”,…

    css 2023年6月10日
    00
  • 使用css3制作齿轮loading动画效果

    下面是制作齿轮loading动画效果的完整攻略。 1. 准备工作 在制作之前首先需要进行准备工作: 确定齿轮的大小和数量 选择合适的颜色和样式 编写 HTML 结构 在 HTML 结构中,我们需要定义一个外层盒子和多个齿轮的盒子。代码如下: <div class="gear-group"> <div class=&quo…

    css 2023年6月10日
    00
  • JavaScript闭包原理与用法学习笔记

    JavaScript闭包原理与用法学习笔记 什么是JavaScript闭包 闭包(Closure)是指有权访问另一个函数作用域中变量的函数。在JavaScript中,函数可以作为另一个函数的参数或者返回值,如果在一个函数内部定义了另一个函数,并且内部函数可以访问外部函数的变量,则形成了一个闭包。闭包是JavaScript强大的特性之一,能够帮助我们实现诸如数…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部