7 сентября 2017 г. 2:11

265

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

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

Парсить мы будем наш блог.

Создадим новый прокет на 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