一. 新建项目(scrapy startproject)

  • 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:

scrapy startproject scrapyDemo
  • 其中, mySpider 为项目名称,可以看到将会创建一个 scrapyDemo 文件夹,目录结构大致如下:

各个主要文件的作用:

scrapy.cfg :项目的配置文件

scrapyDemo/ :项目的Python模块,将会从这里引用代码

scrapyDemo/items.py :项目的目标文件

scrapyDemo/pipelines.py :项目的管道文件

scrapyDemo/settings.py :项目的设置文件

scrapyDemo/spiders/ :存储爬虫代码目录

抓取:https://www.cnblogs.com/loaderman/ 网站里的所有讲师的标题、描述、详情链接地址和日期。

  1. 打开scrapyDemo目录下的items.py

  2. Item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。

  3. 可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)。

  4. 接下来,创建一个LoadermanItem 类,和构建item模型(model)。

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

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html import scrapy class LoadermanItem(scrapy.Item):
title = scrapy.Field()
detailUrl = scrapy.Field()
content = scrapy.Field()
date = scrapy.Field()

制作爬虫 (spiders/loadermanSpider.py)

爬虫功能要分两步:

1. 爬数据

  • 在当前目录下输入命令,将在mySpider/spider目录下创建一个名为loaderman的爬虫,并指定爬取域的范围:
   scrapy genspider loadermanSpider "http://www.cnblogs.com"
  • 打开 mySpider/spider目录里的 loadermanSpider.py,默认增加了下列代码:
# -*- coding: utf-8 -*-
import scrapy
class LoadermanSpider(scrapy.Spider):
name = 'loaderman'
allowed_domains = ['http://www.cnblogs.com']
start_urls = ['http://www.cnblogs.com/loaderman'] def parse(self, response):
pass
其实也可以由我们自行创建loadermanSpider.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦

要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。

  • name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

  • allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

  • start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

  • parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

    1. 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    2. 生成需要下一页的URL请求。

将start_urls的值修改为需要爬取的第一个url

    start_urls = ['http://www.cnblogs.com/loaderman']
修改parse()方法
def parse(self, response):
filename = "loaderman.html"
open(filename, 'w').write(response.body)
然后运行一下看看,在项目目录下执行:
scrapy crawl loaderman

是的,就是 loaderman,看上面代码,它是 loadermanSpider 类的 name 属性,也就是使用 scrapy genspider命令的唯一爬虫名。

运行之后,如果打印的日志出现 [scrapy] INFO: Spider closed (finished),代表执行完成。 之后当前文件夹中就出现了一个 loaderman.html 文件,里面就是我们刚刚要爬取的网页的全部源代码信息。

# 注意,Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;
# 我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加: import sys
reload(sys)
sys.setdefaultencoding("utf-8") # 这三行代码是Python2.x里解决中文编码的万能钥匙, 现在Python3默认编码是Unicode。

2. 取数据

  • 爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码:

直接上XPath开始提取数据

# -*- coding: utf-8 -*-
import scrapy from scrapyDemo.items import LoadermanItem class LoadermanSpider(scrapy.Spider):
name = 'loaderman'
allowed_domains = ['http://www.cnblogs.com']
start_urls = ['http://www.cnblogs.com/loaderman'] def parse(self, response):
# filename = "loaderman.html"
# open(filename, 'w').write(response.body)
xpathList = response.xpath("//div[@class='post']")
items= []
for each in xpathList:
# 将我们得到的数据封装到一个 `LoadermanItem` 对象 item = LoadermanItem() # extract()方法返回的都是unicode字符串
title = each.xpath(".//h2/a[@class='postTitle2']/text()").extract()
detailUrl = each.xpath(".//a[@class='postTitle2']/@href").extract()
content = each.xpath(".//div[@class='c_b_p_desc']/text()").extract()
date = each.xpath(".//p[@class='postfoot']/text()").extract()
# xpath返回的是包含一个元素的列表 item['title'] = title[0]
item['detailUrl'] = detailUrl[0]
item['content'] = content[0]
item['date'] = date[0]
items.append(item)
# #将获取的数据交给pipelines
# yield items # 返回数据,不经过pipeline
return items

保存数据

scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,,命令如下:

# json格式,默认为Unicode编码
scrapy crawl loaderman -o teachers.json # json lines格式,默认为Unicode编码
scrapy crawl loaderman -o teachers.jsonl # csv 逗号表达式,可用Excel打开
scrapy crawl loaderman -o teachers.csv # xml格式
scrapy crawl loaderman -o teachers.xml

scrapy入门案例的更多相关文章

  1. Python爬虫Scrapy(二)_入门案例

    本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...

  2. Scrapy 爬虫框架入门案例详解

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...

  3. 爬虫框架Scrapy入门——爬取acg12某页面

    1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_ ...

  4. Scrapy 入门教程

    Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通常我们可以很简单的通过 ...

  5. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  6. SpringMvc核心流程以及入门案例的搭建

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  7. Struts2第一个入门案例

      一.如何获取Struts2,以及Struts2资源包的目录结构的了解    Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...

  8. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  9. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

随机推荐

  1. Linux添加用户并赋予root权限

    新增用户 创建一个名为qiang,其家目录位于/usr/qiang的用户 adduser -d /usr/qiang -m qiang 或直接这样,则用户的家目录会默认为/home/目录 adduse ...

  2. prometheus学习系列十一: Prometheus 采集器的编写

    在前面的文章已经写了官方的几个exporter的使用了. 在实际使用环境中,我们可能需要收集一些自定义的数据, 这个时候我们一般是需要自己编写采集器的. 快速入门编写一个入门的demo 编写代码 fr ...

  3. ZYNQ7000性能分析

    提到自动驾驶,机器人视觉,高清摄像机,都要想到摄像头这个单元,先前本侠也讲过一些FPGA应用在高清摄像头和机器视觉中的深度摄像头以及双目摄像头等,FPGA在里面的作用主要是对采集的图像进行处理,对图像 ...

  4. 【Spring Boot】Spring Boot之利用Logstash将日志转换成以JSON的格式存储和输出

    一.Logstash的作用 Logstash是一个完全开源的工具,它可以对日志进行收集.过滤,能非常方便地将日志转换成以JSON的格式存储和输出,并将其存储供以后使用. 二.整合Logstash的步骤 ...

  5. Linux操作系统之用户权限,重定向,文件管理

    文件的权限 ls -al  ----->隐藏文件会以 .号开头 ls -ld :显示目录自身属性 ls -i 显示文件的索引号----每个文件都有一个对应的号码 ls -r 逆序显示 dr-xr ...

  6. 看TED演讲——Why you will fail to have a great career

    讲者的名字叫Larry Smith,看起来很严肃很认真,有点黑色幽默的意思,演讲风格是非常让人喜欢的. 拿来howie老师的说法,拉老师给的你为什么没有一个great career的原因: 1. 知道 ...

  7. python案例-判断素数

    from math import sqrt def is_prime(num): for rea in range(2,int(sqrt(num)+1)): if num%rea==0: return ...

  8. C++输入输出流 cin/cout 及格式化输出简介

    C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...

  9. python基础语法5 函数定义,可变长参数

    函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...

  10. Does Swift support aspect oriented programming?

    The foundation of Aspect Oriented Programming is the intercept pattern. We start with a crosscutting ...