وب اسکرپینگ (Web Scraping) با پایتون و کتابخانه Beautiful Soup — راهنمای جامع
دادههای موجود در وب یکی از مهمترین منابع به منظور انجام تحلیلهای داده (Data Analysis) و دادهکاوی (Data Mining) هستند. چنین تحلیلهایی با اهداف گوناگون انجام میشوند که از جمله آنها میتوان به عقیدهکاوی و تحلیل احساسات اشاره کرد. مساله شایان توجه در این تحلیلها گردآوری دادههای موجود در وب است که با عنوان «وب اسکرپینگ» (Web Scraping) شناخته شده و امکان انجام آن با بهرهگیری از ابزارها و زبانهای برنامهنویسی گوناگون وجود دارد. از جمله زبانهای برنامهنویسی قابل استفاده برای وب اسکرپینگ، زبان قدرتمند پایتون است که با استفاده از کتابخانه Beautiful Soup این کار را انجام میدهد. در این راهنما به چگونگی انجام وب اسکرپینگ با استفاده از پایتون و کتابخانه Beautiful Soup پرداخته و مباحث زیر مورد بررسی قرار میگیرند:
- وب اسکرپینگ (Web Scraping) چیست؟
- چرا نیاز به وب اسکرپینگ است؟
- چگونه میتوان با استفاده از زبان برنامهنویسی پایتون و کتابخانه Beautiful Soup وب اسکرپینگ انجام داد؟
شایان ذکر است کلیه کدهایی که در این مطلب مورد استفاده قرار گرفتهاند، در انتهای مطلب به طور کامل آورده شدهاند.
مقدمه
هنگام انجام یک پروژه علم داده، استفاده از دادههای موجود در اینترنت امری بسیار متداول است. افراد اغلب قادر به دسترسی به این دادهها در فرمت CSV یا با استفاده از رابط برنامهنویسی کاربردی (Application Programming Interface | API) هستند. اگرچه، اوقاتی نیز وجود دارد که داده مورد نیاز تحلیلگر صرفا به عنوان بخشی از یک صفحه وب در دسترس است. در شرایطی مانند اینها، تحلیلگر میتواند از روشی با عنوان «وب اسکرپینگ» (web scraping) به منظور دریافت دادهها از صفحه وب به فرمتی که در تحلیلهای خود با آنها کار میکند بهره ببرد. در این مطلب، چگونگی انجام این کار با بهرهگیری از پایتون ۳ (Python3) و کتابخانه Beautiful Soup آموزش داده شده است.
در ادامه و پیش از آنکه به موضوع اصلی پرداخته شود، برخی از مولفههای اساسی یک صفحه وب تشریح میشوند. هنگام بازدید از یک وبسایت یا یک صفحه وب، «مرورگر وب» (web browser) درخواست دریافت اطلاعات را به «وب سرور» (Web Server) میدهد. به این درخواست «GET request» گفته میشود، زیرا مرورگر فایلها را از سرور دریافت میکند. سسپس، سرور فایلهایی را ارسال میکند که به مرورگر وب میگویند چگونه یک صفحه وب را برای کاربر رِندِر (render) کند. فایلهای یک صفحه وب شامل انواع فایلهای بیان شده در زیر هستند.
- HTML: دربرگیرنده محتوای اصلی صفحه است.
- CSS: به منظور بهبود ظاهر صفحه هنگام ارائه به کاربر، استایلی را به صفحه وب میافزاید.
- JS: فایلهای جاوا اسکریپت، تعاملپذیری را به صفحات وب میافزایند.
- تصاویر: تصاویر در فرمتهای گوناگون شامل JPG و PNG به یک صفحه وب این امکان را میدهند که به ارائه تصاویر بپردازد.
پس از آنکه مرورگر همه فایلها را دریافت کرد، صفحه وب را رندر کرده و آن را به کاربر نمایش میدهد. اتفاقات زیادی در پشت صفحه میافتد تا یک صفحه وب به خوبی رندر شود، اما هنگام انجام وب اسکرپینگ نیازی به آگاهی از همه این وقایع نیست. در حین انجام وب اسکرپینگ، پژوهشگر به محتوای اصلی صفحه وب نیاز دارد، بنابراین در ادامه به HTML که در بردارنده محتوای اصلی صفحه وب است پرداخته میشود.
HTML
HTML سرنامی برای عبارت «Hyper Text Markup Language» یا «زبان نشانهگذاری ابرمتنی» است. برخی از نکات پیرامون HTML عبارتند از:
- HTML ساختار یک صفحه وب را با استفاده از نشانهگذاریها توصیف میکند.
- مولفههای HTML بلوکهای یک صفحه HTML را میسازند.
- مولفههای HTML با استفاده از تگها نمایش داده میشوند.
- تگهای HTML بخشی از محتوا مانند «سرآیند» (heading | هِدِر)، «پاراگراف»، «جدول» و دیگر موارد را برچسبزنی میکنند.
- مرورگرها تگهای HTML را نمایش نمیدهند، بلکه از آنها برای رندر کردن محتوای یک صفحه استفاده میکنند.
یک سند HTML ساده
1<!DOCTYPE html>
2<html>
3<head>
4<title>Page Title</title>
5</head>
6<body><h1>My First Heading</h1>
7<p>My first paragraph.</p>
8
9</body>
10</html>
شرح مثال
- اعلان <!DOCTYPE html> مشخص میکند که سند پیش رو HTML5 است.
- عنصر <html>، مولفه ریشهای یک صفحه HTML است.
- عنصر <head> شامل اطلاعات متا (meta information) پیرامون سند است.
- عنصر <title>، عنوان سند را تعیین می کند.
- عنصر <h1> یک سرآیند (heading) بزرگ را تعریف میکند.
- عنصر <p> یک پاراگراف را تعیین میکند.
وب اسکرپینگ چیست؟
وب اسکرپینگ، وب هاروستینگ (هرس کردن وب | web harvesting) یا «استخراج دادههای وب» (web data extraction) نوعی «دیتا اسکرپینگ» (data scraping) است که برای استخراج دادهها از وبسایتها مورد استفاده قرار میگیرد. نرمافزارهای وب اسکرپینگ ممکن است به دادههای «وب جهان گستر» (World Wide Web) با استفاده از «پروتکل انتقال ابرمتن» (Hypertext Transfer Protocol) به طور مستقیم یا از طریق یک مرورگر وب دسترسی داشته باشند.
با وجود آنکه وب اسکرپینگ میتواند به صورت دستی توسط کاربر نرمافزار انجام شود، این عبارت معمولا به فرآیند خودکاری مربوط میشود که با استفاده از یک «بات» (bot) یا «خزنده وب» انجام میشود. این کار در واقع نوعی از کپی کردن است که در آن دادههای مشخصی از وب گردآوری و کپی میشوند. این دادهها به منظور انجام بازیابی یا تحلیلهای آتی، به طور معمول در یک پایگاهداده محلی مرکزی یا «صفحه گسترده» (Spreadsheet) کپی میشوند.
چرا تحلیلگران به وب اسکرپینگ نیاز دارند؟
یک سازمان بزرگ نیاز دارد تا خود را با تغییرات اطلاعاتی که در تعداد زیادی از وبسایتها به وقوع میپیوندد به روز نگه دارد. یک وب اسکرپر هوشمند (intelligent web scraper) وبسایتهای جدیدی که باید دادهها را از آنها اسکرپ کند مییابد. رویکردهای هوشمند، دادههای تغییر یافته را تعیین کرده و آنها را بدون بیرون آوردن لینکهای غیر لازم موجود در محتوا، استخراج کرده و به منظور نظارت و استخراج اطلاعات زمان واقعی به طور موثر و کارآمدی در صفحه وب خزش میکنند. پژوهشگر میتواند به سادگی بر چندین وبسایت به طور همزمان نظارت کند، در حالیکه با فرکانس تکرارها نیز به روز است.
تحلیلگر میتواند شاهد تغییرات دائما در حال وقوع در وب باشد. اما اگر تغییرات کلیدی توسط یک سازمان به وقوع پیوست، چگونه میتوان متوجه آنها شد؟ فرض میشود که تغییری در کارکنان یک سازمان به وقوع پیوسته، چگونه میتوان از آن مطلع شد؟ پاسخگویی به این پرسشها همان نقطهای است که وب اسکرپینگ و ویژگیهای آن برجسته میشوند. روشهای وب اسکرپینگ هوشمند کاربران را از آخرین تغییرات به وقوع پیوسته در یک وبسایت مشخص آگاه و بنابراین به آنها در تحت نظر داشتن چالشها و فرصتها کمک میکنند.
وب اسکرپینگ با استفاده از پایتون و Beautiful Soup
در ابتدا، کار با یک صفحه وب دارای HTML خیلی پایهای آغاز میشود. سپس، چگونگی انجام وب اسکرپینگ روی صفحات وب جهان واقعی نشان داده خواهد شد. اولین چیزی که برای اسکرپ کردن در یک صفحه وب مورد نیاز است، دانلود کردن آن صفحه است. میتوان این کار را با استفاده از کتابخانه پایتون Requests (+) انجام داد.
کتابخانه Requests یک درخواست Get به وب سرور ارسال میکند که محتوای HTML صفحه وب مورد نظر را برای کاربر دانلود میکند. انواع گوناگونی از درخواستها وجود دارد که می توان با استفاده از کتابخانه Requests انجام داد و GET تنها یکی از آنها است. اکنون تلاش میشود تا یک صفحه وبسایت ساده از این آدرس با روش بیان شده دانلود شود. ابتدا، این صفحه با متد requests.get دانلود میشود.
پس از اجرای درخواست، شی Response (+) دریافت میشود. این شی دارای ویژگی status_code است که در صورت دانلود موفقیتآمیز یک صفحه وب، این مساله را به کاربر اطلاع میدهد. میتوان محتوای HTML یک صفحه را با استفاده از ویژگی content پرینت کرد.
Beautiful Soup
میتوان از کتابخانه Beautiful Soup برای «تجزیه کردن» (parse) این سند و استخراج متن از تگ P استفاده کرد. در این راستا، ابتدا باید کتابخانه مذکور را ایمپورت کرد و یک نمونه از کلاس Beautiful Soup را برای تجزیه سند مورد نظر ساخت.
اکنون میتوان محتوای HTML را که با استفاده از متد prettify در شی BeautifulSoup به خوبی قالببندی شده از صفحه پرینت کرد.
از آنجا که همه تگها تو در تو هستند، میتوان هر بار یک سطح از طریق ساختار حرکت کرد. ابتدا همه عناصر در سطح بالای صفحه با استفاده از ویژگی children از soup انتخاب میشوند. توجه به این نکته لازم است که children یک «تولیدکننده لیست» (list generator) باز میگرداند، بنابراین نیاز به فراخوانی تابع list در آن است.
همانطور که در بالا مشهود است، دو تگ head و body در اینجا وجود دارند. هدف آن است که متن موجود در تگ p استخراج شود، بنابراین باید مستقیما به سراغ body رفت (مراجعه به بالا، زیر html.children). اکنون میتوان تگ p را با یافتن children تگ body دریافت کرد.
میتوان از متد get_text برای استخراج همه متن درون تگ استفاده کرد.
یافتن همه نمونههای یک تگ به صورت یکباره
آنچه در بالا انجام شد برای درک اینکه چگونه باید در یک صفحه وب حرکت کرد مفید بود، اما از دستورات زیادی برای انجام یک کار نسبتا ساده استفاده شد. این در حالی است که اگر هدف استخراج یک تگ تنها باشد، میتوان از متد find_all استفاده کرد که همه نمونههای یک تگ را در یک صفحه پیدا میکند. اگر تمایل بر این باشد که اولین نمونه از تگ یافت شود، میتوان از متد find در پایتون استفاده کرد که یک شی Beautiful Soup تنها را باز میگرداند.
برای فورک کردن این نوتبوک باید به راهنمای وب اسکرپینگ (+) مراجعه کرد.
اکنون، چگونگی انجام وب اسکرپینگ با استفاده از پایتون ۳ و کتابخانه Beautiful Soup تشریح خواهد شد. در برررسی موردی که به عنوان مثال ارائه خواهد شد، دادههای مربوط به پیشبینیهای آب و هوا در «National Weather Service» اسکرپ خواهد شد و سپس دادههای حاصل با استفاده از کتابخانه Pandas تحلیل میشوند. برای مطالعه بیشتر پیرامون چگونگی تحلیل داده در پایتون، مطالعه مطلب «یادگیری علم داده (Data Science) با پایتون — از صفر تا صد» توصیه میشود.
اکنون که مقدمات لازم برای وب اسکرپینگ تشریح شد، کار استخراج اطلاعات پیرامون آبوهوای محلی از «National Weather Service website» انجام خواهد شد. اولین گام یافتن صفحهای است که باید اسکرپ شود. در اینجا به عنوان مثال اطلاعات آبوهوا از «ناحیه مرکزی سانفرانسیسکو» (downtown San Francisco) از این صفحه اسکرپ خواهد شد.
پس از باز کردن این صفحه، باید از کلیدهای ترکیبی CRTL+SHIFT+I برای بازرسی عناصر (inspect the element) استفاده شود، البته در این صفحه آنچه حائز اهمیت محسوب میشود ستون «San Francisco CA» است. بنابراین، با کلیک راست کردن روی صفحه نزدیک جایی که عبارت «Extended Forecast» نوشته شده، و سپس کلیک روی «Inspect»، باید تگی که شامل متن «Extended Forecast» در پنل عناصر است را باز کرد.
سپس، میتوان در پنل عناصر جابهجا شد تا عنصر «outermost» را که شامل همه متنهایی است که مربوط به پیشبینیهای آب و هوا هستند پیدا کرد. در این مورد، یک تگ div با شناسه seven-day-forecast وجود دارد. با کاوش در div، میتوان هر آیتم پیشبینی را پیدا کرد (برای مثال «Thursday» ،«Tonight» و «Thursday Night») که با کلاس tombstone-container در div وجود دارند. اکنون، به اندازه کافی اطلاعات برای دانلود صفحه وب و آغاز تجزیه آن وجود دارد. در کدی که در ادامه آمده، کارهای زیر انجام میشود:
- صفحه وب که شامل پیشبینیها است دانلود میشود.
- کلاس Beautiful Soup برای تجزیه صفحه وب ساخته میشود.
- div با شناسه seven-day-forecast یافت شده و به seven_day تخصیص پیدا میکند.
- درون seven_day، هر آیتم پیشبینی مجزا یافت میشود.
- اولین آیتم پیشبینی استخراج و چاپ میشود.
استخراج کردن و پرینت اولین آیتم پیشبینی
همانطور که از خروجی کد به نظر میرسد، آیتم پیشبینی tonight دربرگیرنده کلیه اطلاعاتی محسوب میشود که در اینجا مورد نیاز است. ۴ تکه از اطلاعات را میتوان استخراج کرد:
- نام آیتم پیشبینی که در این مورد Today است.
- توصیف شرایط که در ویژگی title از img ذخیره شده است.
- یک توصیف کوتاهه از شرایط که در این مورد Sunny است.
- دمای پایین که در این مورد °69 فارنهایت (°69 F) است.
اکنون که چگونگی استخراج هر بخش مجزا از اطلاعات مشخص شد، میتوان دانش موجود را با انتخابگرهای CSS نیز ترکیب کرد و «خلاصه لیست» (list comprehensions) را برای استخراج همه چیز به صورت یکباره، مورد استفاده قرار داد. در کد زیر همه آیتمهای با کلاس period-name درون یک آیتم با کلاس tombstone-container در seven_day انتخاب میشوند. از «خلاصه لیست» (list comprehension) برای فراخوانی متد get_text در هر شی Beautiful Soup استفاده میشود.
ترکیب کردن دادهها در دیتافریم Pandas
میتوان از عبارت باقاعده و متد Series.str.extract برای کشیدن مقادیر دمای عددی استفاده کرد.
برای فورک کردن این نوت بوک باید به صفحه وب اسکرپینگ (+) و گیتهاب (+) مراجعه کرد. امید میرود که با بهرهگیری از این مطلب، شناخت خوبی از چگونگی اسکرپ کردن دادهها از صفحات وب برای علاقمندان حاصل شده باشد.
قطعه کدهای مورد استفاده برای پروژه
قطعه کدهای مورد استفاده برای این پروژه، به همراه خروجیهای آنها در ادامه به طور کامل ارائه شده است.
ورودی ۱:
1from bs4 import BeautifulSoup
2import requests
ورودی ۲ (دانلود صفحه حاوی پیشبینیها):
1page = requests.get("http://forecast.weather.gov/MapClick.php?lat=37.7772&lon=-122.4168")
ورودی ۳ (ساخت یک کلاس BeautifulSoup برای تجزیه صفحه):
1soup = BeautifulSoup(page.content, 'html.parser')
ورودی ۴ (پیدا کردن div با seven-day-forecast و تخصیص به seven_day):
1seven_day = soup.find(id="seven-day-forecast")
ورودی ۵ (درون seven_day، هر یک از اقلام مجزای پیشبینی را پیدا کن):
1forecast_items = seven_day.find_all(class_="tombstone-container")
ورودی ۶ (استخراج و پیشبینی اولین عنصر پیشبینی شده):
1tonight = forecast_items[0]
2print(tonight.prettify())
خروجی ۶:
<div class="tombstone-container"> <p class="period-name"> Today <br/> <br/> </p> <p> <img alt="Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph. " class="forecast-icon" src="newimages/medium/few.png" title="Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph. "/> </p> <p class="short-desc"> Sunny </p> <p class="temp temp-high"> High: 69 °F </p> </div>
ورودی ۷ (نام آیتم پیشبینی استخراج میشود):
1period = tonight.find(class_ = "period-name").get_text()
2short_Desc = tonight.find(class_ = "short-desc").get_text()
3temp = tonight.find(class_ = "temp temp-high").get_text()
4
5print(period)
6print(short_Desc)
7print(temp)
خروجی ۷:
Today Sunny High: 69 °F
ورودی ۸ (میتوان خصیصه عنوان را از img tag استخراج کرد):
1img = tonight.find('img')
ورودی ۹:
1img.prettify()
خروجی ۹:
'<img alt="Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph. " class="forecast-icon" src="newimages/medium/few.png" title="Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph. "/>\n'
ورودی ۱۰:
1desc =img['title']
2print(desc)
خروجی ۱۰:
Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph.
ورودی ۱۱ (از خلاصه لیست یا همان List Comprehension برای فراخوانی متد get_text روی هر کتابخانه BeautifulSoup استفاده میشود):
1period_tags = seven_day.select(".tombstone-container .period-name")
2periods = [pt.get_text() for pt in period_tags]
3periods
خروجی ۱۱:
['Today', 'Tonight', 'Tuesday', 'TuesdayNight', 'Wednesday', 'WednesdayNight', 'Thursday', 'ThursdayNight', 'Friday']
ورودی ۱۲:
1short_descs = [sd.get_text() for sd in seven_day.select(".tombstone-container .short-desc")]
2temps = [t.get_text() for t in seven_day.select(".tombstone-container .temp")]
3descs = [d["title"] for d in seven_day.select(".tombstone-container img")]
4
5print(short_descs)
6print(temps)
7print(descs)
خروجی ۱۲:
['Sunny', 'Partly Cloudy', 'Mostly Sunny', 'Partly Cloudy', 'Mostly Sunny', 'Partly Cloudy', 'Mostly Sunny', 'Partly Cloudy', 'Mostly Sunny'] ['High: 69 °F', 'Low: 55 °F', 'High: 67 °F', 'Low: 54 °F', 'High: 68 °F', 'Low: 55 °F', 'High: 68 °F', 'Low: 56 °F', 'High: 70 °F'] ['Today: Sunny, with a high near 69. West wind 11 to 18 mph, with gusts as high as 23 mph. ', 'Tonight: Partly cloudy, with a low around 55. West southwest wind 15 to 21 mph, with gusts as high as 25 mph. ', 'Tuesday: Mostly sunny, with a high near 67. West southwest wind 11 to 20 mph, with gusts as high as 24 mph. ', 'Tuesday Night: Partly cloudy, with a low around 54. West southwest wind 16 to 18 mph, with gusts as high as 23 mph. ', 'Wednesday: Mostly sunny, with a high near 68. West southwest wind 7 to 17 mph, with gusts as high as 21 mph. ', 'Wednesday Night: Partly cloudy, with a low around 55.', 'Thursday: Mostly sunny, with a high near 68.', 'Thursday Night: Partly cloudy, with a low around 56.', 'Friday: Mostly sunny, with a high near 70.']
ورودی ۱۳ (ترکیب کردن دادهها در دیتافریم پانداز):
1import pandas as pd
2weather = pd.DataFrame({
3 "period": periods,
4 "short_desc": short_descs,
5 "temp": temps,
6 "desc":descs
7 })
8weather
خروجی ۱۳:
desc | temp | short_desc | period | |
Today: Sunny, with a high near 69. West wind 1... | High: 69 °F | Sunny | Today | 0 |
Tonight: Partly cloudy, with a low around 55. ... | Low: 55 °F | Partly Cloudy | Tonight | 1 |
Tuesday: Mostly sunny, with a high near 67. We... | High: 67 °F | Mostly Sunny | Tuesday | 2 |
Tuesday Night: Partly cloudy, with a low aroun... | Low: 54 °F | Partly Cloudy | TuesdayNight | 3 |
Wednesday: Mostly sunny, with a high near 68. ... | High: 68 °F | Mostly Sunny | Wednesday | 4 |
Wednesday Night: Partly cloudy, with a low aro... | Low: 55 °F | Partly Cloudy | WednesdayNight | 5 |
Thursday: Mostly sunny, with a high near 68. | High: 68 °F | Mostly Sunny | Thursday | 6 |
Thursday Night: Partly cloudy, with a low arou... | Low: 56 °F | Partly Cloudy | ThursdayNight | 7 |
Friday: Mostly sunny, with a high near 70. | High: 70 °F | Mostly Sunny | Friday | 8 |
ورودی ۱۴ (از یک عبارت با قاعده و متد Series.str.extract برای بیرون کشیدن مقادیر عددی درجه حرارت استفاده میشود):
1temp_nums = weather["temp"].str.extract("(?P<temp_num>\d+)", expand=False)
2weather["temp_num"] = temp_nums.astype('int')
3temp_nums
خروجی ۱۴:
0 69 1 55 2 67 3 54 4 68 5 55 6 68 7 56 8 70 Name: temp_num, dtype: object
ورودی ۱۵:
1weather["temp_num"].mean()
خروجی ۱۵:
62.44444444444444
ورودی ۱۶:
1is_night = weather["temp"].str.contains("Low")
2weather["is_night"] = is_night
3is_night
خروجی ۱۶:
0 False 1 True 2 False 3 True 4 False 5 True 6 False 7 True 8 False Name: temp, dtype: bool
ورودی ۱۷:
1weather[is_night]
خروجی ۱۷:
is_night | temp_num | desc | temp | short_desc | period | |
True | 55 | Tonight: Partly cloudy, with a low around 55. ... | Low: 55 °F | Partly Cloudy | Tonight | 1 |
True | 54 | Tuesday Night: Partly cloudy, with a low aroun... | Low: 54 °F | Partly Cloudy | TuesdayNight | 3 |
True | 55 | Wednesday Night: Partly cloudy, with a low aro... | Low: 55 °F | Partly Cloudy | WednesdayNight | 5 |
True | 56 | Thursday Night: Partly cloudy, with a low arou... | Low: 56 °F | Partly Cloudy | ThursdayNight | 7 |
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- مجموعه آموزشهای هوش محاسباتی
- آموزش برنامهنویسی R و نرمافزار R Studio
^^
سلام خداقوت
اگه ممکنه مثال هایی رو برای سایت های چند صفحه ای بزنید
ممنون
سلام
من میخاستم بدونم جداولی هستن که تو یک آدرس اینترنتی دارای چند صفحه هستن مثلا اطلاعات یک جدول رو مشاهده میکنیم بعد next رو میزنیم بدون اینکه آدرس اینترنتی تغییر کنه صفحه بعدی جدول رو می بینیم حالا میخام بدونم چطور میشه این صفحات جدول رو اسکرپ کرد؟
سلام
برای من کتابخانه beautifulsoup رو نمیشناسه. bs4رو وارد کردم و کتابخونه رو هم نصب کردم ولی نمیاره. کسی میتونه کمکی کنه؟
سلام
from bs4 import BeautifulSoup
به این صورت وارد کنید.
سلام،
من هیچی بلد نبودم با همین مطلب تونستم اولین خروجی کرولر که برای مصاحبه یک شرکت بود رو بگیرم.
خیلی سپاسگذارم برای این مطب مفید و کامل.
سلام.خسته نباشید.ممنون از مطالب خوبتون.یه سوالی داشتم.
اگه فرض کنیم که ما یه html داشته باشیم که ساختارش ب این صورته:
<div id=main class=other این سرشاخه است
<div class=test…………
<div class=test………… این دوتا زیر شاخه هستن
من از دستور main_div = soup.find_all(id="main") استفاده می کنم برای خواندن محتویات سرشاخه و از دستور
subdiv=main_div.find_all('div',attrs={"class":"test"}) هم برای خواندن زیر شاخه ها استفاده می کنم.اولی رو اجرا می کنه ولی دومی رو نه.
اگه لطف کنین مشکل این کد رو بهم بگین ممنون می شم
سلام از stack overflow استفاده کنید
خوب بود
سلام خسته نباشید . ببخشید من هنگامی که میخوام از سایت های فیلتر شده اسکریپ کنم چیزی بهم برنمیگردونه !
فیلتر شکنم روشنه ، اتصال برنامه به سایت با استاتوس کد 200 موفقیت آمیزه و حتا headers سایت رو هم میتونم بگیرم اما وقتی میگم دنبال فلان تگ ، با فلان ویژگی ها بگرد ، یه لیست خالی بهم بر میگردونه … چیکار باید بکنم ؟
عالی بود ، لطفا عکس ها رو با کیفیت بهتری قرار دهید
با سلام؛
از همراهی شما با مجله فرادرس سپاسگزارم. کدهای مربوط به این پروژه به همراه خروجی هر بخش از کد، در انتهای مطلب قرار داده شد.
شاد و پیروز باشید.
سلام
من میخوام از یک سری فایل html مشابه ذخیره شده در یک فولدر یکی از تگ های داده رو استخراج کنم و در یک فایل excel ذخیره کنم . باید از چه روشی اینکار رو انجام بدم.
ممنون میشم راهنمایی کنید
سلام با تشکر از مطالب عالی سایتتون
ایا میشه تعداد بازدید کننده ها رو با وب اسکرپینگ (Web Scraping) با پایتون و کتابخانه Beautiful Soup انجام داد (البته برای هر سایتی نه برای سایت خودمان )
اره کافیه تعداد بازدید در html سایت باشه
خیلی عاااااالی فقط مشکل عکس ها هستن که کیفیتشون پایینه و قابلیت بزرگنمایی هم ندارن
مقاله خوبی بود اما مشکل جدی کیفیت پایین عکس ها بود که باید عکس ها قابلیت بزرگ نمایی داشته باشند تا بتوان جزئیات کد استفاده شده رو مشاهده کرد
بسیار عالی تربیت مدرسی
من به متن های شما معتادممممم… دمتون گرمممم خدا قوت