ورود

View Full Version : سوال: web scraper - html grabber - browser simulator - HtmlUnit



mhjbarnamenevis
دوشنبه 12 تیر 1396, 12:35 عصر
سلام
من می خواهم با جاوا از اینترنت (سایت های مختلف) داده هایی بگیرم.

الان دارم این کار را با برنامه ی htmlUnit انجام می دهم و تا حدودی موفق بوده ام... ولی به نگر می رسد برنامه مشکل دارد. (مشکل این است که نمی توانم روی دکمه ی صفحه ی بعد در این سایت (http://codal.ir) کلیک کنم و به صفحه ی بعد بروم)
کسی اینجا هست که با این برنامه کار کرده باشد و بتواند مشکل من را برطرف کند؟؟؟

اگر تا به حال با این برنامه کار نکرده اید آیا برنامه ی خوب دیگری سراغ دارید که بتواند برایم اطلاعات را از سایت ها بگیرد؟ (و نیز بتواند روی دکمه کلیک کند، احیانا کوکی و تنظیمات سایت را ذخیره کند...)

سایت هایی که می خواهم از آنها داده بگیرم:
codal.ir
tsetmc.com


متشکرم.

vahid-p
سه شنبه 13 تیر 1396, 00:20 صبح
شما باید یک Http post request بفرستید که هدرها و پارامترهاش برابر همون چیزی باشه که مرورگرها میفرستن. برای اینم میتونید از مرورگری مثل فایرفاکس و کروم استفاده کنید و ببینید هنگام ارسال چه پارامترهایی پست میشه. من با کتابخانه htmlunit کار نکردم و شاید خودش خیلی از اینکارها رو انجام بده که باید داکیومنتش رو بخونید و اگر باز هم مشکلی بود،‌کد و خطاهایی که میگیرید رو قرار بدید

mhjbarnamenevis
سه شنبه 13 تیر 1396, 03:40 صبح
شما باید یک Http post request بفرستید که هدرها و پارامترهاش برابر همون چیزی باشه که مرورگرها میفرستن. برای اینم میتونید از مرورگری مثل فایرفاکس و کروم استفاده کنید و ببینید هنگام ارسال چه پارامترهایی پست میشه. من با کتابخانه htmlunit کار نکردم و شاید خودش خیلی از اینکارها رو انجام بده که باید داکیومنتش رو بخونید و اگر باز هم مشکلی بود،‌کد و خطاهایی که میگیرید رو قرار بدید

مجددا سلام و عرض ادب،

مگر می شود فهمید مرورگر واقعی من چه چیز هایی می فرستد؟ از کجا باید بفهمم؟
آیا می توان فهمید با زدن فلان دکمه در مرورگرم کدام اسکریپت اجرا می شود؟؟؟

===================

خطایی که می گیرم این است:

Jul 04, 2017 4:26:37 AM com.gargoylesoftware.htmlunit.javascript.StrictErr orReporter runtimeError
SEVERE: runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: :x).] sourceName=[http://codal.ir/js/jquery-1.10.2.min.js] line=[1] lineSource=[null] lineOffset=[0]
Jul 04, 2017 4:27:04 AM com.gargoylesoftware.htmlunit.javascript.StrictErr orReporter error
SEVERE: error: message=[illegal character] sourceName=[http://codal.ir/js/Common.js] line=[1] lineSource=[��f
(نمی دانم چرا پیغام خطا بیشتر از این هم کپی پیست نمی شود؟ به هر حال...)

vahid-p
سه شنبه 13 تیر 1396, 22:21 عصر
بله میتوانید بفهمید و چندان سخت نیست فقط باید با مرورگرها کمی کار کرده باشید.
عبارت how to know which script runs by click on button را جستجو کنید. ترجیحا از ویدیوهای آموزشی استفاده کنید.

البته شاید htmlunit اینکار را برای شما انجام بدهد ولی با این کتابخانه کار نکردم و شما کد برنامه را قرار ندادید و خطا به تنهایی کافی نیست

mhjbarnamenevis
چهارشنبه 14 تیر 1396, 01:00 صبح
سلام

ببخشید.

کد برنامه:

public class test {

public static void main(String[] args) throws Exception {
try (WebClient webClient = new WebClient()) {
// __________________________________________________ __________ settings
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());

// __________________________________________________ __________ exception show options
// java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
webClient.getOptions().setThrowExceptionOnScriptEr ror(true);
webClient.getOptions().setThrowExceptionOnFailingS tatusCode(false);
// webClient.getOptions().setRedirectEnabled(true);
// webClient.getOptions().setActiveXNative(true);
// webClient.getOptions().setTimeout(300);

// __________________________________________________ __________
String url = "http://codal.ir/ReportList.aspx?1=&2=&3=&4=-1&5=%d8%af%d8%b9%d9%88%d8%aa&6=&7=&8=-1&9=-1&10=-1&11=&12=False&13=0";

WebRequest webRequest = new WebRequest(new URL(url));
webRequest.setCharset(StandardCharsets.UTF_8);

webClient.addRequestHeader("Accept-Charset", "utf-8");

HtmlPage page = webClient.getPage(url);

// __________________________________________________ __________ showing some part of page for test (first page)
System.out.println("______________________________");
HtmlTable html_table = page.getHtmlElementById("ctl00_ContentPlaceHolder1_gvList");
for (int i_h_table_row = html_table.getRowCount() - 1; i_h_table_row > 0; i_h_table_row--) {
final HtmlTableRow html_row = html_table.getRow(i_h_table_row);
String ticker = html_row.getCell(0).asText();
System.out.println(ticker);
}

// __________________________________________________ __________ saving first page
// page.save(new File("C:\\Users\\Mohammad\\Desktop\\New folder\\a.html"));
// byte[] barrayXml = page.asXml().getBytes(Charset.forName("UTF-8"));
// Files.write(Paths.get("C:\\Users\\Mohammad\\Desktop\\New folder\\a2.html"), barrayXml);

// __________________________________________________ __________ going to next page by clicking on > button on the page
System.out.println("______________________________");
HtmlForm form = page.getFormByName("aspnetForm");
HtmlSubmitInput button = form.getInputByName("ctl00$ContentPlaceHolder1$ucPager1$btnNext");
webClient.getCache().clear();
page = button.click();
// WebResponse response = page.getWebResponse();
// page2.refresh();

// __________________________________________________ __________ showing some part of page for test (this is 2nd page and should be different with primary one)
System.out.println("______________________________");
System.out.println("___next page____داده ها نباید تکراری باشند____");
HtmlTable html_table2 = page.getHtmlElementById("ctl00_ContentPlaceHolder1_gvList");
for (int i_h_table_row = html_table2.getRowCount() - 1; i_h_table_row > 0; i_h_table_row--) {
final HtmlTableRow html_row = html_table2.getRow(i_h_table_row);
String ticker = html_row.getCell(0).asText();
System.out.println(ticker);
}

// __________________________________________________ __________ saving second page
//// System.out.println(response.getContentAsString());
// page.save(new File("C:\\Users\\Mohammad\\Desktop\\New folder\\b.html"));
// barrayXml = page.asXml().getBytes(Charset.forName("UTF-8"));
// Files.write(Paths.get("C:\\Users\\Mohammad\\Desktop\\New folder\\b2.html"), barrayXml);

// Reader reader = new InputStreamReader(inputStream, Charset.forName(encodingName));

}
}
}