【问题标题】:Download all PDF files from crawled links从抓取的链接下载所有 PDF 文件
【发布时间】:2020-01-07 12:18:57
【问题描述】:

在运行代码时,它说ProductListPage 为空,并且在删除错误后不会继续前进。

任何想法如何解决这个问题?等到找到//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a 或者别的什么?

这是我当前的代码:

HtmlDocument htmlDoc = new HtmlWeb().Load("https://example.com/");
HtmlNodeCollection ProductListPage = htmlDoc.DocumentNode.SelectNodes("//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a");
foreach (HtmlNode src in ProductListPage)
{
    htmlDoc = new HtmlWeb().Load(src.Attributes["href"].Value);

    HtmlNodeCollection LinkTester = htmlDoc.DocumentNode.SelectNodes("//div[@class='row padt6 padb4']//a");
    if (LinkTester != null)
    {
        foreach (var dllink in LinkTester)
        {
            string LinkURL = dllink.Attributes["href"].Value;
            Console.WriteLine(LinkURL);

            string ExtractFilename = LinkURL.Substring(LinkURL.LastIndexOf("/"));
            var DLClient = new WebClient();

            DLClient.DownloadFileAsync(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
        }
    }
}

编辑:

代码似乎在没有 VPN 连接的情况下工作,但它不适用于 VPN。我有使用 Python 和 BeautifulSoup 的替代方案,无论 VPN 连接如何,它都能正常工作。有什么想法为什么 C# 和 htmlAgilityPack 不能解决问题吗?


EDIT2:

我注意到 VPN 连接页面的加载稍有延迟。第一个页面正在加载,然后是内容。

【问题讨论】:

  • 这比 c# 更直观。请更新您的帖子以反映这一点
  • 糟糕,抱歉。这里是 C#

标签: c# web-scraping web-crawler html-agility-pack


【解决方案1】:

确保您有权访问该网站(防火墙或其他应用可能不允许访问)。

当我运行 Visual Basic 和 .Net 的代码时,我可以访问子站点,甚至可以查找 Pdf 链接。我建议使用调试器来

  1. 检查您是否可以在浏览器中访问该网站。
  2. 如果您可以访问该站点,请使用调试器查看您拥有的 htmlDoc.DocumentNode 的 InnerHtml
  3. 如果你得到数据,把它复制到记事本,看看标签是否在那里。你应该有一个完整的 HTML Doc。
  4. 对于代理服务器,将信息添加到加载调用。 https://stackoverflow.com/a/12099646/1390548

【讨论】:

  • 即使是 C# 代码也能正常工作。通过您的浏览器检查,看看您是否可以访问您的网站
  • 似乎代码在 VPN 连接开启时不起作用,但是一旦 VPN 被禁用,它就会再次起作用。我还有一个,用 Python 编写的,它可以在 VPN ON 和 OFF 的情况下工作。 C# 不能与 VPN 一起使用有什么原因吗?应该有一些 async/await 吗?
  • 我在考虑代理,但是为什么 Python 和 BeautifulSoup 可以完成这项工作,而 C# 和 htmlAgilityPack 却不能呢?
  • BeautifulSoup 可能会自动从您的系统中获取代理设置,而 HtmlAgilityPack 没有(不过这只是猜测)。
【解决方案2】:

经过大约 2 个月的搜索和阅读,终于有了解决方案。将此添加到 app.config 对我有用,无需任何代码更改:

<system.net>
   <defaultProxy useDefaultCredentials="true" />
</system.net>

所以我的app.config 现在看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>

请为此给出原始答案! https://stackoverflow.com/a/40900485/7202022

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2019-10-28
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多