当前位置:
首页 > temp > 简明python教程 >
-
用C#写个小程序爬取漫画
这是要爬的地址 https://www.iqiyi.com/manhua/detail_18yzlq8jc5.html,F12 查看网络发现他是通过 https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/ 这个接口获取目录信息的。
这是第一话的地址 https://www.iqiyi.com/manhua/reader/18yzlq8jc5_18yzebufq1.html ,跟接口返回的数据对比发现前面的部分是固定的,后面的就是 comicId+"_"+episodeId+".html"。
下面通过C#代码获取漫画第一话的地址。
首先准备一个类方便解析json
class ResponseData { public Data data { get; set; } } class Data { public List<Episode> episodes { get; set; } } class Episode { public string comicId { get; set; } public string episodeId { get; set; } }
HttpClient client = new HttpClient(); var json = client.GetStringAsync("https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/").Result; var responseData = JsonConvert.DeserializeObject<ResponseData>(json); responseData.data.episodes.ForEach(x => { Console.WriteLine($"https://www.iqiyi.com/manhua/reader/{x.comicId}_{x.episodeId}.html"); });
这样每一话的地址就显示出来了,最后把每话里的图片保存起来就行了。打开第一话,发现图片地址不是从接口返回的,而是直接写在html里的
在浏览器开发者工具中选中一个图片标签,选择复制 XPath,会得到 /html/body/div[3]/ul/li[1]/img
再把后面的 li[1] 改成 li,然后搜索,就把html中所有的img标签都找到了
下面用C#完成上面的操作,首先需要装一个第三方库。
long i = 1; responseData.data.episodes.ForEach(x => { var url = $"https://www.iqiyi.com/manhua/reader/{x.comicId}_{x.episodeId}.html"; var html = client.GetStringAsync(url).Result; var document = new HtmlDocument(); document.LoadHtml(html); //XPath的含义是html下的body下的第二(三)个div下的ul下的。。。 //注意这里如果用/html/body/div[3]/ul/li/img会返回null,使用/html/body/div[2]/ul/li/img才能正常返回,是因为从浏览器开发者工具看的html代码是经过浏览器渲染后的,有时候页面结构跟源码会不一样,遇到这种就要直接去源码中去查看 var nodes = document.DocumentNode.SelectNodes("/html/body/div[2]/ul/li/img"); nodes.ToList().ForEach(n => { //查看源码发现只有前三个图片的地址在src属性里,后面的都是在data-original属性里,所以要分两种情况去获取图片地址 string imgUrl = ""; if (n.Attributes["src"] != null) { imgUrl = n.Attributes["src"].Value; } else { imgUrl = n.Attributes["data-original"].Value; } if (imgUrl != null) { var stream = client.GetStreamAsync(imgUrl).Result; //这里要添加System.Drawing引用 var image = System.Drawing.Image.FromStream(stream); if (!Directory.Exists("D:\\海贼王\\")) { Directory.CreateDirectory("D:\\海贼王\\"); } image.Save("D:\\海贼王\\" + i + ".jpg"); i++; } }); });
大功告成!!
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数