.net 网页抓取链接到pdf文件不工作

hfyxw5xn  于 2023-04-07  发布在  .NET
关注(0)|答案(1)|浏览(113)

我曾试图从网页上抓取PDF文件(https://kodis-files.s3 .....)的链接,但没有任何成功。
我使用F#,但我希望那些用其他.NET语言编写的代码不会很难阅读。
我使用了这两种方法(代码已经简化,结果将被打印出来,而不是在其他地方使用):

//*******************************************
    let url0 = "https://www.kodis.cz/lines/region?tab=232-293"
    let document0 = HtmlDocument.Load(url0)

    document0.CssSelect("div#__next") 
    |> List.iter (fun item ->
                            let querySelector (tag: string) = (item.Descendants tag)                           
                            (querySelector "a")
                            |> Seq.iter (fun item ->      
                                                   let url = item.AttributeValue "href"
                                                   printfn "%s" url
                                        )           
                 ) 

    //*******************************************
    let url = "https://www.kodis.cz/lines/region?tab=232-293" 
    let document = HtmlDocument.Load(url)

    let links =
       document.Descendants "a"
       |> Seq.choose (fun x ->
                             x.TryGetAttribute("href")
                             |> Option.map (fun a -> x.InnerText(), a.Value())
                     ) |> Seq.toList   

    printfn "%A" links

两种变体都会抓取网站上的所有链接****除了指向pdf文件的链接

到有问题的网页的链接在代码中。我已经提取了与我的问题相关的html代码的一部分。

<div id="__next" data-reactroot="">
    <!-- many "a hrefs" with links to various stuff -->
    <main class="mt-16">
        <div class="container">         
            <div class="mb-12">
                <ul class="mb-8 grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-2">
                    <li class="Card_wrapper__ZQ5Fp">                        
                        <div class="Card_actions__HhB_f">
                            <a href="https://kodis-files.s3.eu-central-1.amazonaws.com/232_2022_12_11_2023_12_09_d02eef94bc.pdf" target="_blank" class="Button_main__pEB6O Button_secondary__R6QEg Button_md__1RLR1" data-testid="button-elementAnchor" title="Pravidelný jízdní řád">                              
                            </a>
                        </div>
                    </li>
                    <li class="Card_wrapper__ZQ5Fp">                        
                        <!-- another "a href" with a link to a pdf file -->                         
                    </li>
                    <li class="Card_wrapper__ZQ5Fp">
                        <!-- another "a href" with a link to a pdf file -->
                    </li>                   
                </ul>               
            </div>
        </div>
    </main>
</div>

**我做错了什么?**是否可能是网站创建者使用了一些“反抓取”软件?
**编辑:**正如Jim Foye所建议的,pdf链接似乎是由 JavaScript 创建的,因此不可能通过FSharp.DataHtmlAgilityPack.Net.WebClient.Net.Http.HttpClientwget的帮助来抓取。如果这个问题的唯一解决方案是以与浏览器保存代码相同的方式获取html代码,请参阅the related question。如果不是,请在这里提出解决方案。

qv7cva1a

qv7cva1a1#

我在链接的问题中看到你找到了一种方法来做到这一点。如果你能找到页面是如何由JavaScript生成的(就像你做的那样),那么直接获取数据是最佳的。
然而,如果这不起作用,还有一个很好的F#库covery可以让你自动化浏览器-所以你可以在浏览器中加载页面,然后提取链接:

#r "nuget:canopy"
open canopy
open canopy.classic

// Download chromedriver.exe from
// https://chromedriver.chromium.org/downloads
canopy.configuration.chromeDir <- "c:/temp/driver"

start chrome
url "https://www.kodis.cz/lines/region?tab=232-293"

您可以在F# Interactive中交互式地运行上述内容,等待页面加载并运行以下内容:

for el in elements "a" do
  let href = el.GetAttribute("href")
  if href.EndsWith("pdf") then
    printfn "%A" href

如果页面只是逐步加载数据,这也可能很有用。例如,您可以模拟单击页面上的“Další”按钮来加载更多数据:

click (elementWithText "a" "Další")

相关问题