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

yizhihongxing

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

相关文章

  • 详解Android端与JavaWeb传输加密(DES+RSA)

    详解Android端与JavaWeb传输加密(DES+RSA)攻略 前置知识 在学习本文之前,你需要掌握以下知识: Java语言基础 Android开发基础 JavaWeb开发基础 数据加密相关的概念和基础知识 加密方案简介 在本方案中,我们将采用DES和RSA算法分别对数据进行对称加密与非对称加密,保证通信过程的安全性。具体实现过程如下: 首先在Andro…

    css 2023年6月10日
    00
  • Vue3中使用defineCustomElement 定义组件详解

    下面我将为你详细讲解Vue3中使用defineCustomElement定义组件的完整攻略。 什么是defineCustomElement? 在Vue3中,我们可以通过defineCustomElement方法来定义一个自定义元素,自定义元素是Web Components技术的核心概念之一,它允许我们创建出具有完全自定义行为的HTML元素,它可以被认为是一种…

    css 2023年6月9日
    00
  • CSS图片倒影效果兼容firefox、IE等各主流浏览器

    要实现CSS图片倒影效果,在多个主流浏览器上兼容并不是一件容易的事情。下面是实现该效果的完整攻略。 1.使用webkit内核的浏览器 webkit内核的浏览器包括Google Chrome、Safari等等。 在这些浏览器中,可以使用CSS3的属性实现图片倒影效果: img { -webkit-box-reflect: below 0px -webkit-g…

    css 2023年6月11日
    00
  • css中有哪些方式可以隐藏页面元素及区别

    在 CSS 中,有一些不同的方式可以隐藏页面元素。下面将会细致地介绍这些方法以及它们的不同之处。 1. display: none display: none 属性可以完全移除一个元素,该元素将不再占据与其关联的空间。在网页中,它是最常用的隐藏元素的方法之一。要注意的是它的区别,它与 visibility: hidden 的区别是,visibility: h…

    css 2023年6月10日
    00
  • 倾听色彩的声音 网页与产品的配色研究

    倾听色彩的声音,是指通过色彩的组合和搭配来传达网站或产品的意图和氛围。正确的配色能够提高用户的浏览体验和产品的价值。以下是配色研究的完整攻略: 1. 色彩基础知识 在进行配色研究之前,需要掌握基本的色彩知识,包括色相、亮度、饱和度、对比度等。例如,对于色相,一般选择相邻色调搭配会更加和谐,而相反色则会产生强烈的对比感。 2.产品或网站调性分析 在进行配色选取…

    css 2023年6月10日
    00
  • 关于.prettierrc代码格式化配置方式

    Prettier 是一款代码格式化工具,可以快速地帮助程序员完成代码格式化的需求,让代码整洁可读。在使用 Prettier 的过程中,我们可以通过配置 .prettierrc 来自定义代码格式化规则。 下面,我将详细讲解关于 .prettierrc 配置的完整攻略。 创建 .prettierrc 文件 首先,我们需要在项目根目录下创建一个 .prettier…

    css 2023年6月10日
    00
  • 如何用css代码实现有立体效果的表格

    实现有立体效果的表格可以为网页增加美观性和交互性。下面是一个完整攻略,包含了如何使用 CSS 实现有立体效果的表格的过程和两个示例说明。 CSS 实现有立体效果的表格的过程 1. 使用 box-shadow 属性 我们可以使用 CSS 的 box-shadow 属性来实现有立体效果的表格。下面是一个示例: <table> <tr> &…

    css 2023年5月18日
    00
  • css重绘与重排的方法

    当我们在开发网站时,如果使用了CSS样式表进行样式布局,那么在浏览器渲染页面时,会按照以下流程进行渲染: 解析HTML文档,创建DOM树; 解析CSS样式,生成CSS规则树; 将DOM树和CSS规则树合并,生成渲染树; 对渲染树进行布局,计算每个元素的大小和位置等信息; 对渲染树进行绘制,将元素渲染到页面上。 在这个过程中,当我们修改了DOM树或者CSS样式…

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