Scrapy notes-сохранить в базу данных

Scrapy написан на Python. Если вы не знакомы с этим языком, сначала изучите основы.

Создать Scrapy проект

Выполните следующую команду в любом каталоге, который вам нравится

scrapy startproject coolscrapy

копия

Папка coolscrapy будет создана, и ее структура каталогов будет следующей:

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

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

        items.py          # Item定义文件

        pipelines.py      # pipelines定义文件

        settings.py       # 配置文件

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

Определите наш пункт

Создав класс scrapy.Item и определив его тип как свойство scrapy.Field, мы готовы отследить имя, адрес ссылки и сводку списка новостей об обнаружении тигра.

import scrapy

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

копия

Может быть, вам немного сложно определить этот предмет, но вы можете получить много преимуществ после его определения, так что вы можете использовать другие полезные компоненты и вспомогательные классы в Scrapy.

Первый Паук

Пауки - это классы, которые вы определяете, и Scrapy использует их для сканирования информации из домена (или доменной группы). В классе «паук» определяется начальный список загрузки URL, а также порядок перехода по ссылке и способ анализа содержимого страницы для извлечения элемента.

Чтобы определить Spider, просто расширьте scrapy.Spiderкласс и установите некоторые атрибуты:

  • имя: имя паука, должно быть уникальным
  • start_urls: инициализировать URL ссылки для скачивания
  • parse (): используется для анализа загруженного объекта Response, который также является единственным параметром этого метода. Он отвечает за синтаксический анализ возвращенных данных страницы и извлечение соответствующего Item (возвращающий объект Item), а также других допустимых URL-адресов ссылок (возвращающий объект Request).

Мы создаем новую папку в папке coolscrapy / spiders со следующим huxiu_spider.pyсодержимым:  ` python huxiu_spider.py

#! / usr / bin / env python

- - кодировка: utf-8 - -

«» »Тема: образец Описание:« »» от coolscrapy.items import HuxiuItem import scrapy

класс HuxiuSpider (scrapy.Spider): name = «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

Если все в порядке, вы должны быть в состоянии распечатать все новости

Обработка ссылок

Если вы хотите продолжить переходить по каждой ссылке на новость и просматривать ее подробности, вы можете вернуть объект Request в методе parse (), а затем зарегистрировать функцию обратного вызова для анализа подробностей новости.

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

копия

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

Экспорт данных сканирования

Самый простой способ сохранить захваченные данные - это использовать файл формата json для локального сохранения и запустить его следующим образом:

scrapy crawl huxiu -o items.json

копия

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

Сохранить данные в базу данных

Выше мы представили, что вы можете экспортировать сканируемый элемент в файл формата json, но наиболее распространенный способ - написать конвейер и сохранить его в базе данных. Мы coolscrapy/pipelines.pyопределяем

# -*- 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

копия

Выше я использовал SQLAlchemy в Python для сохранения базы данных. Это очень хорошая библиотека ORM. Я написал вводное руководство по этому вопросу . Вы можете обратиться к нему.

Затем setting.pyнастройте этот конвейер, а также ссылку на базу данных и другую информацию:

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'@@

копия

Запустите сканер снова

scrapy crawl huxiu

копия

Затем все новостные статьи хранятся в базе данных.

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

рекомендация

отblog.csdn.net/chaishen10000/article/details/102509215