الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في تشغيل برنامج (web crawler)

بدأه wisdom2010 في 17 فبراير 2011 · 14 رد · 1,320 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لدي كود خاص ب web crawler مختص بايجاد ال broken links مكتوب بالجافا

الكود ليس فيه أخطاء ويعمل بشكل ممتاز على جهاز اللابتوب ،، لكن جربته على 4 أجهزة أخرى ولكنه لا يعمل

مع العلم أنه لا يوجد اي خطأ فيه ، لكن عند التنفيذ يعطي خطأ ولا يعطي النتائج المطلوبة

وقد أعدت تنزيل البرنامج ولم ينجح الموضوع

هل لديكم أي فكرة ؟؟؟

#2

اخى الكريم

اين البرنامج الذى تتكلم عنه

هنفتى فى شىء لا نعلم عنه شىء

Software Developer
Mahmoudkelany.com


 

#3

طيب أين الكود يا طيب

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#4
vector_ever كتب:

طيب أين الكود يا طيب

package simplecrawler;


import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;

public class WebCrawler extends Applet implements ActionListener, Runnable {
	public static final String SEARCH = "Search";
	public static final String STOP = "Stop";
	public static final String CLEAR = "Clear";

	public static final String USER_AGENT = "hardingbot";

	private Panel panelMain;
	private java.awt.List listFrontier;
	private java.awt.List listVisited;
	private java.awt.Label labelStatus;

	private Vector<String> frontier; 				// URLs to be searched
	private Hashtable<String,String> seenUrls;		// URLs already seen (already crawled or in frontier)
	private Vector<String> visitedUrls;     		// URLs we have already visited

	private Thread searchThread;

	private TextField textURL;
	private Choice searchLimit;

	@Override
	public void init() {

		// set up the main UI panel
		panelMain = new Panel();
		panelMain.setLayout(new BorderLayout(5, 5));

		// text entry components
		Panel panelEntry = new Panel();
		panelEntry.setLayout(new BorderLayout(5, 5));

		Panel panelURL = new Panel();
		panelURL.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
		panelURL.add(new Label("Starting URL: ", Label.RIGHT));
		textURL = new TextField("", 40);
		panelURL.add(textURL);
		panelEntry.add("North", panelURL);

		Panel panelType = new Panel();
		panelType.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
		panelType.add(new Label("Search limit: ", Label.RIGHT));
		searchLimit = new Choice();
		searchLimit.addItem("1");
		searchLimit.addItem("2");
		searchLimit.addItem("3");
		searchLimit.addItem("4");
		searchLimit.addItem("5");
		searchLimit.addItem("10");
		searchLimit.addItem("25");
		searchLimit.addItem("None");
		searchLimit.select(4);
		panelType.add(searchLimit);
		panelEntry.add("South", panelType);

		panelMain.add("North", panelEntry);

		// list of result URLs
		Panel panelListButtons = new Panel();
		panelListButtons.setLayout(new BorderLayout(5, 5));

		Panel panelList = new Panel();
		panelList.setLayout(new BorderLayout(5, 5));
		panelList.add("North", new Label("Frontier"));

		Panel panelListCurrent = new Panel();
		panelListCurrent.setLayout(new BorderLayout(5, 5));
		listFrontier = new java.awt.List(10);
		panelListCurrent.add("North", listFrontier);
		labelStatus = new Label("");
		panelList.add("Center", panelListCurrent);

		Panel visited = new Panel();
		visited.setLayout(new BorderLayout(5, 5));
		visited.add("North", new Label("Visited URLs"));
		listVisited = new java.awt.List(10);
		visited.add("Center", listVisited);
		visited.add("South", labelStatus);
		panelList.add("South", visited);

		panelListButtons.add("North", panelList);

		// control buttons
		Panel panelButtons = new Panel();
		Button buttonSearch = new Button(SEARCH);
		buttonSearch.addActionListener(this);
		panelButtons.add(buttonSearch);
		Button buttonStop = new Button(STOP);
		buttonStop.addActionListener(this);
		panelButtons.add(buttonStop);
		Button buttonClear = new Button(CLEAR);
		buttonClear.addActionListener(this);
		panelButtons.add(buttonClear);

		panelListButtons.add("South", panelButtons);

		panelMain.add("South", panelListButtons);

		add(panelMain);
		setVisible(true);

		repaint(); 

		// initialize search data structures
		frontier = new Vector<String>();
		seenUrls = new Hashtable<String,String>();
		visitedUrls = new Vector<String>();

		// set default for URL access
		URLConnection.setDefaultAllowUserInteraction(false);
	}

