Как извлечь HTML код из WebView

Ответить
Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Как извлечь HTML код из WebView

Сообщение azze » 14 июн 2014, 15:49

Всем привет. Андроид программированием занимаюсь не так давно, начал изучать с помощью отличных видеоматериалов Виталия, за что огромное спасибо ему. Давно (пару недель) уже мучаюсь с проблемой извлечения HTML кода из WebView компонента. Дело в том что, я не могу использовать HttpClient для этого, так как веб страница содержит данные, которые генерируются скриптом после загрузки браузером страницы. Поэтому единственным решением, по-моему мнению, будет воспользоваться WebView компонентом, который будет загружать страницу, после которого я должен прочесть его HTML код. Вроде бы нашел решение данной задачи http://blog.weinigel.se/2014/03/getting ... bview.html. Но там кажись упускается момент как загрузить этот самый URL (веб страницу). Прошу помочь советом, может есть и другие способы обработки HTML страницы. Всем большое спасибо заранее, жду с нетерпением ваших комментариев к теме.


P.S. Хочу немного прояснить ситуацию с генерируемыми данными. Привожу пример с браузером Google Chrome. Так, если открыть сайт и просмотреть его исходный код обычным стандартным способом (Ctrl+U), то этих данных, что мне нужно обработать невидно внутри HTML кода. Но если просмотреть HTML код путем F12, то генерируемые скриптом данные появляются внутри HTML.

http://xebralabs.blogspot.de/2011/03/ex ... bview.html - Пример чтения HTML из WebView пользуясь возможностями WebViewClient и JavascriptInterface. Но указанный код неполный, и сложно для новичка самому дописать.
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 15 июн 2014, 11:30

Я конечно не знаю, что там у вас в windows происходит путем F12... (к примеру у меня в fedora и маке открыватеся guake терминал....) подозреваю, что имеете вы ввиду ctr+shift+J (стандартная комбинация хрома для открытия консоли разработчика)? Делать такого не пытался я, но подозреваю, что всю страницу можно сначала curl -ом закачать в assets и оттуда уже читать. Ну или на много проще, отправляя запрос с тем же HttpClient, передайте нужные заголовки(можно через ту же консоль посмотреть, что шлет ваш браузер) и представьтесь браузером google-chrome, получите тот же результат...
Изображение

Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Re: Как извлечь HTML код из WebView

Сообщение azze » 15 июн 2014, 14:39

Спасибо за ответ. Смотрите в скриншоте пример F12 в хроме http://prntscr.com/3t0ga8. Через HttpClient не получается даже передав все нужные заголовки. Решение проблемы нашел тут http://lexandera.com/2009/01/extracting ... a-webview/.
Меня заинтересовал ваш метод о том как с curl -ом закачать в assets, как это реализовать, можете привести пример из интернета?
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 15 июн 2014, 14:46

azze писал(а):Спасибо за ответ. Смотрите в скриншоте пример F12 в хроме http://prntscr.com/3t0ga8. Через HttpClient не получается даже передав все нужные заголовки. Решение проблемы нашел тут http://lexandera.com/2009/01/extracting ... a-webview/.
Меня заинтересовал ваш метод о том как с curl -ом закачать в assets, как это реализовать, можете привести пример из интернета?
пример того, как в java работает curl - http://stackoverflow.com/a/2587000/2611075
дальше можно работать как с обычными файлами или любыми другими доступными локально.

P.S. значит вы не все заголовки передали раз не получается, к примеру user -agent(для хрома (в моем случае)это: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36), куки и т.д. просто потому, что иначе не бывает, т.к. получив эти заговоки в полном объему вы будете браузером для сервера и получите ровно то -же, что вы видите в консоле разработчика.
Изображение

Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Re: Как извлечь HTML код из WebView

Сообщение azze » 16 июн 2014, 16:24

