:(ダウンロード昨日のニュースを読んで、彼はその学校の教科書PEP PEPは、スプリング材料の電子版を開くとhttp://bp.pep.com.cn/jc/ 、と彼の息子完全なダウンロードを考えること)将来の使用のために。しかし、トラブルは本当にただ爬虫類を書くために、時間を節約するために、手動ダウンロードを退屈されます。もともと次回、長い時間無用のC#に戻って、使用のpythonに意図され、そしてそれは、C#、それに書かれています。
アイデアとを以下のように具体的な手順は、
1.ウェブページアドレス電子書籍に取得する方法を学ぶために構造および接続ページジャンプを分析します。
まず、主に広いカテゴリーに分け、一次および二次の学校によると、これらの分野の以下の幅広いカテゴリの各々は、毎秒小さなクラスを有する別の2つの最初のページは、カテゴリページである、に関与ページ電子書籍のダウンロードの詳細ページの下の全学年種目。
上記の2つのページによると、私は、その内容のそれぞれにアクセスするすべてのカテゴリのWebアドレスおよび各被験者の下の各カテゴリへの最初のページから取得した後、各専門分野のページ反復コンテンツをオンにすることを決めました電子書籍アドレス、各専門分野での非同期ダウンロード電子書籍をマルチスレッドすることが最後。
アドレスからの電子書籍2. htmlページは、あなたがアクセスWebページを処理するための2つのライブラリ、いずれかを使用してネットワーククラスをダウンロードする必要があり、クラスライブラリは、HTMLの構造を分析するために使用されます。ここで私は、WebクライアントとHtmlAgilityPackを使用しています。
ステップ1のアイデアは、カテゴリーの下のコードのhtmlページの構造の最初の分析、およびは、大規模なライブラリカタログへのアクセスを実現するために、第2のステップで選択して、ページのURLの下に様々な分野に分類し、辞書<文字列で結果を返しますリストの<string >>鍵は、小学校中・高校にこれらの大カテゴリ名を表し、保存するには、リスト<string>は、ページアドレス様々な分野の下で大分類を示しています。次のように具体的なコードは次のとおりです。
// 様々な分野に各ページのアドレスを取得 、公開を 非同期タスク<辞書< 文字列、リスト< 文字列 >>> GetSubjectPageUrlsAsync() { VAR URL = BASE_URL。 辞書 < 文字列、リスト< 文字列 >> bookUrls = 新しい辞書< 文字列、リスト< 文字列 >> (); VAR categoryXpath = " // * [ID @ = \"コンテナ\ "] / DIV [@class = \" list_sjzl_jcdzs2020 \ "] " ; // 取得し、指定されたアドレスのhtmlページのコンテンツ WebクライアントWebクライアント= 新しい新しいWebクライアント(); VARの内容= のawait webClient.DownloadStringTaskAsync(URL); // HTMLDocumentの処理のためにコンテンツにHTMLコンテンツロード のHTMLDocumentのHTMLDocument = 新しい新規のHTMLDocument()を。 htmlDocument.LoadHtml(コンテンツ)。 // 指定されたパスのノードセット取得 HtmlNodeCollection booksListEle = htmlDocument.DocumentNode.SelectNodes(categoryXpath)を、 もし(booksListEle!= nullの) { foreachの(VARの項目でbooksListEle) { // 中学校、小学校などを取得するこれらのカテゴリは、名前 文字列のタイトル= 文字列; .Emptyを VAR titleNode = item.SelectSingleNode(" .// div要素[= @class \" container_title_jcdzs2020 \ "] " ); IF(!TitleNode = ヌル) { タイトル =タイトルノード?.InnerText; } // これらの中等学校、小学校や他の分野の次の分類を取得する場所ページアドレス HtmlNodeCollection urlsNodes = item.SelectNodes(" .//a " ); IF(?UrlsNodes .Count> 0 ) { VARのリスト= 新しいリスト< 文字列 > (); foreachの(HtmlNode urlItem でurlsNodes) { VAR fullurlを= URL + urlItem.Attributes [ " HREF " ] .Value.Substring(2 )。 list.Add(fullurlを)。 } もし(!文字列 .IsNullOrEmpty(タイトル)&& list.Count> 0 ) { bookUrls.Add(タイトル、リスト)。 } } } } リターンbookUrls。 }
4.結果は反復3に示した、電子書籍のためのアドレスは、様々な分野のページコンテンツから抽出されます。具体的なコードは次のよう:
// のページ電子書籍アドレスに様々な分野を取得する プライベート 非同期タスク<(文字列の件名、リスト<(文字列 BookName、文字列 BookUrl)>ブックス)> GetSubjectBooksAsync(文字列のURL) { constの 文字列 contentRootXpath = " // * [ID @ = \"コンテナ\ "] / DIV [@class = \" con_list_jcdzs2020 \ "] " ; // 取得HTMLコンテンツ Webクライアントクライアント= 新しいWebクライアント(); 文字列のWebContent = のawait client.DownloadStringTaskAsync(URL); // HTMLDocumentのでロードHTML文字列 のHTMLDocument HTMLDocumentの= 新しいのHTMLDocument(); htmlDocument.LoadHtml(のWebContent)。 HtmlNodeルートノード = htmlDocument.DocumentNode.SelectSingleNode(contentRootXpath)。 // 。件名を取得获取学科名称 HtmlNode titleEle = rootNode.SelectSingleNode(" .// divの[@class = \" con_title_jcdzs2020 \ "] " ); 文字列の件名= 文字列 .Concat(titleEle .InnerText.Where(C =>?!CHAR .IsWhiteSpace(C))); // 件名でブックのすべてを取得します。 // 規律の下にすべての書籍のリストを取得し、ダウンロードを開始 (HtmlNodeCollection bookNodes = rootNode.SelectNodesを「.//li 」); 一覧 <(文字列 BookName、文字列 BookUrl)>図書= 新しいリスト<(文字列 BookName、文字列 BookUrl)> (); もし(bookNodes!= nullの && bookNodes.Count> 0 ) { 文字列 bookName = nullを。 文字列 bookUrl = nullを。 foreachの(HtmlNode liItem でbookNodes) { bookName = FixFileName(文字列 .Concat(liItem.ChildNodes [ " H6 " ] .InnerText.Where(C =>!CHAR .IsWhiteSpace(C)))); // 本の名前を取得 bookUrl = liItem.ChildNodes [ " DIV " ] .ChildNodes [ 3 ] .Attributes [ " HREF " ] .Valueの。// 電子ブックのURLを取得 books.Add((bookName、bookUrl))。 } } リターン(件名、書籍); }
ステップ4で得られた電子書籍アドレスから5.スタートダウンロード冊。具体的なコードは次のよう:
// 単一アカウントですべての書籍をダウンロードするには 専用 の非同期タスクDownloadBooksAsync(文字列のディレクトリ、文字列 baseUrlに、(文字列の件名、リスト<(文字列 BookName、文字列 BookUrl)>本)書籍、アクション< 文字列、文字列 > コールバック) { // サブディレクトリとディレクトリで指定された時に下を作成します。 //は、サブディレクトリの作成 DIR = Path.Combine(DIR、books.Subjectを)。 DIR = FixPath(DIR)。 もし(!のDirectory.Exists(DIR)) { Directory.CreateDirectory(DIR)。 } // タスクリストの構築 リスト<タスク> downloadTasks = 新しい新しいリスト<タスク> (); int型 COUNT = 0 ; foreachの(VARブックでbooks.Books) { WebClientのWC = 新しいWebクライアント(); Uri.TryCreate(baseUrlに + book.BookUrl [ 2 ..]、UriKind.Absolute、アウトウリbookUri)。 VaRのパス= Path.Combine(DIR、@ $ " {book.BookName} .PDF " )。 var fiが= 新しいのFileInfo(パス); もし(!fi.Exists || fi.Length == 0 ) { VaRのタスク= wc.DownloadFileTaskAsync(bookUri、パス); downloadTasks.Add(タスク)。 カウント ++ ; } } // 待機ジョブが終了したすべてのダウンロードのために、コールバック関数が実行する のawait Task.WhenAll(downloadTasks).ContinueWith((タスク)=> {コールバック(books.Subject ?? 文字列.Empty、count.ToString());}); }
6.ここでは、いくつかの方法のコアが完了しています。ニーズインタラクティブインタフェース、グラフィカルインターフェース、コンソールまたはウェブページ、および特定のアプリケーションロジックに従って調製のためのインターフェースとして、適切な実装を選択するために応じてその上にダウン。時間とシンプルさを節約するために、私は、コンソールを選びました。特定のコードが興味のある人は、ここで説明されていない、あなたはgithubのビューからの完全なコードをダウンロードすることができます。Githubの固有アドレスは次のとおりです。https://github.com/topstarai/PepBookDownloader