	@Override
	public void start() {
	}

	@Override
	public void stop() {
		if (searchThread != null) {
			setStatus("stopping...");
			searchThread = null;
		}
	}

	@Override
	public void destroy() {
	}

	// Read robots.txt for this URL
	void readRobotsTxt(URL url) {

		String host = url.getHost();

		// Form URL of the robots.txt file
		String robot = "http://" + host + "/robots.txt";

		System.out.println("Checking for " + robot + " ...");
	}

	// Determine if this URL is safe to read from robots.txt
	boolean robotSafe(URL url) {

		return true;
	}


	@Override
	public void paint(Graphics g) {
		//Draw a Rectangle around the applet's display area.
		g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

		panelMain.paint(g);
		panelMain.paintComponents(g);
	}

	public void run() {
		String strURL = textURL.getText();
		int numberSearched = 0;

		if (strURL.length() == 0) {
			setStatus("ERROR: must enter a starting URL");
			searchThread = null;
			return;
		}

		int search_limit = 99999;
		try {
			search_limit = Integer.parseInt(searchLimit.getItem(searchLimit.getSelectedIndex()));
		}
		catch (Exception e) {
			// "None" must be selected
		}	

		// initialize search data structures
		clearAll();

		frontier.addElement(strURL);
		listFrontier.add(strURL);
		seenUrls.put(strURL, "");

		while (frontier.size() > 0 && (Thread.currentThread() == searchThread)) {
			// get the first element from the to be searched list
			strURL = (String) frontier.elementAt(0);

			setStatus("Accessing " + strURL);

			URL url;
			try { 
				url = new URL(strURL);
			} catch (MalformedURLException e) {
				setStatus("ERROR: invalid URL " + strURL);
				break;
			}

			// Get URL off the frontier and mark as being visited
			frontier.removeElementAt(0);
			listFrontier.remove(0);
			visitedUrls.addElement(strURL);


			// Can only search http: protocol URLs
			if (url.getProtocol().compareTo("http") != 0) 
				continue;

			// Make sure it is safe to crawl
			if (!robotSafe(url))
				continue;

			try {
				System.out.println("Accessing [" + url + "] ...");

				// try opening the URL
				URLConnection urlConnection = url.openConnection();
				urlConnection.setRequestProperty("User-Agent", USER_AGENT);				
				urlConnection.setAllowUserInteraction(false);

				// Only access pages returning 200 OK status
				String httpHeader = urlConnection.getHeaderField(null);
				if (httpHeader == null || !httpHeader.contains("200 OK")) {
					System.out.println("Did not receive 200 OK response.");
					continue;
				}

				//String type = urlConnection.getHeaderField("Content-Type");
				String type = urlConnection.getContentType();
				System.out.println("Content-Type: [" + type + "]");

				/* Output HTTP header
				Map headerFields = urlConnection.getHeaderFields();
				Iterator keyIter = headerFields.keySet().iterator();
		        while (keyIter.hasNext()) {
		          String key = (String) keyIter.next();
		          java.util.List keyList = (java.util.List) headerFields.get(key);
		          Iterator listIter = keyList.iterator();
		          while (listIter.hasNext()) {
		            String listValue = (String) listIter.next();
		            System.err.println("Key = [" + key + "] value = [" + listValue + "]");
		          }
		        }
		        */

				if (type == null) {
					System.out.println("Unable to determine resource MIME type.");
					continue;
				}

				if (!type.startsWith("text/html")) {
					System.out.println("Rejecting non-HTML resource.");
					continue;
				}				 

				// Mark as visited
				listVisited.add(strURL);

				String content = getPageContent(url);
				String lowerCaseContent = content.toLowerCase();

				System.out.println("Looking for links...");

				int index = 0;
				while ((index = lowerCaseContent.indexOf("<a", index)) != -1)
				{
					if ((index = lowerCaseContent.indexOf("href", index)) == -1) 
						break;
					if ((index = lowerCaseContent.indexOf("=", index)) == -1) 
						break;

					index++;
					String remaining = content.substring(index);

					StringTokenizer st = new StringTokenizer(remaining, "\t\n\r\">");
					String strLink = st.nextToken();

					System.out.println("Found possible link: [" + strLink + "]");

					URL urlLink;
					try {
						urlLink = new URL(url, strLink);
						strLink = urlLink.toString();
						System.out.println("Full URL: [" + strLink + "]");
					} catch (MalformedURLException e) {
						setStatus("ERROR: bad URL " + strLink);
						System.out.println("  Rejecting bad URL [" + strLink + "]");
						continue;
					}

					// only look at http links
					if (urlLink.getProtocol().compareTo("http") != 0) {
						System.out.println("  Rejecting non-http link");
						break;
					}

					String filename = urlLink.getFile();
					if (filename.endsWith(".html") || filename.endsWith(".htm") || 
							filename.endsWith("/") || filename.contains("?")) {

						// check to see if this URL has already been 
						// searched or is going to be searched
						if (seenUrls.containsKey(strLink)) {
							System.out.println("  Seen before");
						}						
						else {
							// test to make sure it is robot-safe!
							if (robotSafe(urlLink)) {				
								frontier.addElement(strLink);
								listFrontier.add(strLink);
								System.out.println("  Adding to frontier (" + frontier.size() + " URLs)");
							}

							seenUrls.put(strLink, "");
						}						
					}
					else {
						System.out.println("  Non-HTML appearing link");
					}
				}
			} catch (IOException e) {
				setStatus("ERROR: couldn't open URL " + strURL);
				continue;
			}
			catch (NullPointerException e) {
				// This could happen when calling HttpURLConnection.getHeaderField with
				// a bad URL
				setStatus("ERROR: couldn't open URL " + strURL);
				System.out.println("Bad URL: [" + strURL + "]");
				continue;
			}

			numberSearched++;
			if (numberSearched >= search_limit)
				break;

			// Delay before accessing next URL
			try {
				System.out.println("Sleeping for 3 seconds...");
				Thread.sleep(3000);
			}
			catch (Exception e) {
				System.err.println(e);
			}			
		}

		if (numberSearched >= search_limit) {
			System.out.println("Reached search limit of " + search_limit + ".  " + 
					frontier.size() + " URLs left in frontier.");
			setStatus("Reached search limit of " + search_limit);
		}			
		else {
			System.out.println("Frontier has " + frontier.size() + " items left.");
			setStatus("Done");
		}

		searchThread = null;
	}

