c# 爬取优酷电影信息(1)
作者:三十三重天 发布时间:2022-04-23 13:34:59
标签:c#,爬虫,优酷,电影信息
目录
第一点——加载网页结构
第二点——解析网页结构,转变为符合需求的数据实体
第三点——保存数据实体,转变为符合需求的数据实体
第四点——main
爬虫的制作主要分为三个方面
1、加载网页结构
2、解析网页结构,转变为符合需求的数据实体
3、保存数据实体(数据库,文本等)
在实际的编码过程中,找到了一个好的类库“HtmlAgilityPack”。
介绍:
官网:http://html-agility-pack.net/?z=codeplex
Html Agility Pack源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美)
使用说明:
Html Agility Pack(XPath 定位),在实际使用过程中,发现有部分内容如果通过Css进行定位会比XPath更加方便,所以通过查找找到了另外一个CSS的解析了类库 ScrapySharp(Css 定位)
整理:
Nuget包需要引用的库
1、Html Agility Pack(XPath 定位)
2、ScrapySharp(Css 定位)
代码下载地址:
https://github.com/happlyfox/FoxCrawler
第一点——加载网页结构
Html Agility Pack封装了加载内容的方法,使doc.Load(arguments),具有多种重载方式,以下列举官网的三个实例
/// <summary>
/// 加载网页结构
/// </summary>
private static void LoadDocment()
{
// 从文件中加载
var docFile = new HtmlDocument();
docFile.Load("file path");
// 从字符串中加载
var docHtml = new HtmlDocument();
docHtml.LoadHtml("html");
// 从网站中加载
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var docWeb = web.Load(url);
}
第二点——解析网页结构,转变为符合需求的数据实体
/// <summary>
/// 解析网页结构
/// </summary>
private static YouKu ParsingWebStructure()
{
/*选用优酷片库列表
地址:http://list.youku.com/category/show/c_96_s_1_d_1_p_{index}.html
*/
//首先加载web内容
var url = "http://list.youku.com/category/show/c_96_s_1_d_1_p_1.html";
var web = new HtmlWeb();
var doc = web.Load(url);
//输出WebHtml内容
//Console.WriteLine(doc.DocumentNode.InnerHtml);
/* HtmlAgilityPack 解析方式官网提供的有俩种示例*/
//1、 With XPath
var value = doc.DocumentNode.SelectSingleNode("//*[@id='total_videonum']").Attributes["id"].Value;
var resultCount = doc.DocumentNode.SelectSingleNode("//*[@id='total_videonum']").InnerText;
Console.WriteLine($"id='{value}' 筛选结果:{resultCount}个");
// 2、With LINQ
var linqNodes = doc.DocumentNode.SelectSingleNode("//*[@id='filterPanel']/div[2]/ul").Descendants("li").ToList();
Console.WriteLine("电影产地:");
List<string> videoCountry = new List<string>();
foreach (var node in linqNodes)
{
videoCountry.Add(node.InnerText);
Console.Write($"{node.InnerText} \t");
}
//3、使用ScrapySharp进行Css定位
var cssNodes = doc.DocumentNode.CssSelect("#filterPanel > div > label");
Console.WriteLine();
List<string> videoType = new List<string>();
foreach (var node in cssNodes)
{
videoType.Add(node.InnerText);
Console.Write($"{node.InnerText} \t");
}
//构造实体
YouKu model = new YouKu()
{
id = value,
videoNum = int.Parse(resultCount),
videoCountry = videoCountry,
videoType = videoType
};
return model;
}
public class YouKu
{
public string id { get; set; }
public int videoNum { get; set; }
public List<string> videoCountry { get; set; }
public List<string> videoType { get; set; }
}
第三点——保存数据实体,转变为符合需求的数据实体
/// <summary>
/// 保存数据实体
/// </summary>
private static void SavaData()
{
var model = ParsingWebStructure();
var path = "youku.txt";
if (!File.Exists(path))
{
File.Create(path);
}
File.WriteAllText(path, getJsonByObject(model));
}
private static string getJsonByObject(Object obj)
{
//实例化DataContractJsonSerializer对象,需要待序列化的对象类型
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
//实例化一个内存流,用于存放序列化后的数据
MemoryStream stream = new MemoryStream();
//使用WriteObject序列化对象
serializer.WriteObject(stream, obj);
//写入内存流中
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
//通过UTF8格式转换为字符串
return Encoding.UTF8.GetString(dataBytes);
}
第四点——main
static void Main(string[] args)
{
///爬虫的制作主要分为三个方面
///1、加载网页结构
///2、解析网页结构,转变为符合需求的数据实体
///3、保存数据实体(数据库,文本等)
/*
* 在实际的编码过程中,找到了一个好的类库“HtmlAgilityPack”。
* 介绍:
* 官网:http://html-agility-pack.net/?z=codeplex
* Html Agility Pack源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美)
* 使用说明:
* Html Agility Pack(XPath 定位),在实际使用过程中,发现有部分内容如果通过Css进行定位会比XPath更加方便,所以通过查找找到了另外一个CSS的解析了类库 ScrapySharp(Css 定位)
* 整理:
* Nuget包需要引用的库
* 1、Html Agility Pack(XPath 定位)
* 2、ScrapySharp(Css 定位)
*/
//第一点——加载网页结构,Html Agility Pack封装了加载内容的方法,使用doc.Load(arguments),具有多种重载方式,以下列举官网的三个实例
//LoadDocment();
//第二点——解析网页结构,转变为符合需求的数据实体
//ParsingWebStructure();
//第三点——保存数据实体,转变为符合需求的数据实体
SavaData();
Console.Read();
}
来源:https://www.cnblogs.com/foxhappy/p/14450449.html


