Scrapy notes-save en la base de datos

Scrapy está escrito en Python. Si no está familiarizado con este lenguaje, primero aprenda los conceptos básicos.

Crear proyecto Scrapy

Ejecute el siguiente comando en cualquier directorio que desee

scrapy startproject coolscrapy

Copiar

Se creará la carpeta coolscrapy y su estructura de directorios es la siguiente:

coolscrapy/
    scrapy.cfg            # 部署配置文件

    coolscrapy/           # Python模块,你所有的代码都放这里面
        __init__.py

        items.py          # Item定义文件

        pipelines.py      # pipelines定义文件

        settings.py       # 配置文件

        spiders/          # 所有爬虫spider都放这个文件夹下面
            __init__.py
            ...

Define nuestro artículo

Al crear una clase scrapy.Item y definir su tipo como una propiedad de scrapy.Field, estamos listos para rastrear el nombre, la dirección del enlace y el resumen de la lista de Tiger Sniffing News.

import scrapy

class HuxiuItem(scrapy.Item):
    title = scrapy.Field()    # 标题
    link = scrapy.Field()     # 链接
    desc = scrapy.Field()     # 简述
    posttime = scrapy.Field() # 发布时间

Copiar

Tal vez le resulte un poco problemático definir este elemento, pero puede obtener muchos beneficios después de definirlo, por lo que puede usar otros componentes útiles y clases auxiliares en Scrapy.

La primera araña

Las arañas son clases que usted define, y Scrapy las usa para rastrear información de un dominio (o grupo de dominio). En la clase de araña, se define una lista de descarga de URL inicial, así como cómo seguir el enlace y cómo analizar el contenido de la página para extraer el elemento.

Para definir una araña, simplemente amplíe la scrapy.Spiderclase y establezca algunos atributos:

  • nombre: nombre de la araña, debe ser único
  • start_urls: Inicializar URL de enlace de descarga
  • parse (): se utiliza para analizar el objeto de respuesta descargado, que también es el único parámetro de este método. Es responsable de analizar los datos de la página devuelta y extraer el artículo correspondiente (devolver el objeto del artículo), así como otras URL de enlace legales (devolver el objeto de solicitud).

Creamos una nueva carpeta en la carpeta coolscrapy / spiders con el siguiente huxiu_spider.pycontenido:  ` python huxiu_spider.py

#! / usr / bin / env python

- - codificación: utf-8 - -

"" "Tema: muestra Desc:" "" de coolscrapy.items import HuxiuItem import scrapy

clase HuxiuSpider (scrapy.Spider): nombre = “huxiu” allow_domains = [“huxiu.com”] start_urls = [“ http://www.huxiu.com/index.php"  ]

def parse(self, response):
    for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
        item = HuxiuItem()
        item['title'] = sel.xpath('h3/a/text()')[0].extract()
        item['link'] = sel.xpath('h3/a/@href')[0].extract()
        url = response.urljoin(item['link'])
        item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
        print(item['title'],item['link'],item['desc'])

## 运行爬虫
在根目录执行下面的命令,其中huxiu是你定义的spider名字:
``` bash
scrapy crawl huxiu

Si todo es normal, debería poder imprimir todas las noticias

Manejo de enlaces

Si desea continuar siguiendo cada enlace de noticias y ver sus detalles, puede devolver un objeto Solicitud en el método parse () y luego registrar una función de devolución de llamada para analizar los detalles de las noticias.

from coolscrapy.items import HuxiuItem
import scrapy

class HuxiuSpider(scrapy.Spider):
    name = "huxiu"
    allowed_domains = ["huxiu.com"]
    start_urls = [
        "http://www.huxiu.com/index.php"
    ]

    def parse(self, response):
        for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
            item = HuxiuItem()
            item['title'] = sel.xpath('h3/a/text()')[0].extract()
            item['link'] = sel.xpath('h3/a/@href')[0].extract()
            url = response.urljoin(item['link'])
            item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
            # print(item['title'],item['link'],item['desc'])
            yield scrapy.Request(url, callback=self.parse_article)

    def parse_article(self, response):
        detail = response.xpath('//div[@class="article-wrap"]')
        item = HuxiuItem()
        item['title'] = detail.xpath('h1/text()')[0].extract()
        item['link'] = response.url
        item['posttime'] = detail.xpath(
            'div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()
        print(item['title'],item['link'],item['posttime'])
        yield item

Copiar

Ahora analizar solo extrae los enlaces de interés y luego analiza el contenido del enlace a otro método para procesar. Puede crear un programa de rastreo más complejo basado en esto.

Exportar datos de rastreo

La forma más fácil de guardar los datos capturados es usar un archivo de formato json para guardarlo localmente y ejecutarlo de la siguiente manera:

scrapy crawl huxiu -o items.json

Copiar

Este enfoque es suficiente en el sistema de demostración. Pero si desea crear un sistema de rastreo complejo, lo mejor es escribir la Tubería de elementos usted mismo .

Guardar datos en la base de datos

Anteriormente presentamos que puede exportar el elemento rastreado a un archivo de formato json, pero la forma más común es escribir Pipeline y almacenarlo en la base de datos. Estamos coolscrapy/pipelines.pydefiniendo

# -*- coding: utf-8 -*-
import datetime
import redis
import json
import logging
from contextlib import contextmanager

from scrapy import signals
from scrapy.exporters import JsonItemExporter
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from sqlalchemy.orm import sessionmaker
from coolscrapy.models import News, db_connect, create_news_table, Article


class ArticleDataBasePipeline(object):
    """保存文章到数据库"""

    def __init__(self):
        engine = db_connect()
        create_news_table(engine)
        self.Session = sessionmaker(bind=engine)

    def open_spider(self, spider):
        """This method is called when the spider is opened."""
        pass

    def process_item(self, item, spider):
        a = Article(url=item["url"],
                    title=item["title"].encode("utf-8"),
                    publish_time=item["publish_time"].encode("utf-8"),
                    body=item["body"].encode("utf-8"),
                    source_site=item["source_site"].encode("utf-8"))
        with session_scope(self.Session) as session:
            session.add(a)

    def close_spider(self, spider):
        pass

Copiar

Arriba, usé SQLAlchemy en Python para guardar la base de datos. Esta es una muy buena biblioteca de ORM. Escribí un tutorial introductorio al respecto . Puede consultarla.

Luego setting.pyconfigure esta canalización, así como el enlace de la base de datos y otra información:

ITEM_PIPELINES = {
    'coolscrapy.pipelines.ArticleDataBasePipeline': 5,
}

# linux pip install MySQL-python
DATABASE = {'drivername': 'mysql',
            'host': '192.168.203.95',
            'port': '3306',
            'username': 'root',
            'password': 'mysql',
            'database': 'spider',
            'query': {'charset': 'utf8'@@

Copiar

Ejecute el rastreador nuevamente

scrapy crawl huxiu

Copiar

Luego, todos los artículos de noticias se almacenan en la base de datos.

发布了150 篇原创文章 · 获赞 149 · 访问量 81万+

Supongo que te gusta

Origin blog.csdn.net/chaishen10000/article/details/102509215
Recomendado
Clasificación