2015-02-03 6 views
3

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

App поток:

  1. Run паук (скребок данные), файл, расположенный в пауках/
  2. Когда данные были собраны успешно сохранить данные/элементы (заголовок, ссылку, PubDate) в базу данных по использование класса в pipeline.py


Я хотел бы ваша помощь с о том, как сохранить Царапины данные (название, ссылку, PubDate) из spider.py в базу данных через pipeline.py, дворняжка я не имею ничего общего с этими файлами. Когда данные были успешно Царапинами трубопроводов должны быть уведомлены, получить данные и сохранить его


Я очень благодарен за вашу помощь


Spider.py

import urllib.request 
import lxml.etree as ET 

opener = urllib.request.build_opener() 
tree = ET.parse(opener.open('https://nordfront.se/feed')) 


items = [{'title': item.find('title').text, 'link': item.find('link').text, 'pubdate': item.find('pubDate').text} for item in tree.xpath("/rss/channel/item")] 

for item in items: 
    print(item['title'], item['link'], item['pubdate']) 


Модели.py

from sqlalchemy import create_engine, Column, Integer, String, DateTime 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.engine.url import URL 
from sqlalchemy import UniqueConstraint 
import datetime 

import settings 


def db_connect(): 
    """ 
    Performs database connection using database settings from settings.py. 
    Returns sqlalchemy engine instance 
    """ 
    return create_engine(URL(**settings.DATABASE)) 


DeclarativeBase = declarative_base() 

# <--snip--> 

def create_presstv_table(engine): 

    DeclarativeBase.metadata.create_all(engine) 

def create_nordfront_table(engine): 

    DeclarativeBase.metadata.create_all(engine) 

def _get_date(): 
    return datetime.datetime.now() 


class Nordfront(DeclarativeBase): 
    """Sqlalchemy deals model""" 
    __tablename__ = "nordfront" 

    id = Column(Integer, primary_key=True) 
    title = Column('title', String) 
    description = Column('description', String, nullable=True) 
    link = Column('link', String, unique=True) 
    date = Column('date', String, nullable=True) 
    created_at = Column('created_at', DateTime, default=_get_date) 


Pipeline.py

from sqlalchemy.orm import sessionmaker 
from models import Nordfront, db_connect, create_nordfront_table 

    class NordfrontPipeline(object): 
     """Pipeline for storing scraped items in the database""" 
     def __init__(self): 
      """ 
      Initializes database connection and sessionmaker. 
      Creates deals table. 
      """ 
      engine = db_connect() 
      create_nordfront_table(engine) 
      self.Session = sessionmaker(bind=engine) 




     def process_item(self, item, spider): 
      """Save data in the database. 

      This method is called for every item pipeline component. 

      """ 
      session = self.Session() 
      deal = Nordfront(**item) 

      if session.query(Nordfront).filter_by(link=item['link']).first() == None: 
       try: 
        session.add(deal) 
        session.commit() 
       except: 
        session.rollback() 
        raise 
       finally: 
        session.close() 

       return item 


Settings.py

DATABASE = {'drivername': 'postgres', 
      'host': 'localhost', 
      'port': '5432', 
      'username': 'toothfairy', 
      'password': 'password123', 
      'database': 'news'} 

ответ

2

Насколько я понимаю, это Scrapy-конкретный вопрос. Если да, то вам просто нужно activate your pipeline в settings.py:

ITEM_PIPELINES = { 
    'myproj.pipeline.NordfrontPipeline': 100 
} 

Это позволило бы двигатель знать, чтобы отправить просканированные элементы к трубопроводу (см control flow):

enter image description here


Если мы не говорим о Scrapy, тогда позвоните по телефону process_item() прямо с вашего паука:

from pipeline import NordfrontPipeline 

... 

pipeline = NordfrontPipeline() 
for item in items: 
    pipeline.process_item(item, None) 

Вы также можете удалить аргумент spider из метода трубопровода process_item(), так как он не используется.

+0

Hi Alecxe, я не использую Scrapy в своем проекте, но я знаю, что Scrapy имеет аналогичную функциональность, которую я ищу, однако я чувствую, что Scrapy чувствует себя немного излишним для этого проекта. (Я пробовал это) – Toothfairy

+0

@ Хорошо, я не думаю, что это перебор - по крайней мере, контроль и поток данных уже есть. Зачем изобретать колесо и писать свои собственные веб-фреймворки? Благодарю. – alecxe

+0

Я просто ищу способ запустить этот конвейер без тяжелой библиотеки – Toothfairy

Смежные вопросы