	private void setStatus(String status) {
		labelStatus.setText(status);
	}

	private String getPageContent(URL url) {

		System.out.println("Pulling out page content...");

		String content = "";

		try {
			InputStream urlStream = url.openStream();
			byte b[] = new byte[1000];
			int numRead = urlStream.read(b);
			content = new String(b, 0, numRead);
			while (numRead != -1) {
				//if (Thread.currentThread() != searchThread)
				//	break;
				numRead = urlStream.read(b);
				if (numRead != -1) {
					String newContent = new String(b, 0, numRead);
					content += newContent;
				}
			}
			urlStream.close();
		}
		catch (Exception e) {
			e.printStackTrace();
			setStatus("ERROR: couldn't open URL " + url);
		}

		return content;
	}

	public void actionPerformed(ActionEvent event) {
		String command = event.getActionCommand();

		if (command.compareTo(SEARCH) == 0) {
			setStatus("searching...");

			// launch a thread to do the search
			if (searchThread == null) {
				searchThread = new Thread(this);
			}
			searchThread.start();   // Causes run() to execute
		}
		else if (command.compareTo(STOP) == 0) {
			stop();
		}
		else if (command.compareTo(CLEAR) == 0) {
			clearAll();			
		}
	}

	private void clearAll() {

		// initialize search data structures
		frontier.removeAllElements();
		seenUrls.clear();
		visitedUrls.removeAllElements();
		listFrontier.removeAll();
		listVisited.removeAll();
	}

