Building an rss feed scraper with python

Навигация по DOM

Вы можете перемещаться по дереву DOM с помощью регулярных имен тегов. Связывание имен тегов может помочь вам более глубоко перемещаться по дереву. Например, вы можете получить первую ссылку в первом абзаце данной страницы Википедии, используя . Все ссылки в первом абзаце можно получить, используя .

Вы также можете получить доступ ко всем дочерним элементам тега в виде списка с помощью . Чтобы получить детей по определенному индексу, вы можете использовать . Вы также можете перебирать дочерние теги с помощью атрибута .

Оба и полезны только тогда, когда вы хотите получить доступ к потомкам первого или первого уровня тега. Чтобы получить всех потомков, вы можете использовать атрибут .

Вы также можете получить доступ к родительскому элементу элемента, используя атрибут . Аналогично, вы можете получить доступ ко всем предкам элемента, используя атрибут . Родитель тега <html> верхнего уровня — это сам объект , а его родительский элемент — .

Вы можете получить доступ к предыдущему и следующему родственнику элемента, используя атрибуты и .

Для двух элементов, которые являются братьями и сестрами, они должны иметь один и тот же родитель. Это означает, что у первого ребенка элемента не будет предыдущего брата. Аналогично, у последнего дочернего элемента элемента не будет следующего брата. На реальных веб-страницах предыдущий и следующий братья элемента, скорее всего, будут символом новой строки.

Вы также можете перебирать всех братьев элемента с использованием и .

Вы можете перейти к элементу, который приходит сразу после текущего элемента, используя атрибут . Чтобы получить доступ к элементу, который приходит непосредственно перед текущим элементом, используйте атрибут .

Аналогично, вы можете перебирать все элементы, которые поступают до и после текущего элемента, используя и соответственно.

Извлекаем аттрибуты объектов в BeautifulSoup

Мы научились получать текстовое содержимое объектов. Но у каждой карточки есть две кнопки. Попробуем получить их и вывести содержимое. Я поступлю очень лениво и просто из предыдущего примера вернусь к родителю родителя родителя и найду в нём footer карточки, в котором и лежат обе кнопки-ссылки:

Python

for job_title in python_jobs:
parent = job_title.parent
company_element = parent.find(«h3″, class_=»company»)

card_parent = parent.parent.parent.parent

card_footer = card_parent.find(«footer», class_=»card-footer»)
card_links = card_footer.find_all(«a»)

for link in card_links:
print(link.text.strip())

print(job_title.text.strip())
print(company_element.text.strip())
print()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

forjob_title inpython_jobs

parent=job_title.parent

company_element=parent.find(«h3″,class_=»company»)

card_parent=parent.parent.parent.parent

card_footer=card_parent.find(«footer»,class_=»card-footer»)

card_links=card_footer.find_all(«a»)

forlink incard_links

print(link.text.strip())

print(job_title.text.strip())

print(company_element.text.strip())

print()

Вот только понимаете, в чём беда, текст ссылки есть, а ссылки – нет. Сомнительная польза.

Это связанно с тем, что ссылка href является частью html, это атрибут. И если мы хотим получить текст элемента, то весь html (в т.ч. и атрибуты) будет отброшен. Что мы и увидели. Но извлечь атрибуты из объекта довольно просто. В этом нам помогут квадратные скобки и имя атрибута.

Python

for job_title in python_jobs:
parent = job_title.parent
company_element = parent.find(«h3″, class_=»company»)

card_parent = parent.parent.parent.parent

card_footer = card_parent.find(«footer», class_=»card-footer»)
card_links = card_footer.find_all(«a»)

for link in card_links:
link_url = link
link_text = link.text.strip()
print(f»Link for {link_text} is {link_url}»)

print(job_title.text.strip())
print(company_element.text.strip())
print()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

forjob_title inpython_jobs

parent=job_title.parent

company_element=parent.find(«h3″,class_=»company»)

card_parent=parent.parent.parent.parent

card_footer=card_parent.find(«footer»,class_=»card-footer»)

card_links=card_footer.find_all(«a»)

forlink incard_links

link_url=link»href»

link_text=link.text.strip()

print(f»Link for {link_text} is {link_url}»)

print(job_title.text.strip())

print(company_element.text.strip())

print()

Результат лучше, чем можно было бы мечтать:

Теперь эти данные готовы для любой обработки, хоть в БД кидай, хоть на сервер пересылай. При этом никто не запрещает вам перейти по новым ссылкам и собрать какие-то данные оттуда. Таким образом можно было бы собрать полные данные о вакансии в одно месте, без необходимости перехода.

