Как да създадете основен уеб робот за изтегляне на информация от уебсайт

Как да създадете основен уеб робот за изтегляне на информация от уебсайт

Програмите, които четат информация от уебсайтове или уеб ролери, имат всякакви полезни приложения. Можете да изстържете информация за акции, спортни резултати, текст от акаунт в Twitter или да изтеглите цени от уебсайтове за пазаруване.





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





Инсталиране на Scrapy

Скрапия е библиотека на Python, създадена за изстъргване на мрежата и създаване на уеб ролери. Той е бърз, прост и може да се движи през множество уеб страници без много усилия.





Scrapy е достъпен чрез библиотеката Pip Installs Python (PIP), ето опресняване как да инсталирате PIP на Windows, Mac и Linux .

Използването на виртуална среда на Python е за предпочитане, тъй като ще ви позволи да инсталирате Scrapy във виртуална директория, която оставя системните ви файлове на мира. Документацията на Scrapy препоръчва да направите това, за да получите най -добри резултати.



Създайте директория и инициализирайте виртуална среда.

стоп код дефектен хардуер повредена страница
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

Вече можете да инсталирате Scrapy в тази директория с помощта на PIP команда.





pip install scrapy

Бърза проверка, за да се уверите, че Scrapy е инсталиран правилно

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)
...

Как да изградим уеб робот

Сега, когато средата е готова, можете да започнете да изграждате уеб ролера. Нека извлечем малко информация от страницата на Wikipedia за батериите: https://en.wikipedia.org/wiki/Battery_(електричество) .





Първата стъпка за писане на робот е дефинирането на клас Python, който се простира от Паяк . Това ви дава достъп до всички функции и функции в Scrapy. Нека да наречем този клас паяк 1 .

Класът паяк се нуждае от няколко части информация:

  • да се име за идентифициране на паяка
  • да се start_urls променлива, съдържаща списък с URL адреси, от които да обхождате (URL адресът на Wikipedia ще бъде пример в този урок)
  • да се разбор () метод, който се използва за обработка на уеб страницата за извличане на информация
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

Бърз тест, за да се уверите, че всичко работи правилно.

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',
...

Изключване на регистрирането

Изпълнението на Scrapy с този клас отпечатва регистрационна информация, която няма да ви помогне в момента. Нека го направим просто, като премахнем тази излишна регистрационна информация. Използвай внимание изявление чрез добавяне на код в началото на файла.

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

Сега, когато стартирате скрипта отново, информацията от дневника няма да се отпечата.

Използване на Chrome Inspector

Всичко на уеб страница се съхранява в HTML елементи. Елементите са подредени в обектния модел на документа (DOM). Разбирането на DOM е от решаващо значение, за да извлечете максимума от вашия уеб робот. Уеб роулер търси през всички HTML елементи на дадена страница, за да намери информация, така че е важно да знаете как са подредени.

Google Chrome има инструменти, които ви помагат да намерите по -бързо HTML елементи. Можете да намерите HTML за всеки елемент, който виждате на уеб страницата, като използвате инспектора.

  • Придвижете се до страница в Chrome
  • Поставете мишката върху елемента, който искате да видите
  • Щракнете с десния бутон и изберете Проверете от менюто

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

Извличане на заглавието

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

Стартирайте скрипта, като добавите код към разбор () метод, който извлича заглавието.

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

The отговор argument поддържа метод, наречен CSS () който избира елементи от страницата, като използва посоченото от вас място.

В този пример елементът е h1.firstHeading . Добавяне

::text

към скрипта е това, което ви дава текстовото съдържание на елемента. Накрая, екстракт() метод връща избрания елемент.

Изпълнението на този скрипт в Scrapy отпечатва заглавието в текстова форма.

[u'Battery (electricity)']

Намиране на описанието

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

Ето дървото на елементите в конзолата за програмисти на Chrome:

sim не е осигурен mm 2 tracfone
div#mw-content-text>div>p

Стрелката надясно (>) показва връзка родител-дете между елементите.

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

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

Точно като заглавието, добавяте CSS екстрактор

::text

за да получите текстовото съдържание на елемента.

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

Крайният израз използва екстракт() за връщане на списъка. Можете да използвате Python присъединяване() функция за присъединяване към списъка, след като цялото обхождане приключи.

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

Резултатът е първият абзац от текста!

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
...

Събиране на JSON данни

Scrapy може да извлече информация в текстов вид, което е полезно. Scrapy също ви позволява да видите данните JavaScript Object Notation (JSON). JSON е чист начин за организиране на информация и се използва широко в уеб разработката. JSON работи доста добре с Python също така.

Когато трябва да събирате данни като JSON, можете да използвате добив изявление, вградено в Scrapy.

Ето нова версия на скрипта, използваща декларация за доходност. Вместо да получи първия p елемент в текстов формат, това ще вземе всички p елементи и ще го организира във формат JSON.

Windows 10 Home срещу Pro срещу Enterprise
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

Вече можете да стартирате паяка, като посочите изходен JSON файл:

scrapy runspider spider3.py -o joe.json

Скриптът сега ще отпечата всички 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
...

Изстъргване на множество елементи

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

Нека извлечем най -добрите хитове на IMDb Box Office за уикенд. Тази информация е извлечена от http://www.imdb.com/chart/boxoffice , в таблица с редове за всеки показател.

The разбор () метод може да извлече повече от едно поле от реда. С помощта на инструментите за програмисти на Chrome можете да намерите елементите, вложени в таблицата.

...
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(),
}
...

The образ selector определя това img е потомък на td.posterColumn . За да извлечете десния атрибут, използвайте израза | _+_ |.

Пускането на паяка връща JSON:

::attr(src)

Още уеб скрепери и ботове

Scrapy е подробна библиотека, която може да направи почти всеки вид обхождане на мрежата, за който го помолите. Що се отнася до намирането на информация в HTML елементи, комбинирано с поддръжката на Python, е трудно да се победи. Независимо дали изграждате уеб робот или научавате за основите на изстъргването на мрежата, единственото ограничение е колко сте готови да научите.

Ако търсите повече начини за изграждане на роботи или ботове, можете да опитате изграждане на Twitter и Instagram ботове с помощта на Python . Python може да изгради някои невероятни неща в уеб разработката, така че си струва да надхвърлите уеб сканерите, когато изследвате този език.

Дял Дял Туит електронна поща 15 Команди на командния ред на Windows (CMD), които трябва да знаете

Командният ред все още е мощен инструмент на Windows. Ето най -полезните CMD команди, които всеки потребител на Windows трябва да знае.

Прочетете Напред
Свързани теми
  • Програмиране
  • Инструменти за уеб администратори
  • Програмиране
  • Python
  • Уроци по кодиране
  • Уеб браузъри
За автора Антъни Грант(40 статии са публикувани)

Антъни Грант е писател на свободна практика, занимаващ се с програмиране и софтуер. Той е специалист по компютърни науки, занимаващ се с програмиране, Excel, софтуер и технологии.

Още от Антъни Грант

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате