Основы Scrapy: Как парсить названия животных
Table Of Content
Привет, сегодня я расскажу вам о Scrapy. Scrapy - это бесплатный фреймворк для веб-парсинга, написанный на Python. Изначально разработанный для скрапинга веб-сайтов, он также может использоваться для извлечения данных с помощью API или в качестве универсального веб-сканера. В настоящее время он поддерживается компанией Scrapinghub Ltd, занимающейся разработкой и обслуживанием веб-скрапинга.
Изображение src="/blogs/f749da38d0.jpg" width="355" height="142" alt="" sizes="100vw"
Функции веб-парсинга позволяют получать данные с веб-сайтов, например, получать данные о ценах с торговой площадки для сравнения, получать данные о прогнозе погоды и многое другое. Это очень полезно для руководителя компании при принятии решений.
На этот раз я хочу объяснить, как сделать простой веб-парсинг. Мы будем получать данные о названиях аэропортов на https://a-z-animals.com/animals/
Сначала откройте PyCharm и создайте новый проект с виртуальной средой, как показано на рисунке.
Изображение src="/blogs/bb82c52583.jpg" width="700" height="394" alt="" sizes="100vw"
Перед установкой Scrapy вам нужно установить Twisted, вы можете скачать его по адресу https://www.lfd.uci.edu/~gohlke/pythonlibs/, найти Twisted и скачать соответствующую версию для вашей версии Python и вашей версии Windows. Моя версия Python была 3.6, а моя версия Windows была 64-битной, поэтому я выбрал https://download.lfd.uci.edu/pythonlibs/t4jqbe6o/Twisted-19.2.1-cp36-cp36m-win_amd64.whl.
Откройте файл в проводнике Windows, щелкните правой кнопкой мыши, выберите "Копировать", откройте PyCharm, щелкните правой кнопкой мыши на каталоге "scrapy_for_beginner" и выберите "Вставить". Затем выполните следующие команды:
pip install Twisted-19.2.1-cp36-cp36m-win_amd64.whlpip install scrapy
Теперь мы можем начать парсить. Сначала мы должны назвать этот проект парсинга, выполните следующую команду в терминале:
scrapy startproject animal_namescd animal_namesscrapy genspider animal www.a-z-animals.com
После этого появится новый файл на Python с именем animal.py. Мы будем писать код парсинга там. Затем нам нужно установить Pywin32 и изменить код в формат .json, выполните следующую команду в терминале:
pip install pywin32scrapy crawl animal -o codes.json
Затем введите следующий код в animal.py:
name = 'animal'allowed_domains = ['www.a-z-animals.com']
start_urls = ['http://a-z-animals.com/animals']
def parse(self, response):
data = []
table = response.css('.az-leftbox.az-animal-index')
row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
".//li[@class='az-phobia-link-225']"
Allowed domains - это основной URL, с которого мы хотим получить данные. Start_urls - это конкретный URL, с которого мы хотим получить данные, в данном случае мы хотим получить 5 названий животных с буквой A последовательно. Где я могу получить исходный код? Вы можете открыть URL https://a-z-animals.com/animals/, щелкнуть правой кнопкой мыши и выбрать "Инспектировать".
Изображение src="/blogs/aaf2f54605.jpg" width="700" height="394" alt="" sizes="100vw"
Это основной класс, из которого мы хотим получить данные. Запишите его в коде:
table = response.css('.az-leftbox.az-animal-index')
Изображение src="/blogs/19fba0213e.jpg" width="700" height="394" alt="" sizes="100vw"
Это подкласс, из которого мы хотим получить данные, в данном случае мы хотим получить 5 названий животных с буквой A последовательно, поэтому просто запишите первые пять подклассов в animal.py.
row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
".//li[@class='az-phobia-link-225']"
Затем вам нужно выбрать строку.
Изображение src="/blogs/2e2477d4ee.jpg" width="700" height="394" alt="" sizes="100vw"
Мы хотим получить тексты Aardvark, Abyssinian, Adelie Penguin, Affenpinscher, Afgan Hound, их местоположение в HTML находится в ./a/b, затем мы пишем текст, поэтому это будет ./a/b/text(), и добавляем это в наш код следующим образом:
for row in table.xpath(row_selector):
name = row.xpath('./a/b/text()').extract_first()
print(name)
data.append({
"name": name
})
Я также добавил текст "name", чтобы результат был более аккуратным. Если вы хотите добавить какой-то текст или функцию, вы можете написать data.append, а затем текст. Вот и весь ваш код в animal.py будет выглядеть так:
import scrapy
class AnimalSpider(scrapy.Spider):
name = 'animal'allowed_domains = ['https://www.a-z-animals.com']
start_urls = ['https://www.a-z-animals.com/animals']
def parse(self, response):
data = []
table = response.css('.az-left-box.az-animals-index')
row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
".//li[@class='az-phobia-link-225']"
for row in table.xpath(row_selector):
name = row.xpath('./a/b/text()').extract_first()
print(name)
data.append({
"name": name
})
return data
Затем перейдите в терминал и введите scrapy crawl animal -o codes.json. Проверьте файл codes.json и вы получите следующий результат:
Изображение src="/blogs/aa37d76805.jpg" width="700" height="394" alt="" sizes="100vw"
Поскольку в коде мы написали print(name), результат также будет добавлен в терминал.
Изображение src="/blogs/b1ad128242.jpg" width="700" height="279" alt="" sizes="100vw"
Вот пример того, как парсить веб-сайт. В данном случае мы парсили 5 названий животных с буквой A последовательно. В следующей статье я расскажу больше о Python, JavaScript или HTML.
Оставайтесь на связи для моих следующих статей!!