altwin писал(а): P.S. значит вы не все заголовки передали раз не получается, к примеру user -agent(для хрома (в моем случае)это: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36), куки и т.д. просто потому, что иначе не бывает, т.к. получив эти заговоки в полном объему вы будете браузером для сервера и получите ровно то -же, что вы видите в консоле разработчика.
Тут дело не в том как клиент представляется серверу (имею ввиду заголовки к запросу), сам HttpClient не поддерживает такую возможность (пробовал отправлять все нужные заголовки). Поэтому решил остановиться пока на WebView, но он не очень удобен, так как пока он грузит страницу полностью то уходит немало секунд.
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 17 июн 2014, 11:01

azze писал(а):
altwin писал(а): P.S. значит вы не все заголовки передали раз не получается, к примеру user -agent(для хрома (в моем случае)это: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36), куки и т.д. просто потому, что иначе не бывает, т.к. получив эти заговоки в полном объему вы будете браузером для сервера и получите ровно то -же, что вы видите в консоле разработчика.
Тут дело не в том как клиент представляется серверу (имею ввиду заголовки к запросу), сам HttpClient не поддерживает такую возможность (пробовал отправлять все нужные заголовки). Поэтому решил остановиться пока на WebView, но он не очень удобен, так как пока он грузит страницу полностью то уходит немало секунд.
Не поддерживает он потому, что user agent: [HTTP_USER_AGENT] => Apache-HttpClient/UNAVAILABLE(java 1.4).
используя же webview вы получаете что -то вроде user agent: [HTTP_USER_AGENT] => Mozilla/5.0(Linux; U; Android 2.2; en-gb; LG-P500 Build/FRF91)
AppleWebKit/533.0 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Все, что вам нужно, это установить параметр по примеру: client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Custom user agent");
Вопрос только в том, что и принимать ыв должны не стандартными средствами а к примеру прямо в строку, чтобы ответ никак не обрабатывался.
Чтобы не парить себе мозг выполняя всю эту работу руками вы можете использовать готовый клиент предназначенный для парсинга, к примеру этот: http://jsoup.org/
Изображение

Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Re: Как извлечь HTML код из WebView

Сообщение azze » 22 июн 2014, 03:35

Спасибо, что стараетесь помочь. Я все перепробовал что вы посоветовали, но не получается извлекать из HTML страницы сгенерированные данные. Буду очень благодарен, если сможете привести конкретный пример кода, возможно я что-то упускаю.

Хочу привести 2 варианта кода, по которым пробовал:

1)

[syntax=java] String url = "http://www.имя_сайта";

URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();

con.setRequestMethod("GET");

//add request header
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36");
con.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
con.setRequestProperty("Accept-Language","ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2,de;q=0.2");


BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();

//print result
System.out.println(response.toString());[/syntax]


2)

[syntax=java] HttpClient client = new DefaultHttpClient();

