استخراج داده از صفحات وب (Web Scraping) با رزبری پای و پایتون

فهرست مطالب

مقدمه

در این آموزش با مفهوم Web scraping آشنا می شوید و یاد می گیرید چگونه با استفاده از رزبری پای، به صورت خودکار اطلاعات مورد نیاز خود را از یک سایت استخراج کنید. در این مطلب، به عنوان پروژه، صفحه اخبار تکنولوژی خبرگزاری رویترز را به صورت خودکار می خوانیم و عناوین اخبار را در ساعتی مشخص به یک حساب ایمیل دلخواه می فرستیم.

آنچه در این آموزش یاد می گیرید

وب اسکرپینگ (Web Scraping) چیست؟

Web scraping به مفهوم استخراج اطلاعات مورد نیاز از یک صفحه وب با استفاده از کدنویسی است. یکی از بهترین زبان های برنامه نویسی برای این کار، پایتون است. با استفاده از کتابخانه های آماده ی پایتون، به راحتی و با نوشتن چند خط کد، می توان اطلاعات مورد نیاز را از یک صفحه ی وب استخراج و پردازش کرد. در این آموزش از کتابخانه ی مشهور Beautiful Soup برای Web scraping استفاده شده است.

وب اسکرپینگ با رزبری پای و پایتون

توجه
در این آموزش از پایتون 3 استفاده شده است. اگر می خواهید از پایتون 2 استفاده کنید، ممکن است نیاز باشد برخی از دستورات را تغییر دهید.

نصب کتابخانه های مورد نیاز

برای Web scraping به سه کتابخانه ی زیر نیاز است: (ممکن است برخی از آن ها را به صورت پیش فرض داشته باشید)
  • Bs4
  • Requests
  • Re
برای نصب آن ها می توانید از دستور pip استفاده کنید. برای این کار دستورات زیر را تک تک در ترمینال رزبری پای بنویسید:
pip3 install bs4 
pip3 install requests 
pip3 install re 
برای اطمینان از نصب شدن کتابخانه ها، آن ها را در IDLE پایتون import کنید. اگر با خطایی مواجه نشدید، یعنی کتابخانه ها را درست نصب کرده اید.
می خواهیم صفحه ی یک خبرگزاری را بخوانیم و تیتر اخبار را استخراج کنیم. من صفحه ی اخبار تکنولوژی Reuters را برای این کار انتخاب کردم.
روی صفحه راست کلیک کرده و گزینه ی View page source را انتخاب کنید. در صفحه باز شده به دنبال تیتر اولین خبری که دیدید، بگردید.
اگر با ساختار HTML آشنا باشید به راحتی می توانید عکس فوق را تحلیل کنید. (اگر آشنایی نداشتید هم نگران نباشید! با یک جستجوی ساده می توانید مفاهیم اولیه ی آن را یاد بگیرید)

کد

با کد زیر می توانید تیتر اخبار را از کد HTML جدا کنید:
from bs4 import BeautifulSoup 
import requests 
import re 
 
i = 1 
news = "" 
r = requests.get("https://www.reuters.com/news/technology") 
soup = BeautifulSoup(r.text, 'html.parser') 
result = soup.find_all('h3', attrs = {'class':'story-title'}) 
 
for new in result: 
    news += ("%s- "%i) 
    news += new.text.strip() 
    news += "\n" 
    i += 1 
 
print(news) 

ارسال ایمیل با پایتون

برای ارسال ایمیل به کتابخانه های زیر احتیاج دارید:
  • Smtplib
  • Mime
کد زیر تیتر اخباری که قبلا خوانده شده را برای آدرس های ایمیلی که مشخص می کنید، ایمیل می کند:
from bs4 import BeautifulSoup 
import requests 
import re 
import smtplib 
from email.mime.multipart import MIMEMultipart 
 
i = 1 
news = "" 
 
r = requests.get("https://www.reuters.com/news/technology") 
soup = BeautifulSoup(r.text, 'html.parser') 
result = soup.find_all('h3', attrs = {'class':'story-title'}) 
 
for new in result: 
    news += ("%s- "%i) 
    news += new.text.strip() 
    news += "\n" 
    i += 1 
 
gmail_user = 'my@gmail.com' #Enter your Email address  
gmail_password = '*******'   #Enter your Email pasword 
sent_from = gmail_user   
to = ['to1@gmail.com', 'to2@gmail.com']      #list of destination Email address 
 
#Email title 
msg = """Subject: Raspberry pi NEWS 
""" 
#add news to email massage 
msg += news 
   
try:   
    server = smtplib.SMTP_SSL('smtp.gmail.com', 465) 
    server.ehlo() 
    server.login(gmail_user, gmail_password) 
    server.sendmail(sent_from, to, msg) 
    server.close() 
 
    print ('Email sent!') 
except:   
    print ('Something went wrong...')  
در کد فوق آدرس ایمل فرستنده و رمز عبور آن و لیستی از آدرس های ایمیل گیرنده را وارد کنید.
نکته
دقت کنید که آدرس ایمیل فرستنده باید اکانت gmail باشد.
اگر پس از اجرای کد فوق عبارت ” Something went wrong”  را دریافت کردید، سه کار زیر را انجام دهید:
  • چک کنید که کد را درست نوشتید و آدرس ایمیل ها را درست وارد کرده اید.
  • چک کنید که پورت 465 آدرس gmail.com توسط ISP شما بلاک نشده باشد.
  • به این آدرس رفته و Allow less secure apps را درحالت ON قرار دهید.

اجرا کردن کدها روی رزبری پای با برنامه ی زمانی مشخص

اگر بخواهید برنامه ی نوشته شده بر روی برد رزبری پای با زمان بندی ای خاص (مثلا هر ساعت یک بار یا روزی یک بار) اجرا شود، باید مراحل زیر را انجام دهید:

گام اول) انتقال کد به مسیر /home/pi

گام دوم) اضافه کردن خط زیر به ابتدای کد:
#!/usr/bin/python3
گام سوم) دادن قابلیت اجرا (Executable) به کد ها با وارد کردن دستور زیر در ترمینال:
chmod +x reuters.py
بعد از آن، با وارد کردن دستور زیر در ترمینال، قابل اجرا بودن برنامه را چک کنید.
./reuters.py
گام چهارم) در ترمینال دستور زیر را بنویسید.
crontab -e
به انتهای پنجره ی باز شده رفته و دستور زیر را وارد کنید:
*/5 * * * * /home/pi/reuters.py
سپس آن را Save کنید و از آن خارج شوید.
این دستور باعث می شود که برنامه ی شما هر 5 دقیقه یک بار اجرا شود. شما می توانید آن را به دلخواه تغییر دهید. الگوی آن به این صورت است: Minutes Hours Day of month Month Weekday Command برای مثال های بیشتر به این سایت زیر مراجعه کنید.
توجه
دقت کنید که برد رزبری پای شما به اینترنت متصل باشد.

یک گام جلوتر

  • رزبری پای را طوری برنامه ریزی کنید که هر روز در ساعات 7 صبح و 7 شب به شما ایمیل دهد.
  • سعی کنید یک سایت دیگر را Scrape کنید.

رزبری پای 3 بخرید

آموزش های مشابه

Comment (1)

  • امیر Reply

    سلام خیلی حالب بود من web scraping رو با node js روی پکیج پاپتیر یاد گرفتم اینم خیلی جالب بود حیف دیگه پولم نمیرسه رزبری بخرم ??

    جولای 22, 2019 at 3:40 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.