На этом пока всё, спасибо за внимание!

Ещё по Python: Графика в Python при помощи модуля Turtle. Часть 1

Keep Practicing

If you’ve written the code alongside this tutorial, then you can run your script as is, and you’ll see the fake job information pop up in your terminal. Your next step is to tackle a real-life job board! To keep practicing your new skills, revisit the web scraping process using any or all of the following sites:

  • PythonJobs
  • Remote(dot)co
  • Indeed

The linked websites return their search results as static HTML responses, similar to the Fake Python job board. Therefore, you can scrape them using only and Beautiful Soup.

Start going through this tutorial again from the top using one of these other sites. You’ll see that each website’s structure is different and that you’ll need to rebuild the code in a slightly different way to fetch the data you want. Tackling this challenge is a great way to practice the concepts that you just learned. While it might make you sweat every so often, your coding skills will be stronger for it!

During your second attempt, you can also explore additional features of Beautiful Soup. Use the documentation as your guidebook and inspiration. Extra practice will help you become more proficient at web scraping using Python, , and Beautiful Soup.

To wrap up your journey into web scraping, you could then give your code a final makeover and create a command-line interface (CLI) app that scrapes one of the job boards and filters the results by a keyword that you can input on each execution. Your CLI tool could allow you to search for specific types of jobs or jobs in particular locations.

Headless browsing

Selenium & Chrome

Scrapy is great for large-scale web scraping tasks. However, it is not enough if you need to scrape a Single Page Application written with Javascript frameworks because it won’t be able to render the Javascript code.

It can be challenging to scrape SPAs because there are often lots of AJAX calls and websockets connections involved. If performance is an issue, always try to reproduce the Javascript code. This means manually inspecting all of the network calls with your browser inspector, and replicating the AJAX calls containing the interesting data.

In some cases, there are too many asynchronous HTTP calls involved to get the data you want and it can be easier to render the page in a headless browser.

Another great use case would be to take a screenshot of a page, and this is what we are going to do with the Hacker News homepage (again !)

You can install the Selenium package with pip:

You will also need Chromedriver:

Then, we just have to import the Webdriver from the Selenium package, configure Chrome with headless=True and set a window size (otherwise it is really small):

You should get a nice screenshot of the homepage:

You can do many more with the Selenium API and Chrome:

  • Executing Javascript
  • Filling forms
  • Clicking on Elements
  • Extracting elements with CSS selectors / XPath expressions

Selenium and Chrome in headless mode are the ultimate combination to scrape anything you want. You can automate everything that you could do with your regular Chrome browser.

The big drawback is that Chrome needs lots of memory / CPU power. With some fine-tuning you can reduce the memory footprint to 300-400mb per Chrome instance, but you still need 1 CPU core per instance.

Don’t hesitate to check out our in-depth article about Selenium and Python.

If you want to run several Chrome instances concurrently, you will need powerful servers (the cost goes up quickly) and constant monitoring of resources.

RoboBrowser

RoboBrowser is a Python library that will allow you to browse the web by wrapping and in an easy-to-use interface.

It is not a headless browser per se because it does not rely on any web-browser binary. Instead, it’s a lightweight library that allows you to write scripts as if you were executing them in a «browser-like» environment.

For example, if you want to login to Hacker-News, instead of manually crafting a request with , you can write a script that will populate the form and «press» the login button:

As you can see, the code is written as if you were manually doing the task in a real browser, even though it is not a real headless browsing library.

RoboBrowser is cool because its lightweight approach allows you to easily parallelize it on your computer. However, because it’s not using a real browser, it won’t be able to deal with JavaScript execution like AJAX calls or Single Page Application.

Unfortunately, its documentation is also lightweight, and I would not recommend it for newcomers or people not already used to the or API.

Playwright: Chromium, Firefox and Webkit browser automation#

Playwright can be considered as an extended Puppeteer, as it allows using more browser types (Chromium, Firefox, and Webkit) to automate modern web app testing and scraping. You can use Playwright API in JavaScript & TypeScript, Python, C# and, Java. And it’s excellent, as the original Playwright maintainers support Python.

The API is almost the same as for Pyppeteer, but have sync and async version both.

Installation is simple as always:

pip install playwright

playwright install

Copy

Let’s rewrite the previous example using Playwright.

from bs4 import BeautifulSoup

from playwright.sync_api import sync_playwright

import os

with sync_playwright()as p