猜你喜欢
- 初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉。这里记录下,以防以后用到这方面的知识点。窗体设计:c
- 前言注解是Java很强大的部分,但大多数时候我们倾向于使用而不是去创建注解。例如,在Java源代码里不难找到Java编译器处理的@Overr
- 基于SpringAOP已经实现统一功能增强,但如果希望对Controller增强,就无法获取其中的http请求数据。因此,实现以下这些统一增
- 本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个
- 1.查找数据库中表的列名<pre name="code" class="html">St
- 具体代码如下所示:public class MainActivity extends AppCompatActivity { p
- Oracle公司如期发布了Java 8正式版!没有让广大javaer失望。对于一个人来说,18岁是人生的转折点,从稚嫩走向成熟,法律意味着你
- 三元运算符:?很多语言中都有这个运算符,原理都是一样的,区别可能就在于书写的格式上。习惯了excel的方式,总想把多个表达式用 , 号隔开,
- 功能需求 最近项目中有这么一个功能,用户登录系
- 到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是。可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数
- vs2010测试通过,主要思想是由出生日期和当前日期,两个日期计算出年龄(岁、月、天)using System;using System.C
- 本文实例讲述了C++判断一个链表是否为回文结构的方法。分享给大家供大家参考,具体如下:题目:给定一个链表头节点head,请判断是否为回文结构
- 编写RedisConfig首先我们要明白RedisConfig中需要包含什么,首先看看我们直接使用RedisTemplate的问题,我们就知
- 本文实例讲述了Java Swing组件编程之JTable表格用法。分享给大家供大家参考,具体如下:表格是GUI编程中使用较多,但也是最麻烦的
- 本文实例为大家分享了Flutter实现顶部导航栏的具体代码,供大家参考,具体内容如下import 'package:flutter/
- 背景描述公司小程序商城项目,服务器为阿里云。前段时间总是出现服务器CPU报警现象(设置的阈值为95%,CPU使用率大于95%会自动报警)。通
- 1.与过滤器filter的区别2.springMVC中 * 的必须实现的三个方法:3. * 类的编写:package com.imooc.
- 前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。当有更新时,会弹
- 本文实例讲述了Winform中Treeview实现按需加载的方法,非常具有实用价值。分享给大家供大家参考。具体分析如下:最近项目里用到tre
- 本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组。数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间