Эффективный парсинг веб-страниц с помощью Scrapy
Новые возможности Scrapy для повышения эффективности очистки
Scrapy как фреймворк для парсинга веб-страниц является мощным и масштабируемым. Он имеет активную базу пользователей и новые функции, появляющиеся с каждым обновлением. В этой статье мы рассмотрим некоторые из этих функций, чтобы получить максимальную отдачу от ваших проектов парсинга.
В этой статье вы узнаете
- Переход по ссылкам более эффективно
- Более чистое извлечение атрибутов html
- Более чистый перенос переменных между функциями в Scrapy
- Использование свойства 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.
использованная литература
- Https://stummjr.org/post/scrapy-in-2020/ - источник этой статьи и замечательная статья в блоге, подробно освещающая эти моменты!
Статьи по Теме
Пожалуйста, загляните здесь для получения дополнительной информации о том, что я планирую в своем блоге и других сообщениях по проектам. Для получения дополнительной информации, связанной с технологиями / кодированием, подпишитесь на мою рассылку здесь
Буду благодарен за любые комментарии, или если вы хотите сотрудничать или вам нужна помощь с python, пожалуйста, свяжитесь со мной. Если вы хотите связаться со мной, пожалуйста, сделайте это здесь [email protected] или на twitter .