كيفية كشط المواقع الإلكترونية باستخدام Python و BeautifulSoup

هناك معلومات على الإنترنت أكثر مما يمكن لأي إنسان أن يستوعبه في حياته. ما تحتاجه ليس الوصول إلى تلك المعلومات ، ولكن طريقة قابلة للتطوير لجمعها وتنظيمها وتحليلها.

أنت بحاجة إلى تجريف الويب.

يستخرج تجريف الويب البيانات تلقائيًا ويعرضها بتنسيق يمكنك فهمه بسهولة. في هذا البرنامج التعليمي ، سنركز على تطبيقاته في السوق المالية ، ولكن يمكن استخدام تجريف الويب في مجموعة متنوعة من المواقف.

إذا كنت مستثمرًا متعطشًا ، فإن الحصول على أسعار الإغلاق كل يوم يمكن أن يكون مزعجًا ، خاصةً عندما تكون المعلومات التي تحتاجها موجودة عبر العديد من صفحات الويب. سنجعل عملية استخراج البيانات أسهل من خلال إنشاء أداة مكشطة ويب لاسترداد مؤشرات الأسهم تلقائيًا من الإنترنت.

ابدء

سنستخدم Python كلغة تجريف لدينا ، جنبًا إلى جنب مع مكتبة بسيطة وقوية ، BeautifulSoup.

  • لمستخدمي Mac ، تم تثبيت Python مسبقًا في OS X. افتح Terminal واكتب python --version. يجب أن ترى أن إصدار Python الخاص بك هو 2.7.x.
  • لمستخدمي Windows ، يرجى تثبيت Python من خلال الموقع الرسمي.

بعد ذلك ، نحتاج إلى الحصول على مكتبة BeautifulSoup باستخدام pipأداة إدارة الحزم لبايثون.

في المحطة ، اكتب:

easy_install pip pip install BeautifulSoup4

ملاحظة : إذا فشلت في تنفيذ سطر الأوامر أعلاه ، فحاول الإضافة sudoأمام كل سطر.

أساسيات

قبل أن نبدأ القفز إلى الكود ، دعونا نفهم أساسيات HTML وبعض قواعد الكشط.

علامات HTML

إذا كنت تفهم بالفعل علامات HTML ، فلا تتردد في تخطي هذا الجزء.

First Scraping

Hello World

هذا هو التركيب الأساسي لصفحة ويب HTML. يخدم كل منها كتلة داخل صفحة الويب:

1 .: يجب أن تبدأ مستندات HTML بإعلان النوع.

2. وثيقة HTML واردة بين و .

3. إعلان التعريف والنصوص لمستند HTML بين و .

4. الجزء المرئي من وثيقة HTML هو بين و العلامات.

5. يتم تعريف عناوين العنوان بامتداد

عبر

العلامات.

6. يتم تعريف الفقرات مع

Other useful tags include for hyperlinks,

for tables, for table rows, and
لأعمدة الجدول.

أيضًا ، تأتي علامات HTML أحيانًا مع idأو classسمات. و idتحدد السمة معرف فريد لعلامة HTML ويجب أن تكون قيمة فريدة من نوعها ضمن وثيقة HTML. و classيستخدم السمة لتعريف أنماط متساوية للعلامات HTML مع نفس الفئة. يمكننا الاستفادة من هذه المعرفات والفئات لمساعدتنا في تحديد البيانات التي نريدها.

لمزيد من المعلومات حول علامات HTML والمعرف والفئة ، يرجى الرجوع إلى W3Schools Tutorials.

قواعد القشط

  1. يجب عليك التحقق من شروط وأحكام موقع الويب قبل التخلص منه. احرص على قراءة العبارات المتعلقة بالاستخدام القانوني للبيانات. عادة ، لا ينبغي استخدام البيانات التي تكشطها لأغراض تجارية.
  2. لا تطلب بيانات من موقع الويب بقوة مفرطة مع برنامجك (المعروف أيضًا باسم البريد العشوائي) ، حيث قد يؤدي ذلك إلى كسر موقع الويب. تأكد من أن برنامجك يتصرف بطريقة معقولة (أي يتصرف مثل الإنسان). يعد طلب صفحة ويب واحدة في الثانية ممارسة جيدة.
  3. قد يتغير تخطيط موقع الويب من وقت لآخر ، لذا تأكد من زيارة الموقع مرة أخرى وإعادة كتابة التعليمات البرمجية حسب الحاجة

فحص الصفحة

لنأخذ صفحة واحدة من موقع Bloomberg Quote كمثال.

بصفتنا شخصًا يتابع سوق الأسهم ، نود الحصول على اسم المؤشر (S&P 500) وسعره من هذه الصفحة. أولاً ، انقر بزر الماوس الأيمن وافتح فاحص المتصفح لتفقد صفحة الويب.

حاول تحريك المؤشر فوق السعر وستتمكن من رؤية مربع أزرق يحيط به. إذا قمت بالنقر فوقه ، فسيتم تحديد HTML ذي الصلة في وحدة تحكم المتصفح.

من النتيجة ، يمكننا أن نرى أن السعر موجود داخل مستويات قليلة من علامات HTML ، وهي → → .

