را کتابخانه درخواست های پایتون برای ایجاد درخواست های HTTP در پایتون استفاده می شود.
مثال درخواست پایتون
import requests
url = 'https://crawler-test.com/'
r = requests.get(url)
r.text
در این آموزش، نحوه استفاده از ماژول درخواست های پایتون را با مثال هایی یاد خواهید گرفت:
- ساختار یک درخواست را درک کنید
- درخواست های GET و POST را ارسال کنید
- عناصر HTML یک صفحه وب را بخوانید و استخراج کنید
- درخواست های خود را بهبود بخشید
بیایید نحوه استفاده از درخواست های پایتون را بیاموزیم.
نحوه استفاده از درخواست های پایتون
برای استفاده از ماژول درخواست های پایتون این مراحل را دنبال کنید.
- بسته درخواست های پایتون را نصب کنید
$ pip install requests
- ماژول درخواست ها را وارد کنید
import requests
- با استفاده از روش GET درخواست بدهید
از متد GET استفاده کنید و پاسخ را در یک متغیر ذخیره کنید.
r = requests.get(url)
- پاسخ را با استفاده از ویژگی ها و روش های درخواست بخوانید
میتوانید با استفاده از ویژگیهای آن با شی درخواست پایتون تعامل داشته باشید (مثلاً
r.status_code
) و روش ها (مثلاr.json()
).
درخواست های پایتون را دانلود و نصب کنید
از pip برای نصب آخرین نسخه درخواست های پایتون استفاده کنید.
برای این راهنما، باید پایتون را نصب کرده و بسته های زیر را نصب کنید.
$ pip install beautifulsoup4
$ pip install urllib
ماژول درخواست را وارد کنید
برای وارد کردن requests
کتابخانه در پایتون از کلمه کلیدی import استفاده می کند.
روش های درخواست پایتون
در زیر متدهای درخواست پایتون ذکر شده است:
- گرفتن: یک درخواست GET را به یک URL داده شده ارسال می کند. به عنوان مثال
get(url, parameters, arguments)
- پست: یک درخواست POST برای انتشار داده های مشخص شده به یک URL داده شده ارسال می کند. به عنوان مثال
post(url, data, json, arguments)
- قرار دادن: یک درخواست PUT برای جایگزینی داده ها در یک URL داده شده ارسال می کند. به عنوان مثال
put(url, data, arguments)
- پچ: یک درخواست PATCH برای ایجاد تغییرات جزئی در داده های یک URL داده شده ارسال می کند. به عنوان مثال
patch(url, data,
arguments
) - حذف: یک درخواست DELETE برای حذف داده ها از یک URL داده شده ارسال می کند. به عنوان مثال
delete(url, arguments)
- سر: یک درخواست HEAD را به یک URL داده شده ارسال می کند. این شبیه به درخواست GET است، اما بدون بدنه. به عنوان مثال
head(url, arguments)
- گزینه ها: گزینه های ارتباطی را برای یک URL مشخص مشخص کنید. به عنوان مثال
options(url)
- درخواست: شی درخواست را با تعیین روش انتخابی ایجاد می کند.
اکنون چند نمونه از متدهای درخواست در پایتون را مشاهده خواهیم کرد.
Python Get Requests
پیتون درخواست می کند get()
متد درخواست های GET را برای یک URL داده شده، مجموعه ای از پارامترها و آرگومان ها به سرور وب ارسال می کند. متد get() از این الگو پیروی می کند:
get(url, parameters, arguments)
نحوه ارسال درخواست دریافت در پایتون
برای ارسال درخواست های GET در پایتون، از get()
روش با URL که می خواهید اطلاعات را از آن بازیابی کنید.
import requests
url = 'https://crawler-test.com/'
response = requests.get(url)
print('URL: ', response.url)
print('Status code: ', response.status_code)
print('HTTP header: ', response.headers)
خروجی:
URL: https://crawler-test.com/
Status code: 200
HTTP header: {'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Sun, 03 Oct 2021 23:41:59 GMT', 'Server': 'nginx/1.10.3', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '8098', 'Connection': 'keep-alive'}
ارسال درخواست ها
پیتون درخواست می کند post()
متد درخواستهای POST را به سرور وب ارسال میکند تا دادههای مشخص شده را در یک URL مشخص منتشر کند. متد post() از این الگو پیروی می کند:
post(url, data, json, arguments)
نحوه ارسال درخواست پست در پایتون
برای ارسال درخواست های POST در پایتون، از post()
روش. URL و نمایش فرهنگ لغت دادههایی که قرار است منتشر شوند را به آن اضافه کنید data
پارامتر.
import requests
url = 'https://httpbin.org/post'
payload = {
'name':'Jean-Christophe',
'last_name':'Chouinard',
'website':'https://www.jcchouinard.com/'
}
response = requests.post(url, data = payload)
response.json()
خروجی:
{'args': {},
'data': '',
'files': {},
'form': {'last_name': 'Chouinard',
'name': 'Jean-Christophe',
'website': 'https://www.jcchouinard.com/'},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '85',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.24.0',
'X-Amzn-Trace-Id': 'Root=1-615a4271-417e9fff3c75f47f3af9fde2'},
'json': None,
'origin': '149.167.130.162',
'url': 'https://httpbin.org/post'}
روشها و ویژگیهای شی پاسخگوی پایتون
را شی python.response حاوی پاسخ سرور به درخواست HTTP است.
با استفاده از آن می توانید جزئیات شی Response را بررسی کنید help()
.
import requests
url = 'https://crawler-test.com/'
response = requests.get(url)
help(response)
در این آموزش به موارد زیر خواهیم پرداخت:
- متن، داده های توصیف شدهr: محتوای پاسخ، در یونیکد.
- محتوا، توصیفگر داده : محتوای پاسخ، بر حسب بایت.
- آدرس اینترنتی، صفت : آدرس درخواست
- وضعیت_کد، صفت : کد وضعیت بازگردانده شده توسط سرور
- سرصفحه ها صفت : هدرهای HTTP که توسط سرور برگردانده شده است
- تاریخ، صفت : لیستی از اشیاء پاسخ که تاریخچه درخواست را در خود دارند
- پیوندها، صفت : پیوندهای سرصفحه تجزیه شده پاسخ را در صورت وجود برمی گرداند.
- json، روش : در صورت وجود، محتوای کدگذاری شده با json پاسخ را برمیگرداند.
به روشها و ویژگیهای پاسخ دسترسی داشته باشید
پاسخ از درخواست یک شی است که در آن می توانید به متدها و ویژگی های آن دسترسی داشته باشید.
با استفاده از object.attribute
علامت گذاری و روش های استفاده از object.method()
نشانه گذاری.
import requests
url = 'http://archive.org/wayback/available?url=jcchouinard.com'
response = requests.get(url)
response.text # access response data atributes and descriptors
response.json() # access response methods
{'url': 'jcchouinard.com',
'archived_snapshots': {'closest': {'status': '200',
'available': True,
'url': 'http://web.archive.org/web/20210930032915/https://www.jcchouinard.com/',
'timestamp': '20210930032915'}}}
پاسخ پایتون را پردازش کنید
نحوه دسترسی به JSON درخواست های پایتون
در درخواست های پایتون، response.json()
متد اجازه می دهد تا به شی JSON پاسخ دسترسی پیدا کنید. اگر نتیجه درخواست با فرمت JSON نوشته نشده باشد، رمزگشای JSON آن را برمی گرداند requests.exceptions.JSONDecodeError
استثنا.
نحوه نمایش کد وضعیت درخواست پایتون
برای نشان دادن کد وضعیت بازگردانده شده توسط یک درخواست get() پایتون از status_code
ویژگی شی پاسخ.
import requests
url = 'https://crawler-test.com/'
r = requests.get(url)
r.status_code
# 200
چگونه HTML صفحه را با درخواست های پایتون دریافت کنیم
برای دریافت HTML یک صفحه وب با استفاده از درخواست های پایتون، یک درخواست GET به URL داده شده و text
ویژگی پاسخ Object برای دریافت HTML به عنوان Unicode و content
ویژگی برای دریافت HTML به عنوان بایت.
import requests
url = 'https://crawler-test.com/'
r = requests.get(url)
r.text # get content as a string
r.content # get content as bytes
برای نمایش هدرهای HTTP مورد استفاده در درخواست Python GET، از headers
ویژگی شی پاسخ.
import requests
url = 'https://crawler-test.com/'
r = requests.get(url)
r.headers
{'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Tue, 05 Oct 2021 04:23:27 GMT', 'Server': 'nginx/1.10.3', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '8099', 'Connection': 'keep-alive'}
نحوه نمایش ریدایرکت های HTTP با درخواست های پایتون
برای نشان دادن تغییر مسیرهای HTTP که در طول پایتون اتفاق افتاده است get()
درخواست کنید، استفاده کنید history
ویژگی شی پاسخ. ایجاد یک for
حلقه در response.history
و دریافت کنید .url
و .status_code
ویژگی های هر عنصر تاریخ
import requests
url = 'https://crawler-test.com/redirects/redirect_chain_allowed'
r = requests.get(url)
for redirect in r.history:
print(redirect.url, redirect.status_code)
print(r.url, r.status_code)
https://crawler-test.com/redirects/redirect_chain_allowed 301
https://crawler-test.com/redirects/redirect_chain_disallowed 301
https://crawler-test.com/redirects/redirect_target 200
HTML را با Request و BeautifulSoup تجزیه کنید
سوپ زیبا یک کتابخانه پایتون است که به شما امکان می دهد HTML و XML را تجزیه کنید تا داده ها را از آنها استخراج کنید. BeautifulSoup را می توان برای تجزیه HTML بازگشتی در شی Python Response استفاده کرد.
چگونه شی پاسخ پایتون HTML را برمی گرداند
شی Python Response، HTML را از URL ارسال شده در برمیگرداند get()
درخواست به صورت یونیکد یا بایت.
قالب متنی HTML برگشتی استخراج اطلاعات از آن را دشوار می کند.
from bs4 import BeautifulSoup
import requests
# Make the request
url = 'https://crawler-test.com/'
r = requests.get(url)
r.text[:500]
'<!DOCTYPE html>\n<html>\n <head>\n <title>Crawler Test Site</title>\n \n <meta content="en" HTTP-EQUIV="content-language"/>\n \n <link type="text/css" href="/css/app.css" rel="stylesheet"/>\n <link type="image/x-icon" href="/favicon.ico?r=1.6" rel="icon"/>\n <script type="text/javascript" src="/bower_components/jquery/jquery.min.js"></script>\n \n <meta content="Default description XIbwNE7SSUJciq0/Jyty" name="description"/>\n \n\n \n <link rel="alternate" media'
چگونه HTML را با BeautifulSoup تجزیه کنیم
برای تجزیه HTML برگشتی از یک درخواست get()، ویژگی answer.text را به کلاس BeautifulSoup کتابخانه bs4 منتقل کنید. از آرگومان ‘html.parser’ برای تجزیه HTML استفاده کنید.
# Parse the HTML
soup = BeautifulSoup(r.text, 'html.parser')
soup
این یک شی سوپ را برمی گرداند که می توان از آن برای استخراج داده ها از آن استفاده کرد.
<!DOCTYPE html>
<html>
<head>
<title>Crawler Test Site</title>
<meta content="en" http-equiv="content-language"/>
<link href="/css/app.css" rel="stylesheet" type="text/css"/>
...
</html>
اکنون که با BeautifulSoup تجزیه شده است، تفسیر خروجی آسانتر است.
شما می توانید برچسب را با استفاده از find()
یا find_all()
مواد و روش ها.
خروجی:
<title>Crawler Test Site</title>
خروجی:
[<meta content="en" http-equiv="content-language"/>,
<meta content="Default description XIbwNE7SSUJciq0/Jyty" name="description"/>,
<meta content="nositelinkssearchbox" name="google"/>,
<meta content="0H-EBys8zSFUxmeV9xynoMCMePTzkUEL_lXrm9C4a8A" name="google-site-verification"/>]
یا حتی ویژگی های تگ را انتخاب کنید.
soup.find('meta', attrs={'name':'description'})
خروجی:
<meta content="Default description XIbwNE7SSUJciq0/Jyty" name="description"/>
برای استخراج تگ های اصلی SEO از یک صفحه وب، از درخواست ها به همراه کتابخانه تجزیه BeautifulSoup استفاده کنید. متد find() شی سوپ به شما امکان می دهد تگ های HTML مانند H1، عنوان، توضیحات متا و سایر تگ های مهم SEO را استخراج کنید.
from bs4 import BeautifulSoup
import requests
# Make the request
url = 'https://crawler-test.com/'
r = requests.get(url)
# Parse the HTML
soup = BeautifulSoup(r.text, 'html.parser')
# Get the HTML tags
title = soup.find('title')
h1 = soup.find('h1')
description = soup.find('meta', attrs={'name':'description'})
meta_robots = soup.find('meta', attrs={'name':'robots'})
canonical = soup.find('link', {'rel': 'canonical'})
# Get the text from the HTML tags
title = title.get_text() if title else ''
h1 = h1.get_text() if h1 else ''
description = description['content'] if description else ''
meta_robots = meta_robots['content'] if meta_robots else ''
canonical = canonical['href'] if canonical else ''
# Print the tags
print('Title: ', title)
print('h1: ', h1)
print('description: ', description)
print('meta_robots: ', meta_robots)
print('canonical: ', canonical)
خروجی:
Title: Crawler Test Site
h1: Crawler Test Site
description: Default description XIbwNE7SSUJciq0/Jyty
meta_robots:
canonical:
from bs4 import BeautifulSoup
import requests
from urllib.parse import urljoin
url = 'https://crawler-test.com/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
links = []
for link in soup.find_all('a', href=True):
full_url = urljoin(url, link['href']) # join domain to path
links.append(full_url)
# Show 5 links
links[:5]
خروجی:
['https://crawler-test.com/',
'https://crawler-test.com/mobile/separate_desktop',
'https://crawler-test.com/mobile/desktop_with_AMP_as_mobile',
'https://crawler-test.com/mobile/separate_desktop_with_different_h1',
'https://crawler-test.com/mobile/separate_desktop_with_different_title']
هدر درخواست های HTTP برای ارسال اطلاعات اضافی با درخواست یا پاسخ HTTP، بدون تغییر رفتار درخواست استفاده می شود. سرصفحه های درخواست به سادگی به درخواست ارسال می شوند.
نحوه اضافه کردن Request Readers به درخواست Python
برای افزودن سرصفحه درخواست به درخواستهای GET و POST خود، یک فرهنگ لغت را به آن ارسال کنید headers
پارامتر از get()
و post()
مواد و روش ها.
import requests
url = 'http://httpbin.org/headers'
# Add a custom header to a GET request
r = requests.get(url, headers={"Content-Type":"text"})
# Add a custom header to a POST request
r = requests.post(url, headers={'Authorization' : 'Authorization': 'Bearer {access_token}'})
برای افزودن رمز دسترسی به درخواست پایتون، یک دیکشنری را به آن ارسال کنید params
پارامتر از get()
درخواست.
import requests
url = 'http://httpbin.org/headers'
access_token = {
'Authorization': 'Bearer {access_token}'
}
r = requests.get(url, headers=access_token)
r.json()
{'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Authorization': 'Bearer {access_token}',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.24.0',
'X-Amzn-Trace-Id': 'Root=1-615aa0b3-5c680dcb575d50f22e9565eb'}}
پارامترهای رشته پرس و جو
پارامترهای پرس و جو به شما امکان می دهند درخواست پایتون خود را با ارسال مقادیر به پارامترهای رشته پرس و جو سفارشی کنید.
اکثر درخواست های API نیاز به افزودن پارامترهای پرس و جو به درخواست دارند. این مورد در مورد API ویکی پدیا است.
نحوه اضافه کردن پارامترها به URL درخواست پایتون
برای افزودن پارامترهای رشته پرس و جو به درخواست های پایتون، یک فرهنگ لغت از پارامترها را به آن ارسال کنید params
بحث و جدل. در اینجا نشانی اینترنتی درخواست به نظر می رسد.
import requests
url = 'https://en.wikipedia.org/w/api.php'
params = {
'action': 'query',
'format': 'json',
'titles': 'Requests (software)',
'prop': 'extracts'
}
response = requests.get(url, params=params)
print('Request URL:', response.url)
# Result
Request URL: https://en.wikipedia.org/w/api.php?action=query&format=json&titles=Requests+%28software%29
data = response.json()
page = next(iter(data['query']['pages'].values()))
print(page['extract'][:73])
نحوه رسیدگی به خطاهای استثنا در درخواست ها
برای مقابله با استثناهایی که با استفاده از درخواستهای پایتون ایجاد میشوند، درخواست خود را با عبارت احاطه کنید try
و except
بیانیه.
import requests
url = 'bad url'
try:
r = requests.get(url)
except Exception as e:
print(f'There was an error: {e}')
There was an error: Invalid URL 'bad url': No schema supplied. Perhaps you meant http://bad url?
نحوه تغییر User-Agent در درخواست پایتون
برای تغییر user-agent درخواست پایتون خود، یک دیکشنری را به آن ارسال کنید headers
پارامتر از get()
درخواست.
import requests
url = 'https://www.reddit.com/r/python/top.json?limit=1&t=day'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
r = requests.get(url, headers=headers)
نحوه اضافه کردن Timeout به یک درخواست در پایتون
برای افزودن یک بازه زمانی به درخواست پایتون، یک مقدار شناور به آن ارسال کنید timeout
پارامتر از get()
درخواست.
import requests
url = 'http://httpbin.org/basic-auth/user/pass'
try:
r = requests.get(url, timeout=0.1)
except Exception as e:
print(e)
r.status_code
HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /basic-auth/user/pass (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fb03a7fa290>, 'Connection to httpbin.org timed out. (connect timeout=0.1)'))
401
نحوه استفاده از پروکسی با درخواست های پایتون
برای استفاده از پراکسی ها با درخواست های پایتون، یک دیکشنری را به آن ارسال کنید proxies
پارامتر از get()
درخواست.
import requests
url = 'https://crawler-test.com/'
proxies = {
'http': '128.199.237.57:8080'
}
r = requests.get(url, proxies=proxies)
میتوانید پروکسیهای رایگان را از proxyscrape پیدا کنید (ممکن است قبلاً مسدود شده باشند). با این حال، اگر شروع به افزایش مقیاس کنید، به یک سرویس پروکسی ممتاز نیاز خواهید داشت.
جلسات درخواست
درخواست ها Session()
شی برای ایجاد درخواست هایی با پارامترهایی استفاده می شود که در تمام درخواست ها در یک جلسه باقی می مانند.
نحوه استفاده از Requests Session Object
# Request Session
import requests
url = 'https://httpbin.org/headers'
# Create HTTP Headers
access_token = {
'Authorization': 'Bearer {access_token}'
}
with requests.Session() as session:
# Add HTTP Headers to the session
session.headers.update(access_token)
# Make First Request
r1 = session.get(url)
# Make Second Request
r2 = session.get(url)
# Show HTTP Headers
print('r1: ', r1.json()['headers']['Authorization'])
print('r2: ', r2.json()['headers']['Authorization'])
r1: Bearer {access_token}
r2: Bearer {access_token}
چگونه درخواست های ناموفق پایتون را دوباره امتحان کنیم
import requests
from requests.adapters import HTTPAdapter, Retry
s = requests.Session()
retries = Retry(total=3,
backoff_factor=0.1,
status_forcelist=[500,502,503,504])
s.mount('http://', HTTPAdapter(max_retries=retries))
s.mount('https://', HTTPAdapter(max_retries=retries))
try:
r = s.get('https://httpstat.us/500')
except Exception as e:
print(type(e))
print(e)
سایر روش های HTTP
در بالای GET
و POST
درخواست، کتابخانه Python اجازه می دهد تا از سایر روش های محبوب HTTP مانند HEAD
، PUT
، DELETE
، PATCH
و OPTIONS
.
requests.head('https://httpbin.org/get') # Get request HTTP header
requests.put('https://httpbin.org/put', data={'key':'value'}) # Create new resource with payload
requests.delete('https://httpbin.org/delete') # Delete resource
requests.patch('https://httpbin.org/patch', data={'key':'value'}) # Partial modification
requests.options('https://httpbin.org/get') # Specify communication options
کتابخانه درخواست های پایتون چیست؟
کتابخانه درخواست های پایتون که به درخواست های پایتون نیز معروف است، یک کتابخانه HTTP است که به کاربران اجازه می دهد درخواست های HTTP را با استفاده از پایتون ارسال کنند. شعار آن “Python HTTP for Humans” به خوبی نشان دهنده سادگی بسته است.
آموزش با استفاده از Requests
سایر آموزش های خراش دادن وب
حقایقی در مورد درخواست های پایتون
نویسنده درخواست های پایتون | کنت رایتز |
زبان درخواست پایتون | پایتون |
روش های درخواست پایتون | GET, POST, PUT, DELETE, PATCH, OPTIONs, HEAD |
درخواست انتشار پایتون | 2011-02-14 |
روش های درخواست
close()
: اتصال به سرور را ببندیدiter_content()
: روی پاسخ تکرار کنیدiter_lines()
: روی هر خط در پاسخ تکرار کنیدjson()
: شی JSON پاسخ را برگردانید. اگر JSON نباشد، یک خطا برمیگرداندraise_for_status()
: در صورت بروز خطا، یک شی HTTPError را برگردانید.
درخواست خواص
- apparent_encoding: رمزگذاری ظاهری را برگردانید
- محتوا: محتوای پاسخ را بر حسب بایت برگردانید
- کوکی ها: نشان دادن شی حاوی کوکی های بازگردانده شده توسط سرور
- سپری شده: زمان سپری شده بین ارسال درخواست در مقابل بازگشت پاسخ
- رمزگذاری: نمایش رمزگذاری مورد استفاده برای رمزگشایی
r.text
- headers: فرهنگ لغت سرصفحه پاسخ را برگردانید
- history: فهرستی از اشیاء پاسخ حاوی تاریخچه درخواست را برگردانید
- is_permanent_redirect: نشان می دهد که آیا URL به طور دائم هدایت می شود
- is_redirect: نشان می دهد که آیا URL تغییر مسیر داده شده است
- پیوندها: هدر HTTP پیوندها را برگردانید
- next: یک شی را برای درخواست بعدی در یک تغییر مسیر برگردانید
- ok: نشان دهید اگر کد وضعیت کمتر از 400 باشد
- دلیل: توضیح متنی کد وضعیت
- درخواست: نمایش شی درخواست درخواست ارسال شده برای یک پاسخ معین
- status_code: نشان دادن کد وضعیت بازگردانده شده توسط سرور
- متن: محتوای پاسخ را به صورت یونیکد برگردانید
- url: نشانی اینترنتی پاسخ را نشان دهید
چه خبر بعدی
نتیجه
اگر به دنبال جایگزینی برای کتابخانه درخواست ها هستید، ممکن است به کتابخانه requests-HTML علاقه مند باشید که برخی از گزینه های تجزیه داخلی HTML را ارائه می دهد.
این کتابخانه نه تنها برای اسکرپینگ وب مفید است، بلکه برای توسعه وب و هر تلاش دیگری که از API استفاده می کند نیز مفید است.
اکنون مقدمه کتابخانه درخواستهای پایتون را به پایان میرسانیم.
استراتژیست سئو در Tripadvisor، Seek سابق (ملبورن، استرالیا). متخصص در سئو فنی. در تلاش برای سئوی برنامهریزی شده برای سازمانهای بزرگ از طریق استفاده از پایتون، R و یادگیری ماشین.