View Full Version : حرفه ای: استخراج اطلاعات از سایت دیوار
sabzzz
سه شنبه 17 خرداد 1401, 00:50 صبح
سلام برای استخراج اطلاعات یک اگهی در سایت دیوار از
HtmlAgilityPack
استفاده میکنم همه رو با دستورات زیر واکشی میکنم به جز قیمت و تصاویر کسی میدونه باید چه کدی بزنم برای این دو پارامتر ؟
تو تصویر دوم میخوام فیلد قیمت 4،000،000 تومان رو واکشی کنم و همچنین یکی از تصاویر
ممنون میشم کسی پاسخ بدید
https://s6.uupload.ir/files/w_4ju1.png
https://s6.uupload.ir/files/2_87b6.png
آدرس لینک اگهی موبایل دیوار :
https://divar.ir/v/%D8%A7%D9%BE%D9%84-iphone-6_%DA%AF%D9%88%D8%B4%DB%8C-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84_%D8%AA%D9%87% D8%B1%D8%A7%D9%86_%D8%AF%D9%88%D9%84%D8%AA-%D8%A2%D8%A8%D8%A7%D8%AF_%D8%AF%DB%8C%D9%88%D8%A7% D8%B1/gYem0Nel
مهدی کرامتی
سه شنبه 17 خرداد 1401, 09:27 صبح
سلام.
به نظر میاد قیمت و ... توسط درخواست های ایجکس در سایت فوق لود میشه، بنابراین باید از یک فریم ورک سمت کلاینت مانند Selenium Web Driver کمک بگیرید.
این نمونه ها (https://code-maze.com/selenium-aspnet-core-ui-tests/) برای بحث Unit Testing است، اما از درون اینها می تونی کدهای لازم برای کارت رو استخراج کنی.
sabzzz
سه شنبه 17 خرداد 1401, 15:10 عصر
ممنون مهندس میشه با یه تیکه کد نشون بدید چطوریه از اون لینک چیزی نفهمیدم
من از asp mvc . net هم استفاده میکنم
mazoolagh
چهارشنبه 18 خرداد 1401, 18:16 عصر
سلام و روز خوش
از این تصویری که پیوست کردن مشخصه که المنت نادرستی رو انتخاب کردین و برای همین این شبهه پیش آمده که قیمت و ... با ایجکس خونده میشه.
شما با مرورگر developer tools رو باز و با ابزار inspect مشخصات اون element رو که نیاز دارین پیدا کنین.
حالا در برنامه تون از هر روش و ابزار که استفاده میکنین باید ببینین چجوری به اون المان (یا مجموعه المانها) میرسین:
ممکنه getelementbyid , getelementsbyclassname , و .... باشه،
ممکنه که از xpath و selector های معینی استفاده کنه
و ...
این صفحه دیوار رو چک کردم همه چیزایی که نیاز دارین بصورت استاتیک لود شده : هم مشخصات (شامل قیمت) و هم آدرس همه عکسها در دسترسه.
اگر برای پیدا کردن این المانها مشکل داشتین بگین راهنمایی کنم.
sabzzz
پنج شنبه 19 خرداد 1401, 10:07 صبح
سلام مهندس منم با همین ابزار المنتور کروم این کار کردم ظاهرا نمیشه مقدار
فیلد قیمت فقط میخوام بقیه پارامترا مهم نیستن میشه راهنمایی کنید
mazoolagh
پنج شنبه 19 خرداد 1401, 18:01 عصر
153827
153828
153829
153830
mazoolagh
پنج شنبه 19 خرداد 1401, 18:03 عصر
153831
153832
sabzzz
جمعه 20 خرداد 1401, 08:55 صبح
ممنون و لی داداش من اینا رو صد بار تست کردم مقدار قیمت روبر نمیگردونن هیچ کدوم
خواهشا یکی راهنمایی کنه حاضرم هزینه هم بدم فقط فیلد قیمت رو می خوام
mazoolagh
شنبه 21 خرداد 1401, 08:21 صبح
من اینا رو صد بار تست کردم مقدار قیمت روبر نمیگردونن هیچ کدوم
شما قطعا یک جای کار دارین اشتباه میکنین - این خیلی سرراست و ساده است و کدش فکر کنم 10 خط نشه!
کد خودتون رو بگذارین تا معلوم بشه مشکل کجاست.
البته قیمت مستقیما مشخص نمیشه، یک مجموعه المنت هست که قیمت یکی از اونهاست (تو تصویر آخر پست شماره 6 کاملا واضح هست) ؛
شما باید از روی title پیدا کنین که کدوم value متناظر با "قیمت" است.
حاضرم هزینه هم بدم
سایتای فریلنسری هست اگر میخواین هزینه کنین، فکر کنم چند ساعته و با مبلغ خیلی کمی انجام بدن.
336699
شنبه 21 خرداد 1401, 18:52 عصر
شما کدهایی که نوشتید رو ارسال کنید.
ایتم قیمت هم مثل سایر ایتمها در دسترس میباشد.
153833
مهدی کرامتی
یک شنبه 22 خرداد 1401, 10:37 صبح
شما کدهایی که نوشتید رو ارسال کنید.
ایتم قیمت هم مثل سایر ایتمها در دسترس میباشد.
153833
داده های درون تصویر ضمیمه شده رو از چه آدرسی بدست آوردید؟
من یک نگاه سر سری به Request/Response ها در تب Network در Developer Tools انداختم ندیدمش.
336699
یک شنبه 22 خرداد 1401, 11:17 صبح
داده های درون تصویر ضمیمه شده رو از چه آدرسی بدست آوردید؟
من یک نگاه سر سری به Request/Response ها در تب Network در Developer Tools انداختم ندیدمش.
https://api.divar.ir/v8/posts/gYem0Nel
فقط کافیه توکن هر آگهی را جایگزین کنید تا اطلاعات آگهی را بصورت جیسون دریافت نمایید.
مهدی کرامتی
یک شنبه 22 خرداد 1401, 11:46 صبح
https://api.divar.ir/v8/posts/gYem0Nel
فقط کافیه توکن هر آگهی را جایگزین کنید تا اطلاعات آگهی را بصورت جیسون دریافت نمایید.
آفرین!
دستاورد جالبی بود.
مهدی کرامتی
یک شنبه 22 خرداد 1401, 13:11 عصر
نتیجه گیری از بحث:
با تشکر از توضیحات شرکت کنندگان در بحث، ابتدا لازم است مدل های JSON خروجی API دیوار به کلاس های سی شارپ تبدیل شوند.
برای انجام این کار یا از سایت Json2CSharp.com (https://json2csharp.com/) می توان استفاده کرد، و یا اینکه نتیجه خروجی JSON یکی از آیتم های API دیوار از خط 4 ببعد تا انتها را انتخاب کنید، یک کلاس خالی در ویژوال استودیو ایجاد کنید، از منوی Edit گزینه Paste Special، و سپس Paste JSON as Classes را انتخاب کنید. این کار منتهی به ایجاد تعدادی کلاس منطبق و معادل با آبجکت های JSON فوق می شود. در پروژه ضمیمه شده، کلاس های فوق در فایل Models.cs قرار دارند.
پکیج Newtonsoft.Json را به پروژه اضافه کنید.
یک Request به آدرس API دیوار به آدرس https://api.divar.ir/v8/posts/ (https://api.divar.ir/v8/posts/gYem0Nel) بفرستید. بعد از / آخر میبایست کد کالای مورد نظر را اضافه کنید.
نتیجه را با استفاده از کلاس JsonConvert به تایپ مورد نظر تبدیل کنید.
شرح کالا از پراپرتی data.description و قیمت کالا از پراپرتی data.webengage.price به شکل یک عدد int قابل خواندن خواهد بود.
کل توضیحات فوق در قالب یک پروژه Windows Forms ضمیمه این پست شده است. در پروژه فوق علاوه بر شرح و قیمت، تصویرهای کالا نیز لود شده و در یک PictureBox نمایش داده می شود.
نکته: در این پروژه برای خواندن اطلاعات از وب از کلاس HttpDownloader استفاده شده است (داخل پروژه هست). مزیت این کلاس پشتیبانی GZIP است، یعنی اگر پاسخ وب سرور با استفاده از روش GZIP فشرده شده باشد این کلاس برای دسترسی به پاسخ های آن سرور به مشکل بر نمی خورد.
sabzzz
یک شنبه 29 خرداد 1401, 02:49 صبح
دم همتون گرم کارم راه افتاد
فقط اگه میشد فیلد شماره موبایل آگهی هم واکشی کرد عالی میشد !
مهدی کرامتی
یک شنبه 29 خرداد 1401, 11:56 صبح
دم همتون گرم کارم راه افتاد
فقط اگه میشد فیلد شماره موبایل آگهی هم واکشی کرد عالی میشد !
واکشی شماره موبایل به این راحتی ها نیست. آدرس خواندن مشخصات آگهی دهنده این است:
https://api.divar.ir/v5/posts/Token}/contact/
در آدرس فوق بجای Token شناسه آگهی را قرار می دهید. منتهی فراخوانی موفق آدرس فوق نیازمند در اختیار داشتن یک Bearer Token است.
مقدار Bearer Token فقط پس از ورود با شماره موبایل به شما تخصیص داده میشه. پارامتر خروجی تابع ورود به سیستم یک توکن هست، از همون توکن بعنوان Bearer Token برای فراخوانی تابع هایی که نیاز به لاگین بودن بیننده دارند (مثل تابع Contact، برای دریافت مشخصات آگهی دهنده از جمله شماره موبایل) استفاده خواهد شد.
336699
یک شنبه 29 خرداد 1401, 12:57 عصر
دم همتون گرم کارم راه افتاد
فقط اگه میشد فیلد شماره موبایل آگهی هم واکشی کرد عالی میشد !
سلام
برای دریافت شماره آگهی ها محدودیت های زیادی از طرف سایت اعمال شده.
در مرحله اول شماره موبایل خودتان را به سایت ارسال کنید و یک پیامک برای شما ارسال میشه و شما اون کد رو برای سایت ارسال میکنید در صورتی که کد ارسالی صحیح باشد یک توکن برای شما ارسال میشه.
در مرحله بعد برای دریافت شماره آگهی ها باید اون توکن را برای سایت ارسال کنید تا شماره آگهی را دریافت کنید.
محدودیت اصلی از همینجا شروع میشه
شما روزانه فقط حدود 200 در خواست میتوانید ارسال کنید بعد از اون درخواستهای شما به مدت 24 از طرف سایت بلاک میشه.
اگر چند روز پشت سرهم بلاک شدید این محدویت بلاک به یک هفته افزایش پیدا میکنه.
اون توکن دریافتی هم چند روز بیشتر اعتبار نداره و باید مجداد تمدید بشه.
مهدی کرامتی
یک شنبه 29 خرداد 1401, 13:01 عصر
مرسی بابت اطلاعات مفیدتون.
شما روزانه فقط حدود 200 در خواست میتوانید ارسال کنید بعد از اون درخواستهای شما به مدت 24 از طرف سایت بلاک میشه.
کسی اگر به اندازه کافی سریش باشه می تونه یک تعداد شماره رو بهمراه توکن هاش تو دیتابیس نگهداره، و با هر توکن در روز مثلا 199 تا آگهی رو بخونه، بعد سویچ کنه روی شماره بعدی.
اون توکن دریافتی هم چند روز بیشتر اعتبار نداره و باید مجداد تمدید بشه.
اون توکن اصولا باید حالت Sliding Expiration داشته باشه، یعنی زمان و تاریخ انقضاش، به اندازه تعریف شده، از آخرین استفاده محاسبه بشه. اگر تجربه شما عکس این رو ثابت کرده لطفا بیان کنید.
sabzzz
یک شنبه 29 خرداد 1401, 14:28 عصر
یه سری افراد دارن contact هارو سلکت میکنن ایا روشی هست برای دور زدن محدودیت از لوگین ؟ یا رباتی نوشته بشه خودش لوگین کنه بفرست شماره موبایل رو
مهدی کرامتی
یک شنبه 29 خرداد 1401, 15:24 عصر
آیا روشی هست برای دور زدن محدودیت از لوگین ؟
خیر. روش خاصی نداره. در حالت بدون لاگین، سیستم سایت دیوار شماره آگهی گذارنده رو ماسک می کنه (نصف شماره با *** جایگزین شده)، منطقی هم هست که برای حفاظت از مشتری هاش اینکار رو بکنه.
یا رباتی نوشته بشه خودش لوگین کنه بفرست شماره موبایل رو
ربات تقریبا همین نرم افزاری است که بالاتر ضمیمه کردم و در تعریف، نرم افزاری است که کار مورد نظر رو خودکار انجام بده. تمام کدهای مورد نیاز نرم افزار خودکار فوق تو مثال ضمیمه شده هست، مابقی ماجرا مثل سویچ کردن شماره ها و ... رو هم توضیح دادم. تنها بخشی که باقی می ماند این است که یک Scheduler به پروژه اضافه کنید که خودش در بازه های زمانی تعریف شده روتین های فوق رو اجرا کنه.
kingepars
جمعه 22 اردیبهشت 1402, 15:29 عصر
واکشی شماره موبایل به این راحتی ها نیست. آدرس خواندن مشخصات آگهی دهنده این است:
https://api.divar.ir/v5/posts/Token}/contact/
در آدرس فوق بجای Token شناسه آگهی را قرار می دهید. منتهی فراخوانی موفق آدرس فوق نیازمند در اختیار داشتن یک Bearer Token است.
مقدار Bearer Token فقط پس از ورود با شماره موبایل به شما تخصیص داده میشه. پارامتر خروجی تابع ورود به سیستم یک توکن هست، از همون توکن بعنوان Bearer Token برای فراخوانی تابع هایی که نیاز به لاگین بودن بیننده دارند (مثل تابع Contact، برای دریافت مشخصات آگهی دهنده از جمله شماره موبایل) استفاده خواهد شد.
ضمن تشکر در مورد Bearer Token کمی بیشتر توضیح میدید وقتی با موبایل لاگین شدیم کجا سورس دنبالش بگردیم؟
ممنون
مهدی کرامتی
یک شنبه 30 مهر 1402, 10:41 صبح
معمولا تو ریسپانسی که بعد از لاگین بهتون میده تو هدر یا بادی ریسپانس Bearer Token هست و میشه خوندش.
arabchoobdar
یک شنبه 26 فروردین 1403, 13:29 عصر
من در حال نوشتن برنامه ای برای استخراج شماره ها از سایت دیوار هستم. برنامه شما اطلاعات توضیحات و عکس رو می ده.
برای دریافت شماره تماس در لینک https://api.divar.ir/v5/posts/{Token}/contact/ در قسمت {Token} شناسه آگهی رو قرار میدم ولی نمی دونم Bearer Tokenی که توی کوکی سایت دارم رو چه جوری برستم. توی هدرها قسمتheader.cookie یا header.token مقدار کامل کوکی که با =did شروع میشه و یا فقط مقدار token بعد از لاگین رو میذارم ولی جواب not found بر می گردونه. در صورت امکان راهنمایی کنید.
arabchoobdar
یک شنبه 26 فروردین 1403, 13:35 عصر
بابرنامه Postman می تونم تست کنم و post بفرستم و هنوز نتونستم جواب بگیرم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.