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.Spider
clase 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.py
contenido: `
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.py
definiendo
# -*- 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.py
configure 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.