browser = p.chromium.launch()

page = browser.new_page()

page_path =»file://»+ os.getcwd()+»/test.html»

page.goto(page_path)

page_content = page.content()

soup = BeautifulSoup(page_content)

print(soup.find(id=»test»).get_text())

browser.close()

Copy

As a good tradition, we can observe our beloved output:

I ️ ScrapingAnt
Copy

We’ve gone through several different data extraction methods with Python, but is there any more straightforward way to implement this job? How can we scale our solution and scrape data with several threads?

Meet the web scraping API!

Пример веб-скрапинга на Python

Чтобы использовать следующий код, вам потребуется установить две распространенные библиотеки парсинга. Это можно сделать с помощью

а также

в командной строке. Для получения подробной информации о том, как устанавливать пакеты в Python, ознакомьтесь с установкой пакетов Python с помощью Pip .

В  библиотечные способы подключения и извлечения данных из целевой веб-страницы, в то время как  позволяет анализировать и извлекать части тех данных, в которых вы заинтересованы.

Давайте посмотрим на пример:

Так как же работает код?

Чтобы иметь возможность выполнять парсинг веб-страниц с помощью Python, вам потребуется базовое понимание HTML и CSS . Это сделано для того, чтобы вы понимали территорию, на которой работаете. Вам не нужно быть экспертом, но вам нужно знать, как перемещаться по элементам на веб-странице с помощью инспектора, такого как инструменты Chrome dev . Если у вас нет этих базовых знаний, вы можете пойти и получить их ( w3schools – отличное место для начала), или, если вы чувствуете себя смелым, просто попробуйте следовать и подбирать то, что вам нужно, по ходу дела.

Чтобы увидеть, что происходит в приведенном выше коде, перейдите на http://books.toscrape.com/ . Наведите курсор на цену книги, щелкните правой кнопкой мыши и выберите «проверить» (это вариант в Chrome – это может быть что-то немного другое, например «проверить элемент» в других браузерах. Когда вы это сделаете, появится новая область показывая вам HTML-код, который создал страницу

Вы должны обратить особое внимание на атрибуты «класса» элементов, на которые вы хотите настроить таргетинг

В нашем коде есть:

При этом используется атрибут class и возвращается список элементов с классом .

Тогда для каждого из этих элементов у нас есть:

Первая строка довольно проста и просто выбирает текст  элемента для текущего продукта. Следующая строка выполняет множество функций и может быть разделена на отдельные строки. По сути, он находит  тег с классом  внутри  тега с классом , извлекает текст, удаляет знак фунта и, наконец, преобразует его в число с плавающей запятой. Этот последний шаг не является строго необходимым, поскольку мы будем хранить наши данные в текстовом формате, но я включил его на тот случай, если вам понадобится фактический числовой тип данных в ваших собственных проектах.

Программного обеспечения

Доступно множество программных инструментов, которые можно использовать для настройки решений для очистки веб-страниц. Это программное обеспечение может пытаться автоматически распознавать структуру данных страницы или предоставлять интерфейс записи, который устраняет необходимость вручную писать код веб-скрейпинга, или некоторые функции сценариев, которые можно использовать для извлечения и преобразования контента, и интерфейсы баз данных, которые могут хранить очищенные данные в локальных базах данных. Некоторые программы для парсинга веб-страниц также можно использовать для извлечения данных напрямую из API.

Способы предотвращения парсинга веб-страниц

Администратор веб-сайта может использовать различные меры, чтобы остановить или замедлить работу бота. Некоторые методы включают:

  • Блокировка IP-адреса вручную или на основе таких критериев, как геолокация и DNSRBL . Это также заблокирует любой просмотр с этого адреса.
  • Отключение любого API веб-службы, доступного в системе веб-сайта.
  • Иногда боты объявляют, кто они такие (используя строки пользовательского агента ), и на этом основании их можно заблокировать с помощью robots.txt ; » googlebot » является примером. Другие боты не делают различий между собой и человеком, использующим браузер.
  • Ботов можно заблокировать, отслеживая лишний трафик
  • Иногда ботов можно заблокировать с помощью инструментов для проверки того, что это реальный человек, например, CAPTCHA . Иногда боты кодируются так, чтобы явно нарушать определенные шаблоны CAPTCHA, или могут использовать сторонние сервисы, которые используют человеческий труд для чтения и ответа в режиме реального времени на проблемы CAPTCHA.
  • Коммерческие услуги по борьбе с ботами: компании предлагают услуги по борьбе с ботами и сканированием веб-сайтов. Некоторые брандмауэры веб- приложений также имеют ограниченные возможности обнаружения ботов. Однако многие такие решения не очень эффективны.
  • Обнаружение ботов с помощью приманки или другого метода определения IP-адресов автоматических поисковых роботов.
  • Обфускация с использованием спрайтов CSS для отображения таких данных, как номера телефонов или адреса электронной почты, за счет доступности для пользователей программ чтения с экрана .
  • Поскольку боты полагаются на согласованность во внешнем коде целевого веб-сайта, добавление небольших изменений в HTML / CSS, окружающие важные данные и элементы навигации, потребует большего участия человека в первоначальной настройке бота, и, если все сделано эффективно, может отобразить целевой веб-сайт слишком сложно очистить из-за ограниченной способности автоматизировать процесс очистки.
  • Веб-сайты могут объявлять, разрешено сканирование или нет, в файле robots.txt и разрешать частичный доступ, ограничивать скорость сканирования, указывать оптимальное время сканирования и многое другое.

What is a dynamic website?#

A dynamic website is a type of website that can update or load content after the initial HTML load. So the browser receives basic HTML with JS and then loads content using received Javascript code. Such an approach allows increasing page load speed and prevents reloading the same layout each time you’d like to open a new page.

Usually, dynamic websites use AJAX to load content dynamically, or even the whole site is based on a Single-Page Application (SPA) technology.

In contrast to dynamic websites, we can observe static websites containing all the requested content on the page load.

A great example of a static website is :

The whole content of this website is loaded as a plain HTML while the initial page load.

To demonstrate the basic idea of a dynamic website, we can create a web page that contains dynamically rendered text. It will not include any request to get information, just a render of a different HTML after the page load:

<html>

<head>

<title>Dynamic Web Page Example</title>

<script>

window.addEventListener(«DOMContentLoaded»,function(){

document.getElementById(«test»).innerHTML=»I ️ ScrapingAnt»

},false);

</script>

</head>

<body>

<divid=»test»>Web Scraping is hard</div>

</body>

</html>

Copy

All we have here is an HTML file with a single in the body that contains text — , but after the page load, that text is replaced with the text generated by the Javascript:

<script>

window.addEventListener(«DOMContentLoaded»,function(){

document.getElementById(«test»).innerHTML=»I ️ ScrapingAnt»

},false);

<script>

Copy

To prove this, let’s open this page in the browser and observe a dynamically replaced text:

Alright, so the browser displays a text, and HTML tags wrap this text.
Can’t we use BeautifulSoup or to parse it? Let’s find out.

Picking a URL

Python web scraping requires looking into the source of websites

Before performing our first test run, choose a URL. As this web scraping tutorial is intended to create an elementary application, we highly recommended picking a simple target URL:

  • Avoid data hidden in Javascript elements. These sometimes need to be triggered by performing specific actions in order to display the required data. Scraping data from Javascript elements requires more sophisticated use of Python and its logic.
  • Avoid image scraping. Images can be downloaded directly with Selenium.
  • Before conducting any scraping activities ensure that you are scraping public data, and are in no way breaching third-party rights. Also, don’t forget to check the robots.txt file for guidance.

Select the landing page you want to visit and input the URL into the driver.get(‘URL’) parameter. Selenium requires that the connection protocol is provided. As such, it is always necessary to attach “http://” or “https://” to the URL.

Try doing a test run by clicking the green arrow at the bottom left or by right clicking the coding environment and selecting ‘Run’.

Follow the red pointer

If you receive an error message stating that a file is missing then turn double check if the path provided in the driver “webdriver.*” matches the location of the webdriver executable. If you receive a message that there is a version mismatch redownload the correct webdriver executable.

Что такое веб-скрапинг?

Некоторые веб-сайты могут содержать большое количество ценных данных. Веб-скрапинг означает извлечение данных с веб-сайтов, обычно автоматически с помощью бота или поискового робота. Доступные виды или данные столь же разнообразны, как и сам Интернет. Общие задачи включают

  • анализ цен на акции для информирования об инвестиционных решениях
  • автоматическая загрузка файлов, размещенных на веб-сайтах
  • парсинг данных о контактах компании
  • извлечение данных из локатора магазинов для создания списка офисов
  • сбор данных о товарах с таких сайтов, как Amazon или eBay
  • сбор спортивной статистики для ставок
  • сбор данных для привлечения потенциальных клиентов
  • сопоставление данных, доступных из нескольких источников

Библиотеки для языков программирования

Python

Библиотеки на Python предоставляют множество эффективных и быстрых функций для парсинга. Многие из этих инструментов можно подключить к готовому приложению в формате API для создания настраиваемых краулеров. Все перечисленные ниже проекты имеют открытый исходный код.

BeautifulSoup

Пакет для анализа документов HTML и XML, преобразующий их в синтаксические деревья. Он использует HTML и XML-парсеры, такие как html5lib и Lxml, чтобы извлекать нужные данные.

Для поиска конкретного атрибута или текста в необработанном HTML-файле в BeautifulSoup есть удобные функции find(), find_all(), get_text() и другие. Библиотека также автоматически распознаёт кодировки.

Установить последнюю версию BeautifulSoup можно через easy_install или pip:

Selenium

Инструмент, который работает как веб-драйвер: открывает браузер, выполняет клики по элементам, заполняет формы, прокручивает страницы и многое другое. Selenium в основном используется для автоматического тестирования веб-приложений, но его вполне можно применять и для скрейпинга. Перед началом работы необходимо установить драйверы для взаимодействия с конкретным браузером, например ChromeDriver для Chrome и Safari Driver для Safari 10.

Установить Selenium можно через pip:

Lxml

Библиотека с удобными инструментами для обработки HTML и XML файлов. Работает с XML чуть быстрее, чем Beautiful Soup, при этом используя аналогичный метод создания синтаксических деревьев. Чтобы получить больше функциональности, можно объединить Lxml и Beautiful Soup, так как они совместимы друг с другом. Beautiful Soup использует Lxml как парсер.

Ключевые преимущества библиотеки — высокая скорость анализа больших документов и страниц, удобная функциональность и простое преобразование исходной информации в типы данных Python.

Установить Lxml:

JavaScript

Для JavaScript тоже можно найти готовые библиотеки для парсинга с удобными функциональными API.

Cheerio

Шустрый парсер, который создаёт DOM-дерево страницы и позволяет удобно с ним работать. Cheerio анализирует разметку и предоставляет функции для обработки полученных данных.

API Cheerio будет особенно понятен тем, кто работает с jQuery. Парсер позиционирует себя как инструмент, позволяющей сконцентрироваться на работе с данными, а не на их извлечении.

Установить Cheerio:

Osmosis

По функциональности скрейпер похож на Cheerio, но имеет куда меньше зависимостей. Osmosis написан на Node.js и поддерживает селекторы CSS 3.0 и XPath 1.0. Также он умеет загружать и искать AJAX-контент, записывать логи URL-адресов, редиректов и ошибок, заполнять формы, проходить базовую аутентификацию и многое другое.

Для наглядности можно посмотреть пример парсинга сайтов с помощью Osmosis.

Установить парсер:

Apify SDK

Библиотека Node.js, которую можно использовать вместе с Chrome Headless и Puppeteer.

Apify позволяет выполнять глубокий обход всего веб-сайта, используя очередь URL-адресов. Также с ней можно запускать код парсера для множества URL в CSV-файле, не теряя никаких данных при сбое программы.

Для безопасного скрейпинга Apify использует прокси и отключает распознавание фингерпринта браузера на веб-сайтах.

Установить Apify SDK:

Java

В Java реализованы различные инструменты и библиотеки, а также внешние API, которые можно использовать для парсинга.

Jsoup

Проект с открытым исходным кодом для извлечения и анализа данных с HTML-страниц. Основные функции в целом не отличаются от тех, что предоставляют другие парсеры. К ним относятся загрузка и анализ HTML-страниц, манипулирование HTML-элементами, поддержка прокси, работа с CSS-селекторами и прочее.

Jsoup не поддерживает парсинг на основе XPath.

Jaunt

Библиотека, которую можно использовать для извлечения данных из HTML-страниц или данных JSON с помощью headless-браузера. Jaunt может выполнять и обрабатывать отдельные HTTP-запросы и ответы, а также взаимодействовать с REST API для извлечения данных.

В целом функциональность Jaunt похож на Jsoup за исключением того, что вместо CSS-селекторов Jaunt использует собственный синтаксис.

HTMLUnit

Инфраструктура, которая позволяет моделировать события браузера, (щелчки, прокрутка, отправка форм) и поддерживает JavaScript. Это улучшает процесс автоматизации получения и обработки информации. HTMLUnit поддерживает парсинг на основе XPath, в отличие от JSoup. Ещё его можно использовать для модульного тестирования веб-приложений.

