سه شنبه 21 دی 1395 - 10:10
آموزش برنامه نویسی پایتون#جلسه نهم
بسم الله الرحمن الرحیم
جلسه نهم
دسترسی به LAN و اینترنت
در این بخش، مختصری درباره نحوه اتصال و دسترسی به منابع موجود در اینترنت، واکشی و parse کردن صفحات وب و اتصالات FTP توضیح داده خواهد شد.
ماژول ها چه آنهایی که به صورت آماده از اینترنت دانلود می شوند، و چه آنهایی که توسط خود برنامه نویسان نوشته می شوند، بعضا از ماژول های استاندارد استفاده می کنند. در این بخش از آموزش پایتون مختصری درباره برخی ماژول های استاندارد پایتون که برای دسترسی به منابع وب مورد نیاز هستند، برخی تکنولوژی ها به کار رفته و تعدادی سایت مرتبط توضیح داده می شود.
بسم الله الرحمن الرحیم
جلسه نهم
دسترسی به LAN و اینترنت
در این بخش، مختصری درباره نحوه اتصال و دسترسی به منابع موجود در اینترنت، واکشی و parse کردن صفحات وب و اتصالات FTP توضیح داده خواهد شد.
ماژول ها چه آنهایی که به صورت آماده از اینترنت دانلود می شوند، و چه آنهایی که توسط خود برنامه نویسان نوشته می شوند، بعضا از ماژول های استاندارد استفاده می کنند. در این بخش از آموزش پایتون مختصری درباره برخی ماژول های استاندارد پایتون که برای دسترسی به منابع وب مورد نیاز هستند، برخی تکنولوژی ها به کار رفته و تعدادی سایت مرتبط توضیح داده می شود.
برخی ماژول های استاندارد پایتون که برای دسترسی به منابع وب:
ماژول os:
امکان دسترسی به فایل سیستم های محلی را فراهم می کند. این ماژول هم چنین امکان دستکاری فایل سیستم های دور را نیز فراهم می کند.
ماژول socket:
این ماژول از C API سطح پایین برای برقراری ارتباط در شبکه با استفاده از واسط سوکت BSC استفاده می کند. این ماژول دارای کلاس socket، برای مدیریت کانال داده، و هم چنین توابعی برای انجام وظایف مربوط به شبکه مانند تبدیل نام سرور به یک نام و قالب بندی داده جهت اتصال در شبکه، می باشد.
ماژول email:
پکیج email کتابخانه ای است که برای مدیریت پیغام های ایمیل از جمله MIME مورد استفاده قرار می گیرد.
هم چنین پروتکل POP(post office protocol) برای دانلود ایمیل از یک سرور پست الکترونیکی استفاده می شود و (internet message access protocol) برای اتصال یک سیستم (مانند لپ تاپ یا کامپیوتر رومیزی ) به یک سرور اینترنتی بزرگ به کار می رود و امکان مشاهده و دستکاری ایمیل کاربران را فراهم می کند.
ماژول smtplib: این ماژول دارای کلاس SMTP (Simple Mail Transfer Protocol) می باشد. رایج ترین کاربرد آن تعامل با سرورهای SMTP، از قبیل ارسال ایمیل و مسیریابی ایمیل بین سرورها می باشد.
ماژول ftplib:
این ماژول دارای کلاس FTP برای پیاده سازی پروتکل FTP در سمت کلاینت می باشد. با استفاده از این ماژول می توان به سرور FTP متصل شد و پس از بازیابی فایل ها ، آنها را به صورت محلی پردازش کرد.
ماژول urllib:
این ماژول دارای دو ورژن urllib(1) و urllib(2) می باشد که urllib(2) دارای مدیریت خطای بهتری می باشد.
ماژول httplib:
ماژول httplib دارای کلاس هایی است که پروتکل های http و https سمت کلاینت را پیاده سازی می کند.این ماژول مشابه urllib است اما urllib نسبت به httplib دارای سطح انتزاع بالاتری می باشد به این معنا که به طور اتوماتیک کنترل بسیاری از قسمت ها را انجام داده و نیازی به کد نویسی مجدد نمی باشد.
برخی تکنولوژی های مرتبط با پایتون:
IronPython:
IronPython یک پیاده سازی منبع باز از زبان برنامه نویسی پایتون می باشد که مربوط با Microsoft .NET Framework می باشد.
Jython:
Jython که برای Java virtual machine یا Java run time به کار می رود، این امکان را فراهم می کند که برنامه نویس بتواند source code پایتون را به bytecode جاوا تبدیل کرده و بتواند کد را بر روی هر ماشین مجازی جاوا (Java virtual machine) اجرا کند. یکپارچگی پایتون و جاوا امکان دسترسی برنامه نویسان به کتابخانه های جاوا را فراهم می کند.
Pywin32:
pywin32 مجموعه ای از ماژول ها می باشد، که دسترسی به بسیاری از توابع API ویندوز را فراهم می کند. برای مثال امکان دسترسی به برنامه های office و مدیریت آنها با استفاده از پایتون فراهم می شود.
سایت های مفید در زمینه پایتون
از جمله سایت های مفید در زمینه پایتون می توان به موارد زیر اشاره کرد:
· PyPI (https://pypi.python.org/pypi )
• StackOverflow (http://stackoverflow.com/questions/tagged/python ). StackOverflow سایتی است که در آن به یک سوال پاسخ های متعددی داده شده است و برای توسعه دهندگان نرم افزار بسیار مفید است.
• ActiveStateCode (http://code.activestate.com/). ActiveStateCode یک code repository است که می توان از آن کدهای مورد نظر را به صورت رایگان دانلود کرد.
دسترسی به فایل به اشتراک گذاشته شده در پایتون
مثال 1: در ابتدا یک فولدر به نام shared ایجاد کرده و در آن یک فایل متنی با نام serverfile.txt می سازیم.
به جای آنکه یک مسیر نسبی را به تابع بفرستیم، مسیری کامل (UNC path ) را به تابع listdir() از ماژول os ارسال می کنیم. UNC path با دو کاراکتر "\" شروع می شوند. UNC path () رشته ای است که برای مشخص کردن مکان منابعی مانند فولدرها یا منابع به اشتراک شده استفاده می شود و در سیستم عامل ویندوز فرمت کلی آن به صورت زیر است:
\\servername\sharename\path\filename
تابع listdir() یک لیست بر می گرداند.
توجه کنید که در پایتون "\" یک کاراکتر گریز (escape character) است، بنابراین یا باید به جای یک علامت "\" از دو علامت "\" استفاده کرد یا به جای "\" (backslash) از "/" (forward slash) استفاده کرد.
در مرحله بعد یک فایل جدید برای نوشتن ایجاد می شود و متنی را در آن نوشته می شود. پس از ایجاد این فایل می توان از طریق فولدر shared که قبلا ایجاد کرده بودیم، به آن دسترسی داشت.
>>> import os
>>> d = os.listdir('\\192.168.1.3\shared')
Traceback (most recent call last):
File "", line 1, in
d = os.listdir('\\192.168.1.3\shared')
WindowsError: [Error 3] The system cannot find the path specified: '\\192.168.1.3\\shared/*.*'
>>> d = os.listdir('\\\\192.168.1.3\\shared')
>>> d
['serverfile.txt']
>>> type(d)
>>> f = open('\\\\192.168.1.3\\shared\\testdoc.txt', 'w')
>>> f.write('Hello there from across the network.')
>>> f.close()
مثال 2 : در مثال زیر سعی شده است تا تمام فایل های دارای پسوند ".txt" از مسیر "C:/files" در مسیری با عنوان destination کپی شوند. ماژول shutil دارای تعدادی عملیات سطح بالا بر روی فایل ها و مجموعه ای از فایل هاست که امکان کپی و حذف فایل ها را نیز فراهم می کند. در این مثال از تابع copy() استفاده شده است. این تابع دو پارامتر src (مسیر مبدأ) و dst (مسیر قصد) را به صورت رشته دریافت می کند و فایل ها را از مبدا به مقصد کپی می کند.
#Adapted from stackoverflow.com
import os
import shutil
path = os.path.join("C:/", "files")
destination = os.path.join('\\\\192.168.1.3', 'shared')
for r,d,f in os.walk(path):
for files in f:
if files.endswith('.txt'):
try:
shutil.copy(os.path.join(r,files), destination)
except IOError, e:
print e
تفاوت URI، URL و URN در مفاهیم وب
URI (Uniform Resource Identifier) یک منبع را یا بوسیله مکان یا بوسیله نام یا توسط هردو مشخص و شناسایی میکند. در واقع URI خود از دو بخش تشکیل شده: URN و .URL که URN مشخص کننده نام منبع و URL تعیین کننده روش دسترسی به منبع است.
در واقع URI رشته ای از کاراکترها است که برای شناسایی هویت و روش دسترسی به یک منبع از آن استفاده می شود.
Uniform Resource Locator (URL) یک زیر مجموعه و بخشی از (URI) می باشد که می تواند چگونگی بازیابی و یافتن هر منبعی را مشخص کند.
URN (Uniform Resource Name): URN یک مشخصه است که بصورت یکتا یک منبع را نام گذاری می کند و هیچ جزئیاتی در مورد چگونگی دسترسی به آن منبع به ما نمی دهد.
برای مثالURN شبیه به نام یک فرد است، در حالی که یک URL مانند آدرس خیابان. URN تعریف هویت چیزی است، در حالی که URL یک محل را فراهم می کند.
دسترسی به صفحات وب در پایتون
صفحات وب به طور معمول فایل هایی با پسوند ".html" یا ".htm"هستند. برای دسترسی به صفحات وب می توان از متد urlopen از ماژول urllib (یا urllib2) استفاده کرد.
در پایتون درباره URLها صحبت می شود و با locatorهایی که به منابع وب اشاره می کنند، کار می کند.
تفاوت urlopen با open معمولی آن است که urlopen فقط امکان خواندن از فایل را فراهم می کند اما open امکان خواندن، نوشتن و افزودن به انتهای فایل و ... را فراهم می کند.
Httplib یک واسط کلاینت بسیار سطح پایین است.
مثال 1: در این برنامه ابتدا ماژول urllib برای خواندن محتوای صفحه وب، و هم چنین ماژول sys ، import می شود زیرا بهترین روش برای خواندن محتوای یک فایل استفاده از حلقه for است. استفاده از حلقه for مناسب تر از آن است که کل محتوای فایل در یک خط و با استفاده از تابع readlines خوانده شود. و سپس با استفاده از تابع urlopen() صفحه وب مورد نظر برای خواندن باز می شود.
برای دسترسی به خطوط موجود در صفحه وب از یک حلقه for استفاده می شود. در ادامه کد مربوطه و فقط بخشی از خروجی نشان داده شده است که در اصل محتوای واقعی صفحه home page سایت google است.
>>> import urllib
>>> import sys
>>> wp = urllib.urlopen('http://www.google.com')
>>> for line in wp:
sys.stdout.write(line)
متد info() نمونه ای از کلاس mimetools.Message بر می گرداند که فرا داده ای مرتبط با URL (سرور وب ) مربوطه را در اختیار قرار می دهد. برای مثال اطلاعاتی درباره نوع سیستم عاملی که وب سرور مربوطه روی آن اجرا می شود، زمان منقضی شدن صفحه وب (که اطلاعات مفیدی را برای DNS و caching فراهم می کند.)، P3P که privacy policy specification را مشخص می کند و اطلاعاتی درباره کاراکترهای صفحه ارائه می دهد.
>>> wp = urllib.urlopen('http://www.google.com')
>>> print wp.info()
Date: Mon, 05 Dec 2016 10:45:12 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: NID=91=NNFPpYdi73toxh3YkFkWqh9CzBPkZ9aUP3H5FGe5RLLbDQhvT9gZrh3bdUDw_fIr0dm1_OGZ06qfbjivzYRa1QnI71rfVQM92XJS8GZ_SMd-Z-P42YXh_4Wb12Xbz16sJrlydtggnufR8ag; expires=Tue, 06-Jun-2017 10:45:12 GMT; path=/; domain=.google.com; HttpOnly
Accept-Ranges: none
Vary: Accept-Encoding
Connection: close
زمانی که یک آدرس به آدرس جدیدی تغییر مسیر می دهد و به اصطلاح redirect می شود، می توان از تابع geturl() برای دسترسی به URL واقعی صفحه استفاده کرد. برای مثال در قطعه کد زیر وقتی آدرس نوشته شده درون تابع urlopen() در آدرس بار مرورگر نوشته شود، آدرس مربوطه به آدرس جدیدی تغییر مسیر می دهد.
>>> import urllib
>>> redirect = urllib.urlopen('http://garageband.com/michael_jackson4.mp3')
>>> redirect.geturl()
'http://www.apple.com/mac/garageband/?cid=oas-us-domains-garageband.com'
تابع urlretrieve:
این تابع یک شیء موجود در شبکه که دارای URL مشخص است را درون یک فایل محلی کپی می کند. اگر URL مربوطه به یک فایل محلی اشاره کند یا یک کپی معتبر از آن شیء وجود داشته باشد، شیء مربوطه کپی نمی شود.
>>> urllib.urlretrieve('http://www.python.org', 'C:/files/py.html')
('C:/files/py.html', )
با اجرای کد فوق صفحه home page سایت python.org در پوشه مورد نظر کپی می شود. اگر فایل کپی شده را با مرورگر IE باز کنید، مشاهده می شود که تصاویر در صفحه وجود ندارد اما تمام لینک ها و style کلی سایت به شکل صحیح ذخیره شده است و در صورت کلیک روی هر کدام از لینک های موجود، صفحه مربوطه به طور صحیح نمایش داده می شود. در ادامه تصویری از سایت اصلی http://www.python.org و هم چنین فایل py.html که با استفاده از تابع urlretrieve ذخیره شده است، آورده شده است.
سایت اصلی http://www.python.org
فایل py.html که با استفاده از تابع urlretrieve ذخیره شده است
mapping در پایتون
نگاشت (mapping) یک درایو در ویندوز به یک آدرس اشتراکی
برای map کردن یک درایو در ویندوز به یک آدرس اشتراکی، بعد از نصب کتابخانه pywin32، (که توسعه ای از ویندوز برای پایتون است)، ماژول win32wnet را که در این مجموعه قرار دارد، import می کنیم . هم چنین متد RESOURCETYPE_DISKرا با نام DISK از ماژول win32netcon ، import می کنیم. برای تغییر نام ماژول ها از کلمه کلیدی "as" استفاده می شود (و برنامه نویسانی که با SQL آشنایی دارند،با آن آشنا هستند). کاربرد "As" بیشتر در واقعی است که در ماژول های مورد استفاده، کلاس یا توابعی با نام مشابه وجود دارد و برای متمایز کردن این توابع و کلاس ها، با استفاده از کلمه کلیدی "as" نام جدیدی به آنها داده می شود. اما استفاده از آن در سایر موارد چندان توصیه نمی شود، زیرا جستجو یک ماژول یا کلاس مشخص را سخت تر می کند.
در قسمت بعد کد، درایو "R:" به مسیر (path ) مورد نظر نگاشت (map) می شود و مسیر نیز باید از نوع UNC path که در بالا اشاره شد بیان شود.
پس از اجرای کد، آدرس مربوطه به درایو مورد نظر اختصاص داده می شود که از قسمت computer در سیستم قابل مشاهده است.
###Adapted from ozoneasylum.com
import win32wnet
from win32netcon import RESOURCETYPE_DISK as DISK
drive_letter = "R:"
path = "\\\\192.168.1.3\\shared"
win32wnet.WNetAddConnection2(DISK, drive_letter, path)
استفاده از پایتون به عنوان FTP client (file transfer protocol):
پروتکل FTP که برای آپلود و دانلود فایل استفاده می شود، یک راه کار برای انتقال فایل و پوشه بین رایانههای مختلف در شبکه است که اصلیترین مصداق آن انتقال فایلهای سایت روی فضای میزبانی با استفاده از FTP است.
chilkat یک ماژول خارجی است که از پروتکل FTP پشتیبانی می کند . در سایت https://www.chilkatsoft.com/python.asp می توان ماژول chilkat را دانلود کرد و اطلاعات مفیدی درباره آن بدست آورد.
هم چنین ماژول urllib یک واسط سطح بالا برای عملکردهای FTP client فراهم می کند.
مثال 1: برای کار با پروتکل FTP از ماژول ftplib، FTP را import می کنیم. یک شی ار نوع ftp ایجاد کرده و آرگومان host بع آن داده می شود. متد FTP می توان پارامترهای دلخواه دیگر user، passwd، acct (account) و timeout را دریافت کند.
>>> from ftplib import FTP
FTP در اصل یک کلاس است و با ایجاد آن یک نمونه از آن ساخته شده و در متغیر ftp قرار می گیرد. در صورتی که نام کاربری یا پسوردی برای log in داشته باشیم، به عنوان پارامتر به تابع login() فرستاده می شود و در غیر این صورت پارامتری به آن ارسال نمی شود. علت استفاده از آدرس " ftp.redhat.com" در مثال زیر به دلیل آن است که امکان دسترسی به آن برای عموم وجود دارد.
در مرحله بعد متغیر d تعریف شده است که یک دایرکتوری به آن داده شده است . با دستور cwd() که برای تغییر مسیر به یک دایرکتوری به کار می رود وارد مسیر جاری می شویمو لیستی از دایرکتوری های موجود در آن مشاهده می شود.
>>> ftp = FTP('ftp.redhat.com')
>>> type(ftp)
>>> ftp.login()
'230 Login successful.'
>>> d = 'redhat/linux'
>>> ftp.cwd(d)
'250 Directory successfully changed.'
>>> print ftp.dir()
-rw-r--r-- 1 ftp ftp 131 Dec 20 2005 README
drwxr-xr-x 8 ftp ftp 4096 Dec 06 2012 beta
drwxr-xr-x 6 ftp ftp 4096 Jun 14 2007 eal
drwxrwsr-x 18 ftp ftp 4096 May 18 2016 enterprise
drwxr-xr-x 2 ftp ftp 4096 Feb 12 2006 preview
drwxr-xr-x 2 ftp ftp 4096 Dec 03 2008 rawhide
drwxrwsr-x 4 ftp ftp 4096 Sep 26 2008 updates
None
مثال 2: در مثال زیر در تابع ftext یک فایل متنی واکشی (fetch) می شود و در تابع fbin یک فایل باینری واکشی می شود. فایل باینری می تواند شامل فایل عکسی، فایل اجرایی، فایل متنی یونیکد یا اسکی یا ... باشد. در تابع ftext که در این مثال اجرا می شود،نام فایلی که می خواهیم از سرور دریافت کنیم به تابع داده شده است و خروجی در یک فایل متنی ریخته می شود.
تابع ftext دارای سه پارامتر به نام های ftp، filename و outfile می باشد. مقدار پیش فرض outfile برابر None در نظر گرفته شده است، تا در صورتی که فایل None بود در مسیر تعیین شده در تابع که یک دایرکتوری محلی است، فایلی برای نوشتن (‘w’) ایجاد شود و با استفاده از تابع retrlines یا retrbinary (با توجه به نوع فایل) محتوای فایلی که از سرور گرفته شده است، در فایل محلی نوشته شود.
#Adapted from effbot.org
import ftplib
import sys
import os
def ftext(ftp, filename, outfile = None):
#fetch a text file
if outfile is None:
#outfile = sys.stdout
outfile = open('C:/Python27/outfile.txt', 'w')
# Lambda expression to add newlines to the lines read from file
ftp.retrlines("RETR" + filename, lambda s, w=outfile.write: w(s+"\n"))
def fbin(ftp, filename, outfile = None):
#fetch a binary file
if outfile is None:
#outfile = sys.stdout
outfile = open('C:/Python27/outfile.txt', 'w')
# Lambda expression to add newlines to the lines read from file
ftp.retrbinary("RETR" + filename, outfile.write)
ftp = ftplib.FTP("ftp.redhat.com")
ftp.login()
d = 'redhat/dst2007/README'
ftp.cwd(d)
ftext(ftp, "README_FIRST.txt")
#fbin(ftp, "README_FIRST.txt")
ftp.close()
print 'Current working directory is: ', os.getcwd(), '\n'
با استفاده از lambda که در توابع به کار رفته است، می توان در زمان اجرا یک تابع را اجرا کرد بدون آنکه نامی به آن تابع اختصاص داده شود، به این نوع توابع anonymous functions می گویند. وقتی از lambda استفاده می شود، کلمه کلیدی "return " برای نشان دادن خروجی تابع به کارنمی رود، زیرا lambda همیشه دارای عبارتی است که به عنوان خروجی برگردانده می شود. علاوه بر این نیازی نیست که حتما عبارت lambda به یک متغیر نسبت داده شود. جهت کسب اطلاعات مفید و مختصر درباره lambda به سایت http://www.secnetix.de/olli/Python/lambda_functions.hawk رجوع شود.
امیدواریم مطالب این قسمت مورد توجه شما قرار گرفته باشد
مجموعه ABLY