PDA

View Full Version : نوشتن یک کد به صورت بازگشتی



بیتا حکمت
پنج شنبه 25 تیر 1394, 22:55 عصر
سلام ، دوستان من میخوام که یه خزنده درست کنم ، تا همه لینک های یک سایت رو بدست بیارم . کدی که پایین می بینید لینک های صفحه اول رو برمی گردونه





string filename = "myFile.txt";
if (System.IO.File.Exists(filename))
System.IO.File.Delete(filename);

ListBox listBox1 = new ListBox();
List<string> s = new List<string>();
s = showlinks(textBox1.Text);

for (int i = 0; i <= s.Count - 1; i++)
{

Boolean shart = false;
if (s[i].ToString().Contains(".pdf") || s[i].ToString().Contains(".jpg") || s[i].ToString().Contains(".png") ||
s[i].ToString().Contains(".bmp") || s[i].ToString().Contains(".css") || s[i].ToString().Contains(".js") ||
s[i].ToString().Contains(".gif")|| s[i].ToString().Contains(".swf"))
shart = true;




if (!string.IsNullOrEmpty(s[i].ToString()) && s[i].ToString().Contains(textBox2.Text) && shart==false )
{
listBox1.Items.Add(s[i].ToString());

using (StreamWriter w = File.AppendText(filename))
{

w.WriteLine(s[i].ToString());
}

}

}






s.Clear();




همونطور که تو کد می بینید لینک های صفحه اول به لیست باکس یک اضافه میشن ، من برای اینکه از هر لینک ، لینک های فرزند هم بدست بیاد این کد رو در ادامه کد بالا نوشتم
ولی برنامه هنگید



for (int i = 0; i <= listBox1.Items.Count-1; i++)
{
s.Clear();
s = showlinks(listBox1.Items[i].ToString());
Boolean shart = false;

if (s[i].ToString().Contains(".pdf") || s[i].ToString().Contains(".jpg") || s[i].ToString().Contains(".png") ||
s[i].ToString().Contains(".bmp") || s[i].ToString().Contains(".css") || s[i].ToString().Contains(".js") ||
s[i].ToString().Contains(".gif") || s[i].ToString().Contains(".swf"))
shart = true;

string line;

// Read the file and display it line by line.
System.IO.StreamReader file =
new System.IO.StreamReader(filename);
while ((line = file.ReadLine()) != null)
{

if (s[i].ToString() == line)
shart = true;
}

file.Close();
if (!string.IsNullOrEmpty(s[i].ToString()) && s[i].ToString().Contains(textBox2.Text) && shart == false)
{ // begin if

listBox1.Items.Add(s[i].ToString());
using (StreamWriter w = File.AppendText(filename))
{

w.WriteLine(s[i].ToString());
}



}// end if

listBox1.Items.Remove(s[i].ToString());




}

golbafan
پنج شنبه 25 تیر 1394, 23:06 عصر
سلام
در لینک یک سورس کد برای اسکن کردن وب سایتها هست
امیدوارم مفید باشه

http://www.codeproject.com/Articles/43056/Link-Scanner

همچنین در پکیج زیر امکانات لازم برای این موضوع قرار داره که بسیار مفیده:
http://htmlagilitypack.codeplex.com/

این هم مثال خوبی با htmlagilitypack
http://stackoverflow.com/questions/18662971/get-links-from-web-page

بیتا حکمت
جمعه 26 تیر 1394, 02:52 صبح
@golbafan (http://barnamenevis.org/member.php?101169-golbafan) ممنون از لطف اتون ، اما مثالهایی که شما معرفی کردین لینک صفحه رو بدست میاره ، من با این موضوع مشکلی ندارم ، مساله اینجاس که وقتی لینک صفحه های اول بدست اومد ، باید از طریق اونا لینک صفحه های دیگه هم بدست بیاد ، من لینک های صفحه اول رو بدست اوردم (منظورم کد بالاس ) ، ولی باید یه راهی پیدا کنم که این کار به صورت بازگشتی برای لینک های
صفحات دیگر هم صورت بگیره

aliagamon
جمعه 26 تیر 1394, 04:43 صبح
سلام
راستش الان نصفه شبه یا بهتره بگیم اول صبحه خستم حوصله خوندن کد هارو ندارم اما کاری که باید انجام بشه مشخصه شما اگه کدی رو که لینک های یک صفحه رو در میاره به صورت یه تابع در بیارین که ورودی لینک بگیره خروجی یک لیست از لینک ها تحویل بده یه همچین چیزی (با note pad نوشتم اگه اررور داد خودتون اصلاح کنید)

public List<string> GetAllLinksFromLink(string text1, string text2)
{
List<string> s = new List<string>();
s = showlinks(text1);

for (int i = 0; i <= s.Count - 1; i++)
{

if (s[i].ToString().Contains(".pdf") || s[i].ToString().Contains(".jpg") || s[i].ToString().Contains(".png") ||
s[i].ToString().Contains(".bmp") || s[i].ToString().Contains(".css") || s[i].ToString().Contains(".js") ||
s[i].ToString().Contains(".gif")|| s[i].ToString().Contains(".swf"))
s.RemoveAt(i);
else if (string.IsNullOrEmpty(s[i].ToString()) || !s[i].ToString().Contains(text2))
s.RemoveAt(i);
}
return s;

}

بعد کد برنامه رو اینطوری بنویسید:

List<string> main = new List<string>();
List<string> subTemp = new List<string>();
main = GetAllLinksFromLink(textBox1.Text,textBox2.Text);
int mainMax = main.Count;
for (int i = 0; i <= mainMax - 1; i++)
{
subTemp = GetAllLinksFromLink(main[i]);
main.AddRange(subTemp);
subTemp.Clear();
}
//hala age dorost bashe bayad hame link ha to list main bashe


اینطوری مقدار زیادی تو استفاده از منابعتون صرفه جویی میشه اما اگه تعداد لینکا زیاده اصولیش اینه که این عملیات توی یک thread دیگه انجام بشه تا برنامه هنگ نکنه:لبخند: