Эффективный парсинг веб-страниц с помощью Scrapy

Новые возможности Scrapy для повышения эффективности очистки

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

В этой статье вы узнаете

  1. Переход по ссылкам более эффективно
  2. Более чистое извлечение атрибутов html
  3. Более чистый перенос переменных между функциями в Scrapy
  4. Использование свойства attribute для получения атрибутов html без селекторов xpath или css

1. Переход по ссылкам

Чтобы ваши пауки переходили по ссылкам, вот как это обычно делается

links = response.css("a.entry-link::attr(href)").extract()
for link in links:
    yield scrapy.Request(url=response.urljoin(link),  callback=self.parse_blog_post)

Теперь можно использовать метод запросов, но мы можем очистить это с помощью другого метода, называемого response.follow ().

links = response.css("a.entry-link")
for link in links:
    yield response.follow(link, callback=self.parse_blog_post)

Посмотрите, как нам не нужно извлекать ссылки или использовать urljoin, потому что response.follow принимает теги ‹a›. Response.follow () автоматически использует атрибуты href.

for link in response.css("a.entry-link"):
  yield response.follow(link, callback=self.parse_blog_post)

Фактически scrapy может обрабатывать несколько запросов с помощью метода follow_all (). Прелесть этого в том, что follow_all принимает css и xpath напрямую.

yield from response.follow_all(css='a.entry-link', allback=self.parse_blog_post) 

2. Извлечение данных

Обычный способ извлечения данных из тегов - это extract() и extract_first(). Мы можем использовать методы get() и get_all(), которые выглядят немного чище.

Из

def parse_blog_post(self, response):
    yield {
        "title": response.css(".post-title::text").extract_first(),
        "author": response.css(".entry-author::text").extract_first(),
        "tags": response.css(".tag::text").extract(),
    }

To

def parse_blog_post(self, response):
    yield {
        "title": response.css(".post-title::text").get(),
        "author": response.css(".entry-author::text").get(),
        "tags": response.css(".tag::text").getall(),
    }

3. Использование атрибутов для выбора данных

Если вы не привыкли к селекторам xpath или css, Scrapy дает вам возможность захватывать атрибуты в виде словаря.

Из

>> response.css('a::attr(href)').getall()
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

to

>> [a.attrib['href'] for a in response.css('a')]
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

Используя attrib, вы можете получить атрибут HTML вместо использования xpath или css!

4. Передача данных из обратных вызовов

Часто, когда вы выполняете парсинг веб-страниц, вам необходимо передать информацию от одной функции к другой. Здесь вы обычно используете функцию response.meta.

def parse_blog_post(self, response):
   
    for link in links:
        yield scrapy.Request(
            link,
            meta={"author": author, "date": post_date},
            callback=self.parse_full_blog_post,
        )

def parse_full_blog_post(self, response):
    author = response.meta["author]
    post_date = response.meta["post_date]

Теперь мы можем использовать функцию follow_all () и новое ключевое слово с именем cb_kwargs, это позволяет нам передавать словарь значений, к которым мы затем можем получить доступ в функции обратного вызова.

def parse_blog_post(self, response):
    yield from response.follow_all(
        links,
        cb_kwargs={"author": author, "date": post_date},
        callback=self.parse_full_blog_post,
    )

def parse_full_blog_post(self, response, author, post_date):

Мы определяем переменные author и post_date в словаре и объявляем их в parse_full_blog_post. Намного чище!

Я надеюсь, что вы найдете эти советы полезными для получения максимальной отдачи от Scrapy Framework.

использованная литература

  1. Https://stummjr.org/post/scrapy-in-2020/ - источник этой статьи и замечательная статья в блоге, подробно освещающая эти моменты!

Статьи по Теме







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

Буду благодарен за любые комментарии, или если вы хотите сотрудничать или вам нужна помощь с python, пожалуйста, свяжитесь со мной. Если вы хотите связаться со мной, пожалуйста, сделайте это здесь [email protected] или на twitter .