	public static void main (String argv[])
	{
		JFrame f = new JFrame("Web Crawler");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		WebCrawler applet = new WebCrawler();
		f.add("Center", applet);
		applet.init();
		applet.start();
		f.pack();
		f.setVisible(true);
	}
}
#5

الكود يعمل بدون ادنى مشاكل

ولكن يمكن يكون فيه عيب فى تكوين ملف الجار

ممكن تضع المشروع كاملا

وملف الجار الذى تقم بتجربته على الاجهزه هذه

لكى يتم فحصهما وتحديد المشكله ان وجدت على حد ذكرك

Software Developer
Mahmoudkelany.com


 

#6

ما تتحدث عنه ليس له علاقة بموضوع ال crawling ...

كيف لا يعمل على الأجهزه الأخرى؟؟ ما هي رسائل الخطأ؟

#7
هويدي كتب:

ما تتحدث عنه ليس له علاقة بموضوع ال crawling ...

كيف لا يعمل على الأجهزه الأخرى؟؟ ما هي رسائل الخطأ؟

بارك الله فيك على الاستجابة السريعة

لكن كيف ليس له علاقة بال crawling ???

هذا البرنامج يقوم بزيارة جميع المواقع التي بإمكانه الوصول إليها ابتداءً من ال seed URL الذي نختاره

بالنسبة للمشكلة ،، عندما أعدت تشغيل البرنامج اليوم مرة أخرى على نفس الجهاز ، لم يعد يعمل ،، عندما أدخل العنوان وأضغط begin يتوقف فجأة وتظهر رسالة

did not recieve 200 OK response

ما يعني أن المشكلة ليست في جهاز معين ،،

جربت أن أغير ال connection timeout وأزيده إلى 1000

لكن بقيت نفس المشكلة

أخ محمود ، لم أفهم ماذا تقصد بملف الجار ،، لكن المشروع هو عبارة عن هذا الكلاس فقط ،، مع العلم أني أعمل على ال netbeans

بارك الله فيكم وجزاكم خيرا على مجهودكم ووقتكم

#8
اقتباس
لدي كود خاص ب web crawler مختص بايجاد ال

ماذا يعني web crawler لم افهم جيدا ولم افهم ما فائدتها .. ارجو اعطائي نبذه بسيطه عن هذا المفهوم ؟

2coscqr.jpg
#9

اخى الكريم

البرنامج يعمل بدون ادنى مشاكل كما ذكرت لك

وهذه صوره من تجربه البرنامج

post-217802-052059300 1297975842_thumb.p

اما بالنسبه لملف الجار

فهو يكون ملف باسم المشروع ولكن امتداده jar

عند الضغط عليه يتم تشغيل البرنامج بدون الحاجه الى netbeans ولكن لابد من ان تكون JRE مسطبه على الجهاز

اين تجده

اعمل clean and build للمشروع

واذهب الى ملفات المشروع

ستجد مجلد dist ستجده بداخله

بالتوفيق

المرفقات
WebCrawler.png

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 18 فبراير 2011 في 00:41

Software Developer
Mahmoudkelany.com


 

#10
Mahmoud Kelany كتب:

اخى الكريم

البرنامج يعمل بدون ادنى مشاكل كما ذكرت لك

وهذه صوره من تجربه البرنامج

post-217802-052059300 1297975842_thumb.p

اما بالنسبه لملف الجار

