Как да изстъргвате уебсайтове с Python и BeautifulSoup

В Интернет има повече информация, отколкото всеки човек може да поеме през живота си. Това, от което се нуждаете, е не достъп до тази информация, а мащабируем начин за нейното събиране, организиране и анализ.

Имате нужда от изстъргване в мрежата.

Уеб изстъргването автоматично извлича данни и ги представя във формат, който лесно можете да осмислите. В този урок ще се съсредоточим върху приложенията му на финансовия пазар, но уеб изстъргването може да се използва в най-различни ситуации.

Ако сте запален инвеститор, получаването на цените за затваряне всеки ден може да ви пречи, особено когато информацията, от която се нуждаете, се намира в няколко уеб страници. Ще улесним извличането на данни, като изградим уеб скрепер за автоматично извличане на индекси на акции от Интернет.

Приготвяме се да започнем

Ще използваме Python като нашия език за изстъргване, заедно с проста и мощна библиотека BeautifulSoup.

  • За потребители на Mac Python е предварително инсталиран в OS X. Отворете терминала и въведете python --version. Трябва да видите, че вашата версия на python е 2.7.x.
  • За потребители на Windows, моля, инсталирайте Python чрез официалния уебсайт.

След това трябва да получим библиотеката BeautifulSoup, използвайки pipинструмент за управление на пакети за Python.

В терминала напишете:

easy_install pip pip install BeautifulSoup4

Забележка : Ако не успеете да изпълните горния команден ред, опитайте да добавите sudoпред всеки ред.

Основите

Преди да започнем да скачаме в кода, нека разберем основите на HTML и някои правила за изстъргване.

HTML тагове

Ако вече разбирате HTML тагове, не се колебайте да пропуснете тази част.

First Scraping

Hello World

Това е основният синтаксис на HTML уеб страница. Всеки обслужва блок вътре в уеб страницата:

1 .: HTML документите трябва да започват с декларация за тип.

2. HTML документът се съдържа между и .

3. Декларацията за мета и скриптове на HTML документа е между и .

4. Видимата част от HTML документа е между и тагове.

5. Заглавията на заглавията се дефинират с

Original text


през

етикети.

6. Параграфите се дефинират с

Other useful tags include for hyperlinks,

for tables, for table rows, and
за колони на таблица.

Също така, HTML таговете понякога идват с idили classатрибути. В idатрибут определя уникален идентификационен номер за HTML тагове и стойността трябва да бъде уникален в рамките на документа за HTML. В classатрибут се използва за определяне равни стилове за HTML тагове с един и същи клас. Можем да използваме тези идентификатори и класове, за да ни помогнат да намерим данните, които искаме.

За повече информация относно HTML таговете, идентификатора и класа, моля, вижте уроци за W3Schools.

Правила за изстъргване

  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/

This article was originally published on Altitude Labs’ blog and was written by our software engineer, Leonard Mok. Altitude Labs is a software agency that specializes in personalized, mobile-first React apps.