【问题标题】:Retrieve web page content like a browser像浏览器一样检索网页内容
【发布时间】:2016-09-16 14:33:48
【问题描述】:

在了解了一些不同的技术之后,我想用 UWP+NoSQL 做一个小项目。我想做一个小型 UWP 应用,每天早上抓取星座并将其显示在我的树莓派上。

所以我拿了一个WebClient,然后我做了以下事情:

WebClient client = new WebClient();
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
string downloadString = client.DownloadString("http://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx?sign=2");

但它似乎检测到这个请求不是来自浏览器,因为有趣的部分不在内容中(当我检查浏览器时,它在初始 HTML 中,根据提琴手)。

我也尝试过使用 ScrapySharp,但得到了相同的结果。知道为什么吗?

(我已经完成了UWP部分,所以我不想仅仅因为它被检测为“机器人”而改变我的个人项目的主题)

编辑

看来我还不够清楚。问题是**不是*我无法解析 HTML,问题是我在使用 ScrapySharp/WebClient 时没有收到预期的 HTML

EDIT2

这是我检索到的内容:http://pastebin.com/sXi4JJRG

而且,我没有得到(例如)“按域划分的星级评分”+每颗星的相关图片

【问题讨论】:

  • 我试图找到那个 XML,但是我找不到。你能解释一下它在哪里吗?
  • @ganchito55 抱歉,我指的是最初的 HTML,而不是 XML。我只是说它没有在 ajax 调用中加载
  • 你试过 HTML 敏捷包吗??
  • 您具体想要什么部分?你能与你想要的那部分网络共享一个 pastebin 或类似的东西吗?
  • @Reddy 据我所知,Html Agility Pack 仅用于解析号?

标签: c# .net web webclient scrapy-spider


【解决方案1】:

您可以使用如下所示的代码sn-p阅读网页的全部内容:

internal static string ReadText(string Url, int TimeOutSec)
{
    try
    {
        using (HttpClient _client = new HttpClient() { Timeout = TimeSpan.FromSeconds(TimeOutSec) })
        {
            _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
            using (HttpResponseMessage _responseMsg = _client.GetAsync(Url))
            {
                using (HttpContent content = _responseMsg.Content)
                {
                    return content.ReadAsString();
                }
            }
        }
    }
    catch { throw; }
}

或者用一种简单的方式:

public static void DownloadString (string address)
{
    WebClient client = new WebClient ();
    string reply = client.DownloadString (address);

    Console.WriteLine (reply);
}

(回复:https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx

【讨论】:

  • 已经这样做了,问题是我没有得到与使用浏览器询问时相同的 HTML 内容。服务器似乎检测到我正在使用应用程序询问,并仅返回网站的结构而没有有趣的内容
【解决方案2】:

是的,WebClient 不会给你预期的结果。许多网站都有脚本来加载内容。所以要模拟浏览器,您还应该运行页面脚本。 我从来没有做过类似的事情,所以我的回答纯属理论。

要解决您需要“无头浏览器”的问题。 我知道这有两个项目(我从来没有尝试过):

http://webkitdotnet.sourceforge.net/ - 好像已经过时了

http://www.awesomium.com/

【讨论】:

  • 但是就像我提到的,内容存在于我在 fiddler 中获得的初始 HTML 文件中,因此它没有在 ajax 调用中加载
  • 真奇怪。刚刚尝试了您的代码并获得了带有星座的 HTML。我可以假设,您可能会在测试期间因许多请求而被禁止
  • 我刚刚从另一个网络、另一台计算机上进行了测试,得到了相同的结果。我在 pastebin 链接中发布了结果(在我的主要问题中)。你确定你得到了有趣的部分,而不仅仅是一些 HTML?
  • 抱歉,最近几天不在电脑旁。查看我收到的代码和您的代码。 pastebin.com/8cWe15hk
【解决方案3】:

好的,我想我知道发生了什么:我将真实输出(没有花哨的用户代理字符串)与您的 pastebin 提供的输出进行了比较,发现了一些有趣的东西。在第 213 行,您的 pastebin 具有:

<li class="dropdown"><a href="/us/profiles/zodiac/index-profile-zodiac-sign.aspx" class="dropdown-toggle" data-hov...ck">Forecast Tarot Readings</div>

注意结尾处的data-hov...ck。在实际输出中,这是:

<li class="dropdown"><a href="/us/profiles/zodiac/index-profile-zodiac-sign.aspx" class="dropdown-toggle" data-hover="dropdown" data-toggle="link">Astrology</a>

接下来是大约 600 行代码,包括前面提到的“有趣的部分”。在第 814 行,它说:

<div class="bot-explore-col-subtitle f14 blocksubtitle black">Forecast Tarot Readings</div>

从黑色的 ck 开始,与 pastebin 输出的其余部分相匹配。所以,要么是 pastebin 压缩了输出,要么是原始输出。

我创建了一个新的控制台应用程序,插入了你的代码,得到了我期望的结果,包括你似乎错过的 600 行 html:

static void Main(string[] args)
{
    WebClient client = new WebClient();
    client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
    string downloadString = client.DownloadString("http://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx?sign=2");

    File.WriteAllText(@"D:\Temp\source-mywebclient.html", downloadString);
}

我的WebClient 来自System.Net。并且更改 UserAgent 几乎没有任何效果,有几个链接有点不同。

所以,总结一下:您的问题与初始获取后动态插入的内容无关,但可能与 webclient 与 UWP 结合使用。网站上还有一个关于 webclient 和 UWP 的问题:(UWP) WebClient and downloading data from URL in 指出您应该使用 HttpClient。也许这是一个解决方案?

【讨论】:

    【解决方案4】:

    前段时间我使用了http://www.nrecosite.com/phantomjs_wrapper_net.aspx,它运行良好,正如 Anton 所说,它是一个无头浏览器。也许会有所帮助。

    【讨论】:

    • 你有任何打开页面的例子吗?我猜它在 PhantomJS 部分,但我找不到示例
    【解决方案5】:

    我想知道您希望在“内容”中看到的所有“有趣的部分”是否都是图像?您知道必须单独检索任何图像的事实吗? html 页面包含&lt;image.../&gt; 标签这一事实也不会神奇地显示它们。正如您在 Fiddler 中看到的那样,在检索页面后,浏览器会检索所有图像、样式表、javascript 和所有其他指定但未包含在页面中的项目。 (您可能需要清除浏览器缓存才能看到这种情况……)

    【讨论】:

    • 我非常了解 html。我期待获得图像元素并检查他们的 URL 以定义评级。正如我在问题的 pastebin 中显示的那样,似乎只有网站的模板(页眉、菜单、页脚),但没有那么多内容
    猜你喜欢
    • 2012-11-26
    • 2013-01-06
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多