Jak zbudować podstawowy robot indeksujący do pobierania informacji ze strony internetowej?

Jak zbudować podstawowy robot indeksujący do pobierania informacji ze strony internetowej?

Programy, które odczytują informacje ze stron internetowych lub robotów sieciowych, mają wszelkiego rodzaju przydatne aplikacje. Możesz wyszukiwać informacje giełdowe, wyniki sportowe, tekst z konta na Twitterze lub pobierać ceny z witryn sklepowych.





Pisanie tych programów do indeksowania sieci jest łatwiejsze, niż mogłoby się wydawać. Python ma świetną bibliotekę do pisania skryptów, które wydobywają informacje ze stron internetowych. Przyjrzyjmy się, jak utworzyć robota internetowego za pomocą Scrapy.





Instalowanie Scrapy

Złośliwy to biblioteka Pythona, która została stworzona, aby przeszukiwać sieć i budować roboty sieciowe. Jest szybki, prosty i może poruszać się po wielu stronach internetowych bez większego wysiłku.





Scrapy jest dostępny za pośrednictwem biblioteki Pip Installs Python (PIP), oto przypomnienie na jak zainstalować PIP na Windows, Mac i Linux .

Korzystanie ze środowiska wirtualnego Pythona jest preferowane, ponieważ pozwoli ci zainstalować Scrapy w wirtualnym katalogu, który pozostawia twoje pliki systemowe w spokoju. Dokumentacja Scrapy zaleca zrobienie tego, aby uzyskać najlepsze wyniki.



Utwórz katalog i zainicjuj środowisko wirtualne.

gdzie kupić używane części komputerowe
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

Możesz teraz zainstalować Scrapy w tym katalogu za pomocą polecenia PIP.





pip install scrapy

Szybkie sprawdzenie, czy program Scrapy jest prawidłowo zainstalowany

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...

Jak zbudować robota internetowego

Teraz, gdy środowisko jest gotowe, możesz rozpocząć tworzenie robota indeksującego. Zbierzmy kilka informacji ze strony Wikipedii o bateriach: https://en.wikipedia.org/wiki/Battery_(energia elektryczna) .





Pierwszym krokiem do napisania crawlera jest zdefiniowanie klasy Pythona, która wywodzi się z Scrapy.Pająk . Daje to dostęp do wszystkich funkcji i funkcji Scrapy. Nazwijmy tę klasę pająk1 .

Klasa pająka potrzebuje kilku informacji:

  • do Nazwa do identyfikacji pająka
  • do start_urls zmienna zawierająca listę adresów URL do indeksowania (adres URL Wikipedii będzie przykładem w tym samouczku)
  • do analizować() metoda, która służy do przetwarzania strony internetowej w celu wyodrębnienia informacji
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

Szybki test, aby upewnić się, że wszystko działa poprawnie.

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

Wyłączanie logowania

Uruchamianie Scrapy z tymi zajęciami powoduje wydrukowanie informacji z dziennika, które w tej chwili nie pomogą. Uprośćmy to, usuwając nadmiarowe informacje z dziennika. Użyć ostrzeżenie oświadczenie, dodając kod na początku pliku.

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

Teraz po ponownym uruchomieniu skryptu informacje dziennika nie zostaną wydrukowane.

Korzystanie z Inspektora Chrome

Wszystko na stronie internetowej jest przechowywane w elementach HTML. Elementy są ułożone w Document Object Model (DOM). Zrozumienie DOM ma kluczowe znaczenie dla pełnego wykorzystania możliwości robota. Robot indeksujący przeszukuje wszystkie elementy HTML na stronie, aby znaleźć informacje, dlatego ważne jest, aby wiedzieć, jak są one uporządkowane.

Google Chrome zawiera narzędzia, które pomagają szybciej znajdować elementy HTML. Za pomocą inspektora możesz zlokalizować kod HTML dowolnego elementu widocznego na stronie internetowej.

  • Przejdź do strony w Chrome
  • Umieść kursor myszy na elemencie, który chcesz wyświetlić
  • Kliknij prawym przyciskiem myszy i wybierz Sprawdzać z menu

Te kroki otworzą konsolę programisty za pomocą Elementy wybrana karta. Na dole konsoli zobaczysz drzewo elementów. To drzewo jest sposobem, w jaki uzyskasz informacje o swoim skrypcie.

Wyodrębnianie tytułu

Niech skrypt wykona dla nas trochę pracy; Proste indeksowanie, aby uzyskać tekst tytułu strony internetowej.

Uruchom skrypt, dodając trochę kodu do analizować() metoda, która wyodrębnia tytuł.

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

ten odpowiedź argument obsługuje metodę o nazwie CSS() który wybiera elementy ze strony przy użyciu podanej przez Ciebie lokalizacji.

W tym przykładzie element to h1.pierwszy nagłówek . Dodawanie

