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

环境:CentOS 6.0 虚拟机

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

1、创建工程cnblogs

[root@bogon share]# scrapy startproject cnblogs
-- :: [scrapy] INFO: Scrapy 1.0.0rc2 started (bot: scrapybot)
-- :: [scrapy] INFO: Optional features available: ssl, http11
-- :: [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、查看下工程的结构

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

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

这里我们抽取四个内容:

  • 文章标题
  • 文章链接
  • 文在所在的列表页URL
  • 摘要
[root@bogon cnblogs]# vi cnblogs/items.py
# -*- coding: utf- -*- # 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

[root@bogon cnblogs]# vi cnblogs/spiders/cnblogs_spider.py

#coding=utf-
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()[]
#print item['title'] + "***************\r\n"
item['link'] = postTitle[index].css('a').xpath('@href').extract()[]
item['listUrl'] = base_url
item['desc'] = postCon[index].xpath('text()').extract()[]
#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 , but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

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

5、修改pipelines.py文件

[root@bogon cnblogs]# vi cnblogs/pipelines.py

# -*- coding: utf- -*-

# 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': ,
}
LOG_LEVEL = 'INFO'

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

[root@bogon 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

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

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

    前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我 ...

  2. 第十六节:Scrapy爬虫框架之项目创建spider文件数据爬取

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取所设计的, 也可以应用在获取API所返回的数据或 ...

  3. python爬虫成长之路(一):抓取证券之星的股票数据

    获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...

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

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

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

    我们在做scrapy爬虫的时候,爬虫经常被ban是常态.然而前面的文章如何让你的scrapy爬虫不再被ban,介绍了scrapy爬虫防屏蔽的各种策略组合.前面采用的是禁用cookies.动态设置use ...

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

    前面用scrapy编写爬虫抓取了自己博客的内容并保存成json格式的数据(scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据)和写入数据库(scrapy爬虫成长日记之将抓取内容写入 ...

  7. scrapy爬虫事件以及数据保存为txt,json,mysql

    今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...

  8. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  9. Scrapy爬虫框架基本使用

    scrapyhub上有些视频简单介绍scrapy如何学习的(貌似要FQ):https://helpdesk.scrapinghub.com/support/solutions/articles/220 ...

随机推荐

  1. WEB中的cookie

    首先来一篇好文章,刚好看到的: 沉默中的狂怒 —— Cookie 大喷发---------------- http://www.cnblogs.com/index-html/p/mitm-cookie ...

  2. 读JS高级(兼容&&BOM&&私有变量&&面向对象)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. poj2752 KMP

    需要理解next[]的意义.之前看到大牛的博客,next[]讲的非常清楚. 利用next[],当前位子的前面那一段和next[当前位子]的前面那一段是相同的.又next[next[当前位子]]与nex ...

  4. poj2406 KMP

    kmp简单题 找循环节.由于KMP的next[]数组,所以可以考虑最后一组的情况,及next[n]的值:n-next[n]的值表示一个循环节. 如果n%(n-next[n])!=0表明该循环不成立.不 ...

  5. Java 使用正则表达式

    用正则表达式来处理掉内容中的特定字符,下面的代码为,去掉P标签中的属性width 设置.将P标签处理后在拼接成字符串 /** * 给 P 标签去掉width 样式设置 * @param content ...

  6. scanf的一些技巧

    一.scanf和gets 1.不同点: char string[50]; scanf("%s",string); //当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是 ...

  7. 配置hibernate

    http://blog.csdn.net/hanjiancanxue_liu/article/details/9966423

  8. POJ3169 Layout

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  9. ubuntu自动关闭屏幕显示器

    在程序中系统调用如下两个命令,可以关闭显示器. 1,xset dpms force off 2,system("vbetool dpms off"); 因为应用要在ubuntu开机 ...

  10. 深入浅出Redis03 使用Redis数据库(hashes类型)

    一 hashes类型及操作 Redis hash是一个string类型的field和value的映射表.它的添加,删除操作都是0(1)(平均).hash特别适合用于存储对象,相较于对将对象的每个字段存 ...