PDA

View Full Version : بدست آوردن لینک های داخلی



دکتر بروکی
سه شنبه 16 تیر 1394, 20:51 عصر
سلام . من میخوام از این کد برای بدست آوردن لینک های داخلی یک سایت استفاده کنم

List<string> links = new List<string>();
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
links.Add("http://mywebsite.com"+link.InnerText);
}
یه شخصی تو این لینک (http://stackoverflow.com/questions/16761635/what-is-the-best-way-with-dealing-with-internal-links-while-scraping)نوشته ، رفرنس HtmlAgilityPack به پروژه اضافه کردم آ ؛ اما توفیری نداشت . راستی راه داره بگیم فقط لینک صفحات رو برگردن و به لینک هایی
که با فایل های اپلود شده داخل سایت مرتبط هستن کاری نداشته باش ؟

jeson_park
چهارشنبه 17 تیر 1394, 03:18 صبح
ابتدا کل صفحه وب رو بگیرید و توی رشته نگه دارید بعد با عبارات با قاعده لینک رو پیدا کنید

string urlAddress = "http://google.com";


HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


if (response.StatusCode == HttpStatusCode.OK)
{
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;


if (response.CharacterSet == null)
{
readStream = new StreamReader(receiveStream);
}
else
{
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
}


string data = readStream.ReadToEnd();


response.Close();
readStream.Close();
}


string replacement = "<a href=\"$1\">$2</a>";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(data , replacement);
Console.WriteLine("Original String: {0}", data );
Console.WriteLine("Replacement String: {0}", result)

دکتر بروکی
چهارشنبه 17 تیر 1394, 17:54 عصر
درود ، جناب jeson_park سپــاسگــــزارم . اما متاسفانه بنده نتوانستم از کد شما خروجی بگیرم .




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string urlAddress = "http://google.com";

string data;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


if (response.StatusCode == HttpStatusCode.OK)
{
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;
if (response.CharacterSet == null)
{
readStream = new StreamReader(receiveStream);
}
else
{
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
}


data = readStream.ReadToEnd();


response.Close();
readStream.Close();
}


string replacement = "<a href=\"$1\">$2</a>";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(data, replacement);
Console.WriteLine("Original String: {0}", data);
Console.WriteLine("Replacement String: {0}", result);



}
}
}





باید به جای pattern چی بنویسم که فقط لینک های داخلی یک صفحه وب را نشون بده و مورد دیگر اینکه بنده در درک این شیوه فرمت دادن به رشته ها مشکل دارم ، اگر مقدور هست با Tostring مثال بزنید .



Replacement String: {0}


خطا :

133038

دکتر بروکی
چهارشنبه 17 تیر 1394, 20:45 عصر
بنده مشکل را با کد اولیه ای که در پست شماره 1 نوشتم تا حدودی حل کردم ، لکن



link.InnerText


به جای اصل لینک ها ، متن لینک ها را برمی گرداند

jeson_park
چهارشنبه 17 تیر 1394, 21:04 عصر
با سلام
string pattern = @"\b(?:https?://|www\.)\S+\b";
کد رو تغییر دادم

string data = null;
string urlAddress = "www.google.com";




HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();




if (response.StatusCode == HttpStatusCode.OK)
{
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;




if (response.CharacterSet == null)
{
readStream = new StreamReader(receiveStream);
}
else
{
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
}




data = readStream.ReadToEnd();




response.Close();
readStream.Close();
}





string pattern = @"\b(?:https?://|www\.)\S+\b";


Regex rgx = new Regex(pattern);
foreach (Match m in rgx.Matches(data))
Console.WriteLine("Replacement String: {0}", m.Value.ToString());

دکتر بروکی
چهارشنبه 17 تیر 1394, 22:07 عصر
شرمنده کردین ، سپاس از مهر بیکران شما ، من با این کد مشکلم حل شد ، صرفا" برای دوستان دیگر که این تاپیک رو مطالعه می کنن ، بهتر دیدم این نکته رو عرض کنم کدی که جناب jeson_park (http://barnamenevis.org/member.php?89354-jeson_park) نوشتند ، در خیلی از سایت ها ، لینک های خارجی رو هم برمی گردونه ..

بیتا حکمت
شنبه 20 تیر 1394, 03:51 صبح
شرمنده کردین ، سپاس از مهر بیکران شما ، من با این کد مشکلم حل شد ، صرفا" برای دوستان دیگر که این تاپیک رو مطالعه می کنن ، بهتر دیدم این نکته رو عرض کنم کدی که جناب jeson_park (http://barnamenevis.org/member.php?89354-jeson_park) نوشتند ، در خیلی از سایت ها ، لینک های خارجی رو هم برمی گردونه ..


سلام ، شما چطوری از کد استفاده کردین ، تغییرش دادی ؟ چون من کد رو که اقای jeson رو که کپی می کنم همه لینک ها رو بدست نمیاره
برای تست همینجا دو تا لینک قرارم می دم ، تا ببینم از سورس این پیچ ، اکتسرکت میشه یا نه

لینک شماره یک برای تست (http://www.whois.com)

لینک شماره دو برای تست (http://test.barnamenevis.org)

بیتا حکمت
شنبه 20 تیر 1394, 04:58 صبح
برای این صفحه جواب داد و هر دو لینکی که بالا نوشتم ، اما برای سایت http://www.sheypoor.com تست کردم ، خیلی از لینک ها بدست نیومدن ، مثلا" این لینک
http://alborz.sheypoor.com/all/c0 هم باید مابین لینک ها بود ولی نیست ، این مساله راه حلی داره ؟

محمد رضا فاتحی
چهارشنبه 24 تیر 1394, 10:26 صبح
یه سوال....
یه سایتی رو در نظر بگیرید که برای استخراج اطلاعات مثلا کد ملی و کد عضویت رو میگیره و اطلاعات رو بر میگردونه... حالا فرض کنید اطلاعات اصلی رو داریم... مشکل استفاده از کپچاس...
کپچا رو میشه دور زد؟؟

jeson_park
پنج شنبه 25 تیر 1394, 22:20 عصر
دوستانی که با کد من نتیجه نگرفتن باید عبارت با قاعده رو بنا به نیازشون تغییر بدن