فهو يكون ملف باسم المشروع ولكن امتداده jar

عند الضغط عليه يتم تشغيل البرنامج بدون الحاجه الى netbeans ولكن لابد من ان تكون JRE مسطبه على الجهاز

اين تجده

اعمل clean and build للمشروع

واذهب الى ملفات المشروع

ستجد مجلد dist ستجده بداخله

بالتوفيق

صحيح بارك الله فيك ، وانا أيضا اشتغل لدي البرنامج وحصلت على هذه النتيجة ،، لكنه يعمل أحيانا ويتوقف أحيانا

وهذه الرسالة التي تظهر عندما لا يعمل : did not receive 200 OK response

وعندما بحثت عن هذا الخطأ في جوجل ،، قرأت أنه قد تكون المشكلة في الوقت الذي يعمل بعده time out

لقد زدت المدة ،، والآن البرنامج يعمل ، لكن لا أعلم إلى متى

أخ أحمد

المقصود ب web crawler هو برنامج يقوم بالابحار في الويب وجلب عناوين الصفحات المختلفة تلقائيا ،، فقط عليك أن تزوده بأي موقع ليبدأ منه البحث ،،ويسمى(seed URL)

مبدأ عمله يقوم على تتبع ال hyperlinks في الصفحات ومن ثم زيارة الصفحات التي حصل على عناوينها

أرجو أن أكون قد وضحت الفكرة

#11

انا جربته يوم ان ذكرت المشكله

وجربته اليوم

وهو يعمل

قد تكون المشكله انك تحاول التعديل عليه فتحدث به خللا

Software Developer
Mahmoudkelany.com


 

#12
Mahmoud Kelany كتب:

انا جربته يوم ان ذكرت المشكله

وجربته اليوم

وهو يعمل

قد تكون المشكله انك تحاول التعديل عليه فتحدث به خللا

أبدا لم أعدل عليه أي شيء ،،، ولو كان هناك خطأ لظهرمن أول مرة ينفذ فيها ،، لأنه من غير المنطقي أن يظهر الخطأ مرة ، وأخرى لا يظهر

هل تتوقع أنه هناك مشكلة بالنسبة للوصول إلى السيرفر ،، أو أنه يكون أحيانا السيرفر مشغول جدا بحيث يعطي time out ???

الكود عاد يعمل والحمدلله ،، لكن لا أعرف ربما ترجع نفس المشكلة فيما بعد

خاصة أنني لم أعرف بعد ما الذي يسببها

#13
wisdom2010 كتب:

أبدا لم أعدل عليه أي شيء ،،، ولو كان هناك خطأ لظهرمن أول مرة ينفذ فيها ،، لأنه من غير المنطقي أن يظهر الخطأ مرة ، وأخرى لا يظهر

هل تتوقع أنه هناك مشكلة بالنسبة للوصول إلى السيرفر ،، أو أنه يكون أحيانا السيرفر مشغول جدا بحيث يعطي time out ???

الكود عاد يعمل والحمدلله ،، لكن لا أعرف ربما ترجع نفس المشكلة فيما بعد

خاصة أنني لم أعرف بعد ما الذي يسببها

لا اعلم ايضا

خاصه انه لا يوجد خطأ كما تذكر

وانا الكود يعمل لدى من اول ثانيه وضع على جهازى حتى الان

Software Developer
Mahmoudkelany.com


 

#14

تأكد من خصائص ال Anti-Virus و ال Firewall

ربما يمنع البرنامج من الوصول الى الانترنت

#15

بارك الله فيكم جميعا

وجزاكم خيرا على تعاونكم ومجهودكم

ان شاءالله في موازين حسناتكم

يبدو أن المشكلة فعلا في اعدادات ال firewall

عدلتها بحيث يسمح لبرنامج النت بينز بالاتصال بالانترنت

البرنامج إلى الآن يعمل دون مشاكل والحمدلله

شكرا جزيلا مرة أخرى لكم جميعا

مواضيع مشابهة