scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据

  在安装完scrapy以后,相信大家都会跃跃欲试想定制一个自己的爬虫吧?我也不例外,下面详细记录一下定制一个scrapy工程都需要哪些步骤。如果你还没有安装好scrapy,又或者为scrapy的安装感到头疼和不知所措,可以参考下前面的文章安装python爬虫scrapy踩过的那些坑和编程外的思考。这里就拿博客园来做例子吧,抓取博客园的博客列表并保存到json文件。

环境:CentOS 6.0 虚拟机

  scrapy(如未安装可参考安装python爬虫scrapy踩过的那些坑和编程外的思考

1、创建工程cnblogs

[[email protected] share]# scrapy startproject cnblogs
2015-06-10 15:45:03 [scrapy] INFO: Scrapy 1.0.0rc2 started (bot: scrapybot)
2015-06-10 15:45:03 [scrapy] INFO: Optional features available: ssl, http11
2015-06-10 15:45:03 [scrapy] INFO: Overridden settings: {}
New Scrapy project ‘cnblogs‘ created in:
    /mnt/hgfs/share/cnblogs

You can start your first spider with:
    cd cnblogs
    scrapy genspider example example.com

2、查看下工程的结构

[[email protected] share]# tree cnblogs/
cnblogs/
├── cnblogs
│   ├── __init__.py
│   ├── items.py #用于定义抽取网页结构
│   ├── pipelines.py #将抽取的数据进行处理
│   ├── settings.py #爬虫配置文件
│   └── spiders
│       └── __init__.py
└── scrapy.cfg #项目配置文件

3、定义抽取cnblogs的网页结构,修改items.py

这里我们抽取四个内容:

  • 文章标题
  • 文章链接
  • 文在所在的列表页URL
  • 摘要
[[email protected] cnblogs]# vi cnblogs/items.py
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class CnblogsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()
    listUrl = scrapy.Field()
    pass

4、创建spider

[[email protected] cnblogs]# vi cnblogs/spiders/cnblogs_spider.py

#coding=utf-8
import re
import json
from scrapy.selector import Selector
try:
    from scrapy.spider import Spider
except:
    from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle
from cnblogs.items import *

class CnblogsSpider(CrawlSpider):
    #定义爬虫的名称
    name = "CnblogsSpider"
    #定义允许抓取的域名,如果不是在此列表的域名则放弃抓取
    allowed_domains = ["cnblogs.com"]
    #定义抓取的入口url
    start_urls = [
        "http://www.cnblogs.com/rwxwsblog/default.html?page=1"
    ]
    # 定义爬取URL的规则,并指定回调函数为parse_item
    rules = [
        Rule(sle(allow=("/rwxwsblog/default.html\?page=\d{1,}")), #此处要注意?号的转换,复制过来需要对?号进行转义。
                         follow=True,
                         callback=‘parse_item‘)
    ]
    #print "**********CnblogsSpider**********"
    #定义回调函数
    #提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
    def parse_item(self, response):
        #print "-----------------"
        items = []
        sel = Selector(response)
        base_url = get_base_url(response)
        postTitle = sel.css(‘div.day div.postTitle‘)
        #print "=============length======="
        postCon = sel.css(‘div.postCon div.c_b_p_desc‘)
        #标题、url和描述的结构是一个松散的结构,后期可以改进
        for index in range(len(postTitle)):
            item = CnblogsItem()
            item[‘title‘] = postTitle[index].css("a").xpath(‘text()‘).extract()[0]
            #print item[‘title‘] + "***************\r\n"
            item[‘link‘] = postTitle[index].css(‘a‘).xpath(‘@href‘).extract()[0]
            item[‘listUrl‘] = base_url
            item[‘desc‘] = postCon[index].xpath(‘text()‘).extract()[0]
            #print base_url + "********\n"
            items.append(item)
            #print repr(item).decode("unicode-escape") + ‘\n‘
        return items

注意:

  首行要设置为:#coding=utf-8 或 # -*- coding: utf-8 -*- 哦!否则会报错。

SyntaxError: Non-ASCII character ‘\xe5‘ in file /mnt/hgfs/share/cnblogs/cnblogs/spiders/cnblogs_spider.py on line 15, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

  spider的名称为:CnblogsSpider,后面会用到。

5、修改pipelines.py文件

[[email protected] cnblogs]# vi cnblogs/pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

from scrapy import signals
import json
import codecs
class JsonWithEncodingCnblogsPipeline(object):
    def __init__(self):
        self.file = codecs.open(‘cnblogs.json‘, ‘w‘, encoding=‘utf-8‘)
    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item
    def spider_closed(self, spider):
        self.file.close()

注意类名为JsonWithEncodingCnblogsPipeline哦!settings.py中会用到

6、修改settings.py,添加以下两个配置项

ITEM_PIPELINES = {
    ‘cnblogs.pipelines.JsonWithEncodingCnblogsPipeline‘: 300,
}LOG_LEVEL = ‘INFO‘

7、运行spider,scrapy crawl 爬虫名称(cnblogs_spider.py中定义的name)

[[email protected] cnblogs]# scrapy crawl CnblogsSpider

8、查看结果more cnblogs.json(pipelines.py中定义的名称)

more cnblogs.json 

9、如果有需要可以将结果转成txt文本格式,可参考另外一篇文章python将json格式的数据转换成文本格式的数据或sql文件

源码可在此下载:https://github.com/jackgitgz/CnblogsSpider

10、相信大家还会有疑问,我们能不能将数据直接保存在数据库呢?答案是可以的,接下来的文章会逐一介绍,敬请期待。

参考资料:

  http://doc.scrapy.org/en/master/

  http://blog.csdn.net/HanTangSongMing/article/details/24454453

时间: 2024-12-19 03:05:00

scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据的相关文章

scrapy爬虫成长日记之将抓取内容写入mysql数据库

前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我们日常的实际应用,接下来看下如何将抓取的内容保存在常见的mysql数据库中吧. 说明:所有的操作都是在“scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据”的基础上完成,如果您错过了这篇文章可以移步这里查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据 环

XML创建,通过对话框保存会导致格式错误的问题

估计有很多人会遇到通过自己写的代码创建XML文件,用对话框保存文件到自己指定的目录中后,再次打开自己创建的xml文件却发现,咦?格式怎么变成这样,好乱! 下面我提供一种方法来解决这种问题,算是曲线救国吧. 当你把创建xml代码写好后,保存使用对话框可以通过以下代码保证xml文件格式正常,代码经仅供参考: 1 SaveFileDialog sfd = new SaveFileDialog(); 2 sfd.Filter = "xml文件|*.xml"; 3 if (sfd.ShowDia

如何让你的scrapy爬虫不再被ban

前面用scrapy编写爬虫抓取了自己博客的内容并保存成json格式的数据(scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据)和写入数据库(scrapy爬虫成长日记之将抓取内容写入mysql数据库).然而,这个爬虫的功能还是过于弱小,一旦目标网站设置了爬虫的限制,我们的爬虫也就失效了.因此这里重点讲述一下如何避免scrapy爬虫被ban.本门的所有内容都是基于前面两篇文章的基础上完成的,如果您错过了可以点击此回看:scrapy爬虫成长日记之创建工程-抽取数据-保存为json格

如何让你的scrapy爬虫不再被ban之二(利用第三方平台crawlera做scrapy爬虫防屏蔽)

我们在做scrapy爬虫的时候,爬虫经常被ban是常态.然而前面的文章如何让你的scrapy爬虫不再被ban,介绍了scrapy爬虫防屏蔽的各种策略组合.前面采用的是禁用cookies.动态设置user agent.代理IP和VPN等一系列的措施组合来防止爬虫被ban.除此以外官方文档还介绍了采用Google cache和crawlera的方法.这里就着重介绍一下如何利用crawlera来达到爬虫不被ban的效果.crawlera是一个利用代理IP地址池来做分布式下载的第三方平台,除了scrap

同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来呢? 说明:本文章是基于前面几篇文章和实验的基础上完成的.如果您错过了,或者有疑惑的地方可以在此查看: 安装python爬虫scrapy踩过的那些坑和编程外的思考 scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据 scrapy爬虫成长日记之将抓取内容写入mysql数据库 如何让

dota玩家与英雄契合度的计算器,python语言scrapy爬虫的使用

首发:个人博客,更新&纠错&回复 演示地址在这里,代码在这里. 一个dota玩家与英雄契合度的计算器(查看效果),包括两部分代码: 1.python的scrapy爬虫,总体思路是page->model->result,从网页中提取数据,组成有意义的数据结构,再拿这数据结构做点什么. 在这个项目中,爬虫的用处是从游久网dota数据库上抓取dota英雄和物品的数据和照片存到本地磁盘,数据存为json格式,方便在网页应用中直接使用. 2.网页应用,使用dota英雄数据.自己编写的小伙

第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫数据保存 注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy

在Pycharm中运行Scrapy爬虫项目的基本操作

目标在Win7上建立一个Scrapy爬虫项目,以及对其进行基本操作.运行环境:电脑上已经安装了python(环境变量path已经设置好), 以及scrapy模块,IDE为Pycharm .操作如下: 一.建立Scrapy模板.进入自己的工作目录,shift + 鼠标右键进入命令行模式,在命令行模式下, 输入scrapy startproject 项目名 ,如下: 看到以上的代码说明项目已经在工作目录中建好了. 二.在Pycharm中scrapy的导入.在Pycharm中打开工作目录中的TestD

在pycharm中使用scrapy爬虫

目标在Win7上建立一个Scrapy爬虫项目,以及对其进行基本操作.运行环境:电脑上已经安装了python(环境变量path已经设置好), 以及scrapy模块,IDE为Pycharm .操作如下: 一.建立Scrapy模板.进入自己的工作目录,shift + 鼠标右键进入命令行模式,在命令行模式下, 输入scrapy startproject 项目名 ,如下: 看到以上的代码说明项目已经在工作目录中建好了. 二.在Pycharm中scrapy的导入.在Pycharm中打开工作目录中的TestD