وبالمثل ، إذا قمت بالمرور فوق الاسم "مؤشر S&P 500" ، فسيكون في الداخل و

.

الآن نحن نعرف الموقع الفريد لبياناتنا بمساعدة classالعلامات.

اقفز إلى الكود

الآن بعد أن عرفنا مكان بياناتنا ، يمكننا البدء في ترميز مكشطة الويب الخاصة بنا. افتح محرر النصوص الآن!

أولاً ، نحتاج إلى استيراد جميع المكتبات التي سنستخدمها.

# import libraries import urllib2 from bs4 import BeautifulSoup

بعد ذلك ، قم بتعريف متغير لعنوان url الخاص بالصفحة.

# specify the url quote_page = ‘//www.bloomberg.com/quote/SPX:IND'

بعد ذلك ، استخدم Python urllib2 للحصول على صفحة HTML الخاصة بعنوان url معلنة.

# query the website and return the html to the variable ‘page’ page = urllib2.urlopen(quote_page)

أخيرًا ، قم بتحليل الصفحة إلى تنسيق BeautifulSoup حتى نتمكن من استخدام BeautifulSoup للعمل عليها.

# parse the html using beautiful soup and store in variable `soup` soup = BeautifulSoup(page, ‘html.parser’)

Now we have a variable, soup, containing the HTML of the page. Here’s where we can start coding the part that extracts the data.

Remember the unique layers of our data? BeautifulSoup can help us get into these layers and extract the content with find(). In this case, since the HTML class name is unique on this page, we can simply query .

# Take out the of name and get its value name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

After we have the tag, we can get the data by getting its text.

name = name_box.text.strip() # strip() is used to remove starting and trailing print name

Similarly, we can get the price too.

# get the index price price_box = soup.find(‘div’, attrs={‘class’:’price’}) price = price_box.text print price

When you run the program, you should be able to see that it prints out the current price of the S&P 500 Index.

Export to Excel CSV

Now that we have the data, it is time to save it. The Excel Comma Separated Format is a nice choice. It can be opened in Excel so you can see the data and process it easily.

But first, we have to import the Python csv module and the datetime module to get the record date. Insert these lines to your code in the import section.

import csv from datetime import datetime

At the bottom of your code, add the code for writing data to a csv file.

# open a csv file with append, so old data will not be erased with open(‘index.csv’, ‘a’) as csv_file: writer = csv.writer(csv_file) writer.writerow([name, price, datetime.now()])

Now if you run your program, you should able to export an index.csv file, which you can then open with Excel, where you should see a line of data.

So if you run this program everyday, you will be able to easily get the S&P 500 Index price without rummaging through the website!

Going Further (Advanced uses)

Multiple Indices

So scraping one index is not enough for you, right? We can try to extract multiple indices at the same time.

First, modify the quote_page into an array of URLs.

quote_page = [‘//www.bloomberg.com/quote/SPX:IND', ‘//www.bloomberg.com/quote/CCMP:IND']

Then we change the data extraction code into a for loop, which will process the URLs one by one and store all the data into a variable data in tuples.

# for loop data = [] for pg in quote_page: # query the website and return the html to the variable ‘page’ page = urllib2.urlopen(pg) # parse the html using beautiful soap and store in variable `soup` soup = BeautifulSoup(page, ‘html.parser’) # Take out the of name and get its value name_box = soup.find(‘h1’, attrs={‘class’: ‘name’}) name = name_box.text.strip() # strip() is used to remove starting and trailing # get the index price price_box = soup.find(‘div’, attrs={‘class’:’price’}) price = price_box.text # save the data in tuple data.append((name, price))

Also, modify the saving section to save data row by row.

# open a csv file with append, so old data will not be erased with open(‘index.csv’, ‘a’) as csv_file: writer = csv.writer(csv_file) # The for loop for name, price in data: writer.writerow([name, price, datetime.now()])

Rerun the program and you should be able to extract two indices at the same time!

Advanced Scraping Techniques

BeautifulSoup is simple and great for small-scale web scraping. But if you are interested in scraping data at a larger scale, you should consider using these other alternatives:

  1. Scrapy, a powerful python scraping framework
  2. Try to integrate your code with some public APIs. The efficiency of data retrieval is much higher than scraping webpages. For example, take a look at Facebook Graph API, which can help you get hidden data which is not shown on Facebook webpages.
  3. Consider using a database backend like MySQL to store your data when it gets too large.

Adopt the DRY Method

DRY stands for “Don’t Repeat Yourself”, try to automate your everyday tasks like this person. Some other fun projects to consider might be keeping track of your Facebook friends’ active time (with their consent of course), or grabbing a list of topics in a forum and trying out natural language processing (which is a hot topic for Artificial Intelligence right now)!

If you have any questions, please feel free to leave a comment below.

References

//www.gregreda.com/2013/03/03/web-scraping-101-with-python/

//www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/

تم نشر هذه المقالة في الأصل على مدونة Altitude Labs وكتبها مهندس البرمجيات ليونارد موك. Altitude Labs هي وكالة برمجيات متخصصة في تطبيقات React المخصصة للهواتف المحمولة.