client.getParams()
.setParameter(
CoreProtocolPNames.USER_AGENT,
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36");

HttpGet httpget = new HttpGet(
"http://www.имя_сайта");

httpget.setHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpget.setHeader(
"User-Agent",
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36");
httpget.setHeader("Accept-Language",
"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2,de;q=0.2");

HttpResponse response = client.execute(httpget);

String responseBody = EntityUtils.toString(response.getEntity());[/syntax]
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 22 июн 2014, 10:03

попробуйте простым java:
[syntax=java5]
URL url = new URL("http://stackoverflow.com");
BufferedReader reader = null;

try {
reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

for (String line; (line = reader.readLine()) != null;) {
System.out.println(line);
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException ignore) {}
}
[/syntax]
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 22 июн 2014, 10:24

Хотя если подумать мне кажется проблема в том, что javascript до генерации контента ждет полной загрузки страницы, а вы ее скачиваете до того, как. В SWT есть возможность сделать что то подобное:
[syntax=java5]
JWebBrowser webBrowser = new JWebBrowser();
webBrowser.navigate("http://dummy.net/");
webBrowser.addWebBrowserListener(new WebBrowserListener(){
public void loadingProgressChanged(WebBrowserEvent e){
if(e.getWebBrowser().getLoadingProgress()==100)
System.out.println(webBrowser.getHTMLContent());
}
}
[/syntax]
В android вам придется использовать webviewclient, а пользователю происходящее не понравится, потому, как сначала придется открыть браузер и загрузить страницу. Т.е. эту задачу нужно переносить на сервер и оттуда уже получать результат.

P.S. можно попробывать использовать htmlunit, по примеру - http://pastebin.com/FePkm2kp
Но если честно я не занимался парсингом в android, как то на perl было бы поприятне или python на крайний случай...
В любом случае задача дождаться полной загрузки страницы.
Изображение

Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Re: Как извлечь HTML код из WebView

Сообщение azze » 23 июн 2014, 19:00

altwin писал(а):попробуйте простым java:
[syntax=java5]
URL url = new URL("http://stackoverflow.com");
BufferedReader reader = null;

try {
reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

for (String line; (line = reader.readLine()) != null;) {
System.out.println(line);
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException ignore) {}
}
[/syntax]
Пробовал, не получается.

altwin писал(а):Хотя если подумать мне кажется проблема в том, что javascript до генерации контента ждет полной загрузки страницы, а вы ее скачиваете до того, как.
Совершенно верно.

altwin писал(а): В android вам придется использовать webviewclient, а пользователю происходящее не понравится, потому, как сначала придется открыть браузер и загрузить страницу.
Согласен, поэтому выше (viewtopic.php?f=41&t=4286#p31742) я тоже отметил, что с webviewclient_ом получилось решить задачу.

Спасибо за внимание, теперь уже точно ясно, другими способами не получается :)
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как извлечь HTML код из WebView

Сообщение altwin » 23 июн 2014, 20:41

azze писал(а):
Спасибо за внимание, теперь уже точно ясно, другими способами не получается :)
Я бы не был так категоричен, во первых никто не отменял возможность сделать почеловечески не используя костыли, т.е. как я и говорил ранее - используя свой сервер для этого, который уже будет отдавать на android результат. Во вторых никто не отменял библиотеки используемые в тестировании по типу - https://code.google.com/p/selenium/wiki/AndroidDriver и всякого рода web spiders которые умеют и формы заполнять и по ссылкам бегать и страницу вашу загрузят, вот только придется поучиться с ними обращаться.
Пример того как это веглядит с selenium из доков:
[syntax=java5]
public class OneTest extends TestCase {

public void testGoogle() throws Exception {
WebDriver driver = new AndroidDriver();

// And now use this to visit Google
driver.get("http://www.google.com");

// Find the text input element by its name
WebElement element = driver.findElement(By.name("q"));

// Enter something to search for
element.sendKeys("Cheese!");

// Now submit the form. WebDriver will find the form for us from the element
element.submit();

// Check the title of the page
System.out.println("Page title is: " + driver.getTitle());
driver.quit();
}
}
[/syntax]
P.S. Ну и как бы в очередной раз в чем проблема загрузить страницу - CURL-ом? решений на самом деле много и даже очень много в первых результатах выдачи google поиска, вопрос только в желании...
Изображение

Аватара пользователя
azze
Сообщения: 7
Зарегистрирован: 26 фев 2014, 11:53

Re: Как извлечь HTML код из WebView

Сообщение azze » 03 июл 2014, 15:26

Дело не в желании, его у меня предостаточно, а в навыках андроид программирования, иначе зачем я посетил этот форум.

CURL-ом не получается, не видит те данные что мне нужно. Про AndroidDriver встречал информацию, но пока не разобрался как им пользоваться. Может гугл и выдает куча результатов, но это не значит что все они являются решениями данной задачи.
Постараюсь в направлении AndroidDriver изучить вопрос, может смогу решить.
Животные, являющиеся редкими, занесены в красную книгу, а все остальные - в книгу о здоровой и вкусной пище!

Ответить