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

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

Преглед на методите за събиране на данни

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

Ръчното въвеждане на данни отнема време и е податливо на човешки грешки, особено при събиране на данни в голям мащаб. Въпреки това е полезно за събиране на данни в малък мащаб и когато данните не са достъпни чрез други средства.

instagram viewer

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

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

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

Избор на уеб скрапинг за събиране на данни

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

Идентифициране на източника на данни

Първата стъпка в уеб скрапирането е идентифицирането на източника на данни. Това е уебсайтът, който съдържа данните, които искате да изчерпите. Когато избирате източник на данни, уверете се, че сте в съответствие с условията на услугата на източника. Тази статия ще използва IMDb (Internet Movie Database) като източник на данни.

Настройване на вашата среда

Настройте виртуална среда. След това изпълнете следната команда, за да инсталирате необходимите библиотеки.

pip инсталационни заявки beautifulsoup4 pandas

Вие ще използвате заявки библиотека за правене на HTTP заявки. красива супа4 за анализиране на HTML съдържание и извличане на данни от уеб страници. Накрая ще използвате панди да манипулират и анализират данни.

Пълният изходен код е достъпен в a GitHub хранилище.

Писане на скрипта за уеб скрапиране

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

импортиране заявки
от bs4 импортиране Красива супа
импортиране време
импортиране панди като пд
импортиране повторно

The време и повторно модулите са част от стандартната библиотека на Python. Следователно не изисквайте отделни инсталации.

време ще добави закъснения към процеса на изстъргване, докато повторно ще се занимава с регулярни изрази.

Ти ще използвайте Beautiful Soup, за да изстържете целевия уебсайт.

Създайте функция, която ще изпрати HTTP GET заявка до вашия целеви URL адрес. След това трябва да извлече съдържанието на отговора и да създаде a Красива супа обект от HTML съдържанието.

дефget_soup(url, параметри=Няма, заглавки=Няма):
отговор = requests.get (url, params=params, headers=headers)
супа = Красива супа (response.content, "html.parser")
връщане супа

Следващата стъпка е да извлечете информация от Красива супа обект.

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

След това щракнете с десния бутон върху уеб страницата и изберете Инспектирайте от контекстното меню. Това ще отвори инструментите за програмисти на браузъра.

В HTML кода на уеб страницата потърсете елементи, които съдържат данните, които искате да изчерпите. Обърнете внимание на HTML таговете, класовете и атрибутите, свързани с данните, от които се нуждаете. Ще ги използвате, за да създадете селектори за извличане на данните с помощта на BeautifulSoup. На екранната снимка по-горе можете да видите, че заглавието на филма е вътре в lister-item-header клас. Проверете всяка функция, която искате да извлечете.

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

дефизвличане на_данни_за_филм(филм):
заглавие = movie.find("h3", клас_="lister-item-header").намирам("а").текст
рейтинг = movie.find("div", клас_="оценки-imdb-рейтинг").силен.текст
описание = movie.find("div", клас_="lister-item-content").намери_всички("p")[1].text.strip()
genre_element = movie.find("педя", клас_="жанр")
жанр = genre_element.text.strip() ако genre_element другоНито един
дата_на_издаване = movie.find("педя", клас_="lister-item-year text-muted unbold").text.strip()
director_stars = movie.find("p", клас_="заглушен текст").намери_всички("а")
директори = [person.text за човек в режисьор_звезди [:-1]]
звезди = [person.text за човек в режисьор_звезди[-1:]]
филмови_данни = {
"Заглавие": заглавие,
"Оценка": рейтинг,
"Описание": описание,
"Жанр": жанр,
"Дата на излизане": дата на излизане,
"Режисьори": режисьори,
"звезди": звезди
}
връщане филмови_данни

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

дефscrape_imdb_movies(година, ограничение):
базов_url = " https://www.imdb.com/search/title"
заглавки = {„Приемане на език“: "en-US, en; q=0,9"}
филми = []
начало = 1
докато len (филми) < ограничение:
параметри = {
"дата на излизане": година,
"вид": "брой_гласове, desc",
"старт": начало
}
soup = get_soup (base_url, params=params, headers=headers)
movie_list = soup.find_all("div", клас_="lister-item mode-advanced")
ако len (списък_с_филми) == 0:
прекъсвам
за филм в списък_с_филми:
movie_data = извличане на_movie_data (филм)
movies.append (movie_data)
ако len (филми) >= ограничение:
прекъсвам
начало += 50# IMDb показва 50 филма на страница
time.sleep(1) # Добавете забавяне, за да избегнете претоварване на сървъра
връщане филми

След това се обадете на def scrape_imdb_movies да направим остъргването.

# Изтрийте 1000 филма, издадени през 2023 г. (или колкото са налични)
филми = scrape_imdb_movies(2023, 1000)

Вече сте изкопали данни.

Следващата стъпка е да създадете набор от данни от тези данни.

Създаване на набор от данни от сканираните данни

Създайте DataFrame с помощта на Pandas от сканираните данни.

df = pd. DataFrame (филми)

След това извършете предварителна обработка и почистване на данните. В този случай премахнете редове с липсващи стойности. След това извлечете годината от датата на издаване и я преобразувайте в числова. Премахнете ненужните колони. Преобразуване на Рейтинг колона към числова. Накрая премахнете неазбучните знаци от Заглавие колона.

df = df.dropna()
df[„Година на издаване“] = df['Дата на излизане'].str.extract(r'(\d{4})')
df[„Година на издаване“] = pd.to_numeric (df[„Година на издаване“],
грешки="принуждавам").astype("Int64")
df = df.drop(['Дата на излизане'], ос=1)
df["Рейтинг"] = pd.to_numeric (df["Рейтинг"], грешки="принуждавам")
df['Заглавие'] = df['Заглавие'].Приложи(ламбда x: re.sub(r'\W+', ' ', х))

Съхранявайте данните във файл, за да ги използвате по-късно във вашия проект.

df.to_csv("imdb_movies_dataset.csv", индекс=Невярно)

Накрая отпечатайте първите пет реда от вашия набор от данни, за да видите как изглежда.

df.head()

Резултатът е както е показано на екранната снимка по-долу:

Вече имате набор от данни, получен чрез уеб скрапинг.

Уеб скрапинг с помощта на други библиотеки на Python

Beautiful Soup не е единствената библиотека на Python, която можете да използвате за уеб скрапинг. Има и други библиотеки. Всеки със своите предимства и ограничения. Проучете ги, за да разберете кой най-добре отговаря на вашия случай на употреба.