尝试获取HTML内容时被阻止 [英] Blocked when trying to get the content of HTML

查看:125
本文介绍了尝试获取HTML内容时被阻止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



以下是实现:
我试图从网站获取HTML内容,但它被JavaScript阻止。

   - (void)viewDidLoad 
{
NSURL * htmlUrl = [NSURL URLWithString:@https://color.adobe.com/探索/最流行/时间=周];
NSStringEncoding htmlEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);

NSString * htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

NSLog(@%@,htmlString);

NSData * htmlData = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
TFHpple * htmlHpple = [TFHpple hppleWithHTMLData:htmlData];

NSLog输出的一部分:

 < h1>禁用JavaScript< / h1> 
< p> Adob​​e Color CC需要使用JavaScript才能正常加载。请在您的浏览器中启用JavaScript并重新加载页面。< / p>
< / li>
< li>
< h1> JavaScript estdésactivé< / h1>
< p>请注意,Adobe Color CC安装了JavaScript。 Veuillez activer JavaScript dans votre navigateur et recharger la page。< / p>
JavaScript ist erforderlich,使用Adobe Color CCordnungsgemäßgeladen wird。 Aktivieren Sie JavaScript的浏览器和装载Sie die Seite neu。
< / p>
< / li>
< li>
< h1> JavaScriptが无效です< / h1>
< p> Adob​​e Color CC是JavaScript的必备条件。使用JavaScript可以有效地再次使用,并且可以继续使用。< / p>
< / li>
< li>
< h1> JavaScript desactivado< / h1>
< p>参考Adobe Color CC pueda cargarse correctamente,se requiere JavaScript。活跃的JavaScript中文版和英文版。< / p>
< / li>

那不是我想要的。



实际上,当您打开网址时,您可以看到很多颜色。这就是我想要解析和获取的内容。

但不是

< h1>禁用JavaScript< / h1>
< p> Adob​​e Color CC需要使用JavaScript才能正常加载。 < / p>

解决方案

其中as我已经分析并从你提供的url中发现,它只使用简单的http请求加载网页的一部分,并使用ajax请求加载所有其他部分,如颜色。所以,当你要求使用简单的代码
NSString * htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];



然后,它不会像web浏览器中显示的那样提供大量的html代码,但只提供一小部分。如果你想要整个html代码,然后使用 UIWebView 加载url,然后当web视图完成加载时,使用代码找到html字符串



NSString * htmlString = [webView stringByEvaluatingJavaScriptFromString:@document.documentElement.outerHTML];



重要注意事项:要查找webView何时已经存在,请按照以下步骤进行操作:完成ajax加载后,您必须在您的webView中注入一些java脚本以在ajax请求完成加载时调用您的代理。或者只是为了验证我的代码,您可以简单地使用

$ $ $ $ $ $ c $ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(),^ {
NSString * htmlString = [webView stringByEvaluatingJavaScriptFromString:@document.documentElement.outerHTML];
});

在ajax请求将在20秒内完成加载时调用您的代码。内部Web视图委托方法



- (void)webViewDidFinishLoad:(UIWebView *)webView



希望这是你想要的,另外还有一件事是javascript在默认情况下包含在webView中,你不需要自己注入它。


I am trying to get the HTML content from a website , but it is blocked by JavaScript.

Here is the implementation:

- (void)viewDidLoad
{
  NSURL *htmlUrl = [NSURL URLWithString:@"https://color.adobe.com/explore/most-popular/?time=week"];
  NSStringEncoding htmlEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);

  NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

  NSLog(@"%@",htmlString);

  NSData *htmlData = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
  TFHpple *htmlHpple = [TFHpple hppleWithHTMLData:htmlData];
}

Some part of the NSLog output:

    <h1>JavaScript Disabled</h1>
<p>Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.</p>
</li>
<li>
  <h1>JavaScript est désactivé</h1>
  <p>Pour pouvoir se charger correctement, Adobe Color CC requiert JavaScript. Veuillez activer JavaScript dans votre navigateur et recharger la page.</p>
  JavaScript ist erforderlich, damit Adobe Color CC ordnungsgemäß geladen wird. Aktivieren Sie JavaScript im Browser und laden Sie die Seite neu.
  </p>
</li>
<li>
  <h1>JavaScript が無効です</h1>
  <p>Adobe Color CC で正しく読み込みを行うには、JavaScript が必要です。ご使用のブラウザーで JavaScript を有効にして、ページを再読み込みしてください。</p>
</li>
<li>
  <h1>JavaScript desactivado</h1>
  <p>Para que Adobe Color CC pueda cargarse correctamente, se requiere JavaScript. Active JavaScript en el navegador y vuelva a cargar la página.</p>
</li>

That is not what I want.

Actually, when you open the url, you can see lots of colors. And that's what I want to parse and fetch.

But not the

<h1>JavaScript Disabled</h1> <p>Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.</p>

解决方案

Where as I have analysed and find from the url you have provided is that, this loads only a part of web page using simple http request and loads all other parts like the colors using the ajax request. So when you will ask for code using simple
NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

Then it will not give you the whole bunch of html code as shown in web browser but provide only a small part. If you want the whole html code then load the url using the UIWebView and then when web view will complete loading then find the html string using code

NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];

and it will give you the whole html code as seen in web browser, now you can find whatever you want.

Important note: To find when the webView has completed ajax loading, you will have to inject some java script in your webView to call your delegates when ajax request complete loading. Or only to verify my code you can simply use

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
       NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
    });

To call your code when the ajax request will approximately complete loading in 20 seconds. inside web view delegate method

- (void)webViewDidFinishLoad:(UIWebView *)webView

Hope this is what you want, and one more thing the javascript is by default included in webView you do not need to inject it by your own.

这篇关于尝试获取HTML内容时被阻止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