用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++;

        }
    });
});

 

 

大功告成!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM