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日

相关文章

  • 25种提高网页加载速度的方法和技巧

    25种提高网页加载速度的方法和技巧 在当今互联网时代,拥有一个快速响应的网站是至关重要的。现在网络用户注重速度,如果您的网站加载速度过慢,可能会失去潜在用户。以下是25种提高网页加载速度的方法和技巧: 1. 压缩图片 图片是拖慢网页加载速度的主要因素之一。通过压缩图片文件可以减少文件大小,提高网页加载速度。 示例:使用ImageOptim,或Compress…

    css 2023年6月10日
    00
  • 探讨HTML5移动开发的几大特性(必看)

    下面是对“探讨HTML5移动开发的几大特性”的完整攻略: HTML5移动开发的几大特性 HTML5是一个全新的Web标准,它提供了很多新的API和特性,对于移动开发来说,HTML5为开发人员提供了更好的工具和技术,也带来了更好的用户体验。 1. 响应式网页设计 响应式网页设计是指一个网站可以自适应不同的屏幕尺寸,包括桌面电脑、平板电脑和手机等移动设备。在HT…

    css 2023年6月9日
    00
  • css2.1多重背景和边框效果实现原理及代码(图文介绍)

    下面是对”css2.1多重背景和边框效果实现原理及代码(图文介绍)”的完整攻略的介绍。 背景效果的实现原理 实现多重背景的关键在于CSS2.1引入了多背景的概念。多背景是指在一个元素中可以设置多个背景图像。每个背景图像都可以有自己的颜色、大小、位置等属性。这个特性被广泛应用于网站设计中。 多重背景图片可以通过设置多个background-image属性来实现…

    css 2023年6月9日
    00
  • JS实现仿微博可关闭弹出层效果

    要实现仿微博可关闭弹出层效果,以下是完整攻略: 步骤一:HTML结构 首先,在HTML页面中,需要创建一个弹出层的容器,并在其中添加弹出层的内容。例如: <div class="dialog"> <div class="dialog-content"> <h2>弹出层标题</h…

    css 2023年6月10日
    00
  • 如何用float配合position:relative实现居中

    下面是如何用float配合position:relative实现居中的完整攻略: 步骤一:给父元素设置position:relative属性 首先,在HTML文件中选中你想要居中的父元素,并为它设置position:relative属性。这个属性的主要作用是为后面的子元素提供定位参照点。 <div class="parent"&gt…

    css 2023年6月10日
    00
  • 利用CSS3实现气泡效果的教程

    以下是利用CSS3实现气泡效果的详细攻略: 准备工作 首先需要准备一份HTML和CSS的基础知识,并且了解CSS3中一些常见的新特性,比如伪元素、渐变、动画等。 HTML结构 气泡效果最基础的结构就是一个div元素,需要使用伪元素来创建气泡的尖尖和背景。 <div class="bubble">Here is my text …

    css 2023年6月9日
    00
  • CSS中的font-size属性使用教程

    下面是关于“CSS中的font-size属性使用教程”的详细攻略。 1. font-size属性概述 CSS的font-size属性用于设置网页上文字的大小。它支持以下几种单位: px: 像素单位,表示实际的像素点大小。 em: 相对长度单位,基于当前字体大小计算。比如如果当前字体大小是16px,1em就等于16px。 rem: 相对长度单位,基于根元素即H…

    css 2023年6月9日
    00
  • 15个开发者必须知道的chrome技巧

    15个开发者必须知道的Chrome技巧 Google Chrome是最受欢迎的浏览器之一,尤其对于开发者而言更是如此。下面是15个Chrome技巧,可以极大提高开发者的工作效率和生产力: 1. 勾选”disable cache” 在开发阶段,为了避免缓存干扰,开发者通常需要刷新页面来看效果。打开控制台,选中”disable cache”,可以禁止掉浏览器的缓…

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