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
копия
Затем все новостные статьи хранятся в базе данных.