Как скрапить YouTube с помощью Python, Requests, и Beautiful Soup

Будучи программистом, вы можете разработать собственный веб-скрапер, но это не так просто, как может показаться.

Во-первых, вы должны понимать, что скрапер, написанный для пары страниц, отличается от того, что потребуется для обработки сотен или тысяч.

Простой скрапер разбирает 20 страниц (а может, и больше), не встречая никаких преград. Но если вы будете скрапить намного больше страниц, вам придётся иметь дело с блокировщиками IP и капчами. Anti-scraping технологий много, но обход капчей и блокировщиков решает большую часть проблем.

Реализовать такой скрапер проще всего на Python, так как этот язык предоставляет библиотеки и фреймворки, которые упростят разработку.

То, какие библиотеки вам понадобятся, в большинстве случаев зависит от типа данных, которые нужно собрать. Если выполнение скриптов и JavaScript-рендеринг не нужны, подойдут Requests и Beautiful Soup, Scrapy тоже будет хорошим выбором. Но если требуется выполнить js-скрипты, чтобы вытянуть данные, лучшим решением будет Selenium.

Разрабатывая веб-скрапер для YouTube, нужно обеспечить избегание блокировки IP и прохождение капчей. Скрыть IP и избежать блокировки вам помогут прокси, а расправиться с капчами при их срабатывании — решатели капчей.

Если вы собираетесь обработать большое количество страниц, а процесс требуется ускорить, стоит задуматься о применении многопоточности. Ниже представлен простой скрапер YouTube, который принимает URL видео и возвращает количество его просмотров.

import requests
from bs4 import BeautifulSoup


class YoutubeScraper:
    def __init__(self, url):
        self.url = url

    def scrape_video_count(self):
        content = requests.get(self.url)
        soup = BeautifulSoup(content.text, "html.parser")
        view_count = soup.find("div", {"class": "watch-view-count"}).text
        return view_count


url = "https://www.youtube.com/watch?v=VpTKbfZhyj0"
x = YoutubeScraper(url)
x.scrape_video_count()

Extracting data with our Python web scraper

We have finally arrived at the fun and difficult part – extracting data out of the HTML file. Since in almost all cases we are taking small sections out of many different parts of the page and we want to store it into a list, we should process every smaller section and then add it to the list:

“soup.findAll” accepts a wide array of arguments. For the purposes of this tutorial we only use “attrs” (attributes). It allows us to narrow down the search by setting up a statement “if attribute is equal to X is true then…”. Classes are easy to find and use therefore we shall use those.

Let’s visit the chosen URL in a real browser before continuing. Open the page source by using CTRL+U (Chrome) or right click and select “View Page Source”. Find the “closest” class where the data is nested. Another option is to press F12 to open DevTools to select Element Picker. For example, it could be nested as:

Our attribute, “class”, would then be “title”. If you picked a simple target, in most cases data will be nested in a similar way to the example above. Complex targets might require more effort to get the data out. Let’s get back to coding and add the class we found in the source:

Our loop will now go through all objects with the class “title” in the page source. We will process each of them:

Let’s take a look at how our loop goes through the HTML:

Our first statement (in the loop itself) finds all elements that match tags, whose “class” attribute contains “title”. We then execute another search within that class. Our next search finds all the <a> tags in the document (<a> is included while partial matches like <span> are not). Finally, the object is assigned to the variable “name”.

We could then assign the object name to our previously created list array “results” but doing this would bring the entire <a href…> tag with the text inside it into one element. In most cases, we would only need the text itself without any additional tags.

Our loop will go through the entire page source, find all the occurrences of the classes listed above, then append the nested data to our list:

Note that the two statements after the loop are indented. Loops require indentation to denote nesting. Any consistent indentation will be considered legal. Loops without indentation will output an “IndentationError” with the offending statement pointed out with the “arrow”.

Create a Custom Spider

First, open the project folder on VScode (or your preferred code editor) and create a new file within the spider folder called .

In the file write the following code:

Let us break this code down:

  • We imported Scrapy to our project at the top of the file.
  • We defined a new class (spider) and added the subclass Spider.
  • We then gave it a unique name (winy) that cannot be the same as any other spider within the project.
  • To give our spider a target page, we used . We could have added a list of URLs separated by commas, but we’re going to make our spider move through the website’s pagination later on. So we just provided the first page.
  • Last, we told Scrapy what information we wanted it to find within the HTML. If you noticed, we used the same logic we defined in Scrapy Shell before and used the function to handle the download page.
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: