這是要爬的地址 https://www.iqiyi.com/manhua/detail_18yzlq8jc5.html,F12 查看網路發現他是通過 https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/ 這個介面獲取目錄信息的。 這是第一話的地址 http ...
這是要爬的地址 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++; } }); });
大功告成!!