Scrapy使用Python语言编写,如果你对这门语言还不熟,请先去学习下基本知识。

创建Scrapy工程

在任何你喜欢的目录执行如下命令

scrapy startproject coolscrapy

Copy

将会创建coolscrapy文件夹,其目录结构如下:

coolscrapy/scrapy.cfg            # 部署配置文件coolscrapy/           # Python模块,你所有的代码都放这里面__init__.pyitems.py          # Item定义文件pipelines.py      # pipelines定义文件settings.py       # 配置文件spiders/          # 所有爬虫spider都放这个文件夹下面__init__.py...

定义我们的Item

我们通过创建一个scrapy.Item类,并定义它的类型为scrapy.Field的属性, 我们准备将虎嗅网新闻列表的名称、链接地址和摘要爬取下来。

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

Copy

也许你觉得定义这个Item有点麻烦,但是定义完之后你可以得到许多好处,这样你就可以使用Scrapy中其他有用的组件和帮助类。

第一个Spider

蜘蛛就是你定义的一些类,Scrapy使用它们来从一个domain(或domain组)爬取信息。 在蜘蛛类中定义了一个初始化的URL下载列表,以及怎样跟踪链接,如何解析页面内容来提取Item。

定义一个Spider,只需继承scrapy.Spider类并定于一些属性:

  • name: Spider名称,必须是唯一的
  • start_urls: 初始化下载链接URL
  • parse(): 用来解析下载后的Response对象,该对象也是这个方法的唯一参数。 它负责解析返回页面数据并提取出相应的Item(返回Item对象),还有其他合法的链接URL(返回Request对象)。

我们在coolscrapy/spiders文件夹下面新建huxiu_spider.py,内容如下: ` python huxiu_spider.py

#!/usr/bin/env python

-- encoding: utf-8 --

“”” Topic: sample Desc : “”” 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'])

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

如果一切正常,应该可以打印出每一个新闻

处理链接

如果想继续跟踪每个新闻链接进去,看看它的详细内容的话,那么可以在parse()方法中返回一个Request对象, 然后注册一个回调函数来解析新闻详情。

from coolscrapy.items import HuxiuItem
import scrapyclass 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.urlitem['posttime'] = detail.xpath('div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()print(item['title'],item['link'],item['posttime'])yield item

Copy

现在parse只提取感兴趣的链接,然后将链接内容解析交给另外的方法去处理了。 你可以基于这个构建更加复杂的爬虫程序了。

导出抓取数据

最简单的保存抓取数据的方式是使用json格式的文件保存在本地,像下面这样运行:

scrapy crawl huxiu -o items.json

Copy

在演示的小系统里面这种方式足够了。不过如果你要构建复杂的爬虫系统, 最好自己编写Item Pipeline。

保存数据到数据库

上面我们介绍了可以将抓取的Item导出为json格式的文件,不过最常见的做法还是编写Pipeline将其存储到数据库中。 我们在coolscrapy/pipelines.py定义

# -*- coding: utf-8 -*-
import datetime
import redis
import json
import logging
from contextlib import contextmanagerfrom 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, Articleclass 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."""passdef 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

Copy

上面我使用了python中的SQLAlchemy来保存数据库,这个是一个非常优秀的ORM库, 我写了篇关于它的入门教程,可以参考下。

然后在setting.py中配置这个Pipeline,还有数据库链接等信息:

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

Copy

再次运行爬虫

scrapy crawl huxiu

Copy

那么所有新闻的文章都存储到数据库中去了。

Scrapy笔记-保存到数据库相关推荐

  1. Scrapy爬取网页并保存到数据库中

    Scrapy爬取网页并保存到数据库中一.新建一个Scrapy工程.进入一个你想用来保存代码的文件夹,然后执行: T:\>scrapy startproject fjsen 会生成一堆文件夹和文件 ...

  2. Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

    Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...

  3. gnotes随笔记导出文件保存到数据库

    GNotes随笔记导出文件保存到数据库 gnotes随笔记导出文件转换并保存到数据库/json文件 文章目录 GNotes随笔记导出文件保存到数据库 前言 一.如何获取gnote随笔记的笔记信息 gn ...

  4. scrapy笔记——python的时间转换

    1 import datetime 2 GMT_FORMAT = '%M %H %d %m %w' 3 datetime.datetime.utcnow().strftime(GMT_FORMAT) ...

  5. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  6. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体

    1 //浏览图片 2 3 private void btnUp_Click(object sender, EventArgs e) 4 5 { 6 7 OpenFileDialog ofd = new ...

  7. VBNET学习笔记---MS VBnet数据库访问技术,概念,介绍,发展历程.

    VBNET学习笔记---MS VBnet数据库访问技术,概念,介绍,发展历程. 2013-02-20 1.数据库访问技术 a.JET与DAO JET(Joint Engine Technology)数 ...

  8. scrapy框架连接MongoDB数据库

    目录 1.下载pymongo模块 2.编码实现数据库简单操作 (1)链接数据库 (2)创建数据库 (3)创建表 (4)插入数据 3.打开Robo 3T ,查看数据 1.下载pymongo模块 pip ...

  9. Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园...

    Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园 在前一节,学习了如何自定义登录页,但是用户名.密码仍然 ...

最新文章

  1. Linux系统性能分析:内存 优化
  2. 深入浅出Yolo系列之Yolov3amp;Yolov4核心基础知识完整讲解
  3. pythonrequest方法_解决Python requests 报错方法集锦
  4. DOM manipulation
  5. 【算法学习笔记】43.动态规划 逆向思维 SJTU OJ 1012 增长率问题
  6. 2020未来科学大奖公布,砒霜治疗白血病发现者张亭栋、王振义获生命科学奖,最年长者96岁...
  7. JavaScript精简代码 非一般的写法(转载)
  8. 2793 [Poi2012]Vouchers
  9. Python学习心得(二) : 更新列表
  10. 【泰语歌】กลับคำสาหล่า 歌手:Mike Piromporn
  11. Vue 中 export及export default的区别
  12. 在做自动化测试之前你需要知道的
  13. Python进阶(八)Python中的关键字
  14. 基于深度学习的目标检测
  15. 电驴让分享继续 服务器不稳定,为什么越来越多的人不再使用eD2k了?回顾电驴的兴与衰...
  16. No MyBatis mapper was found in ‘[xx]‘ package. Please check your configuration.
  17. 易语言从c盘开始搜索文件夹,易语言递归寻找文件及文件夹
  18. Latex学习之插入编号-实心圆点列表,横杆,数字
  19. PDF可以修改吗,如何在PDF上修改文字
  20. MacOS 苹果 快捷键

热门文章

  1. Longest Substring with Same Letters after Replacement (hard)
  2. 某单位分配到一个C类网络地址,其网络号为218.7.8.0,现在该单位共有4个不同的部门,每个部门最多25台主机,要求进行子网划分
  3. 条码标签设计软件Nicelabel使用方法
  4. webpack 降级
  5. STF环境搭建运行及踩坑记录
  6. 安卓日记——手把手教你做知乎日报
  7. 清华计算机系超算团队,清华学生超算团队获得国际大学生超级计算机竞赛总冠军...
  8. 国产大数据系统通过验收,”核高基”基础软件再下一城
  9. Android Studio 3.1 正式版
  10. 云时代,有必要了解的华为云计算解决方案