::text

do skryptu jest to, co daje tekstową zawartość elementu. Wreszcie wyciąg() metoda zwraca wybrany element.

Uruchomienie tego skryptu w Scrapy drukuje tytuł w formie tekstowej.

[u'Battery (electricity)']

Znajdowanie opisu

Teraz, gdy opracowaliśmy tekst tytułowy, zróbmy więcej ze skryptem. Robot znajdzie pierwszy akapit po tytule i wyodrębni te informacje.

Oto drzewo elementów w Konsoli programisty Chrome:

telefon utknął na logo Apple
div#mw-content-text>div>p

Prawa strzałka (>) wskazuje relację rodzic-dziecko między elementami.

Ta lokalizacja zwróci wszystkie P elementy dopasowane, w tym cały opis. Aby zdobyć pierwszy P element możesz napisać ten kod:

response.css('div#mw-content-text>div>p')[0]

Podobnie jak w tytule, dodajesz ekstraktor CSS

::text

aby uzyskać zawartość tekstową elementu.

response.css('div#mw-content-text>div>p')[0].css('::text')

Ostatnie wyrażenie używa wyciąg() aby zwrócić listę. Możesz użyć Pythona Przystąp() funkcja dołączenia do listy po zakończeniu indeksowania.

def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

Rezultatem jest pierwszy akapit tekstu!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

Zbieranie danych JSON

Scrapy potrafi wyodrębnić informacje w formie tekstowej, co jest przydatne. Scrapy umożliwia również przeglądanie danych JavaScript Object Notation (JSON). JSON to zgrabny sposób organizowania informacji i jest szeroko stosowany w tworzeniu stron internetowych. JSON działa całkiem nieźle z Pythonem także.

Kiedy musisz zbierać dane w formacie JSON, możesz użyć dawać oświadczenie wbudowane w Scrapy.

Oto nowa wersja skryptu wykorzystująca instrukcję zysku. Zamiast pobierać pierwszy element p w formacie tekstowym, pobierze wszystkie elementy p i zorganizuje je w formacie JSON.

jak grać włącz w tv
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

Możesz teraz uruchomić pająka, określając wyjściowy plik JSON:

scrapy runspider spider3.py -o joe.json

Skrypt wypisze teraz wszystkie elementy p.

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

Skrobanie wielu elementów

Jak dotąd robot indeksujący zeskrobał tytuł i jeden rodzaj elementu ze strony. Scrapy może również wydobywać informacje z różnych typów elementów w jednym skrypcie.

Wyodrębnijmy na weekend topowe hity IMDb Box Office. Ta informacja jest pobierana z http://www.imdb.com/chart/boxoffice , w tabeli z wierszami dla każdej metryki.

ten analizować() metoda może wyodrębnić więcej niż jedno pole z wiersza. Korzystając z Narzędzi dla programistów Chrome, możesz znaleźć elementy zagnieżdżone w tabeli.

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

ten obraz selektor określa, że obrazek jest potomkiem td.plakatKolumna . Aby wyodrębnić właściwy atrybut, użyj wyrażenia |_+_|.

Uruchomienie pająka zwraca JSON:

::attr(src)

Więcej skrobaków internetowych i botów

Scrapy to szczegółowa biblioteka, która może wykonać prawie każdy rodzaj indeksowania sieci, o który go poprosisz. Jeśli chodzi o wyszukiwanie informacji w elementach HTML, w połączeniu ze wsparciem Pythona, trudno go pobić. Niezależnie od tego, czy tworzysz robota indeksującego, czy uczysz się podstaw web scrapingu, jedynym ograniczeniem jest to, ile chcesz się nauczyć.

Jeśli szukasz więcej sposobów na tworzenie robotów lub botów, możesz spróbować buduj boty na Twitterze i Instagramie za pomocą Pythona . Python może tworzyć niesamowite rzeczy w tworzeniu stron internetowych , więc warto wyjść poza roboty sieciowe podczas odkrywania tego języka.

Udział Udział Ćwierkać E-mail 15 poleceń wiersza polecenia systemu Windows (CMD), które musisz znać

Wiersz poleceń jest nadal potężnym narzędziem systemu Windows. Oto najbardziej przydatne polecenia CMD, które każdy użytkownik systemu Windows musi znać.

Czytaj dalej
Powiązane tematy
  • Programowanie
  • Narzędzia dla webmasterów
  • Programowanie
  • Pyton
  • Poradniki kodowania
  • Roboty indeksujące
O autorze Antoniego Granta(40 opublikowanych artykułów)

Anthony Grant jest niezależnym pisarzem zajmującym się programowaniem i oprogramowaniem. Jest specjalistą w dziedzinie informatyki, zajmuje się programowaniem, Excelem, oprogramowaniem i technologią.

Więcej od Anthony'ego Granta

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować