Пишем парсер на Scrapy

07 Сен 2017 , 1800

Напишем простой паук для обхода данных и сохранением их в MongoDB. Для этого мы будем использовать замечательный "швейцарский нож" как его любят величать в интернете. Мы про фреймворк Scrapy.

Создадим новый проект на Scrapy, который будет парсить наш блог.


   scrapy startproject gmmblog

После выполнения этой команды мы имеем следующую структуру проекта

Давайте мы создадим наш первый Spider


from scrapy import Spider


class BlogSpider(Spider):
    name = 'blog'
    allowed_domains = ['gadjimuradov.ru']
    start_urls = [
        "http://gadjimuradov.ru/",
    ]

    def parse(self, response):
        print(response)


Мы создали наш паук , который заходит на главную страницу моего блога. Мы должны указывать allowed_domains . Обратите внимание , что мы должны указать домен(или домены) без http . Так же мы должны указать стартовые страницы start_urls, с которых начнет свой обход наш паук.

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

Мы будем использовать XPATH.

Напишем Item


# -*- coding: utf-8 -*-
import scrapy


class GmmblogItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    content = scrapy.Field()

В файле settings.py добавим параметры настройки для MongoDB

Создадим Pipeline , где мы реализуем сохрание наших данных в MongoDB

Pipeline обязательно должна опрелелять метод process_item Но мы также определим методы open_spider (который вызывается всякий раз, когда запускается паук ) , а также метод close_spider (метод вызывается при закрытии паука)


# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymongo
import logging

from scrapy.conf import settings
from scrapy.exceptions import DropItem

class GmmblogPipeline(object):

    def process_item(self, item, spider):
        self.collection.insert(dict(item))
        logging.debug("Post added to MongoDB")
        return item

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(settings['MONGODB_SERVER'],
                                            settings['MONGODB_PORT'])
        self.db = self.client[settings['MONGODB_DB']]
        self.collection = self.db[settings['MONGODB_COLLECTION']]

    def close_spider(self, spider):
        self.client.close()



Заключение

В данной статье мы создали простой парсер на Scrapy , который проходит по постам и сохраняет их MongoDB.

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги