View Full Version : بدست آوردن لینک های داخلی
دکتر بروکی
سه شنبه 16 تیر 1394, 21: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, 04: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, 18: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, 21:45 عصر
بنده مشکل را با کد اولیه ای که در پست شماره 1 نوشتم تا حدودی حل کردم ، لکن
link.InnerText
به جای اصل لینک ها ، متن لینک ها را برمی گرداند
jeson_park
چهارشنبه 17 تیر 1394, 22: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, 23:07 عصر
شرمنده کردین ، سپاس از مهر بیکران شما ، من با این کد مشکلم حل شد ، صرفا" برای دوستان دیگر که این تاپیک رو مطالعه می کنن ، بهتر دیدم این نکته رو عرض کنم کدی که جناب jeson_park (http://barnamenevis.org/member.php?89354-jeson_park) نوشتند ، در خیلی از سایت ها ، لینک های خارجی رو هم برمی گردونه ..
بیتا حکمت
شنبه 20 تیر 1394, 04:51 صبح
شرمنده کردین ، سپاس از مهر بیکران شما ، من با این کد مشکلم حل شد ، صرفا" برای دوستان دیگر که این تاپیک رو مطالعه می کنن ، بهتر دیدم این نکته رو عرض کنم کدی که جناب jeson_park (http://barnamenevis.org/member.php?89354-jeson_park) نوشتند ، در خیلی از سایت ها ، لینک های خارجی رو هم برمی گردونه ..
سلام ، شما چطوری از کد استفاده کردین ، تغییرش دادی ؟ چون من کد رو که اقای jeson رو که کپی می کنم همه لینک ها رو بدست نمیاره
برای تست همینجا دو تا لینک قرارم می دم ، تا ببینم از سورس این پیچ ، اکتسرکت میشه یا نه
لینک شماره یک برای تست (http://www.whois.com)
لینک شماره دو برای تست (http://test.barnamenevis.org)
بیتا حکمت
شنبه 20 تیر 1394, 05:58 صبح
برای این صفحه جواب داد و هر دو لینکی که بالا نوشتم ، اما برای سایت http://www.sheypoor.com تست کردم ، خیلی از لینک ها بدست نیومدن ، مثلا" این لینک
http://alborz.sheypoor.com/all/c0 هم باید مابین لینک ها بود ولی نیست ، این مساله راه حلی داره ؟
محمد رضا فاتحی
چهارشنبه 24 تیر 1394, 11:26 صبح
یه سوال....
یه سایتی رو در نظر بگیرید که برای استخراج اطلاعات مثلا کد ملی و کد عضویت رو میگیره و اطلاعات رو بر میگردونه... حالا فرض کنید اطلاعات اصلی رو داریم... مشکل استفاده از کپچاس...
کپچا رو میشه دور زد؟؟
jeson_park
پنج شنبه 25 تیر 1394, 23:20 عصر
دوستانی که با کد من نتیجه نگرفتن باید عبارت با قاعده رو بنا به نیازشون تغییر بدن
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.