scrapy startproject【学习笔记02】

入门案例

学习目标

  • 创建一个Scrapy项目
  • 定义提取的结构化数据(Item)
  • 编写爬取网站的 Spider 并提取出结构化数据(Item)
  • 编写 Item Pipelines 来存储提取到的Item(即结构化数据)

一. 新建项目(scrapy startproject)

  • 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:
scrapy startproject mySpider
  • 其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹,目录结构大致如下:

下面来简单介绍一下各个主要文件的作用:

scrapy.cfg :项目的配置文件

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

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

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

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

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

二、明确目标(mySpider/items.py)

我们打算抓取:http://www.itcast.cn/channel/teacher.shtml 网站里的所有讲师的姓名、职称和个人信息。

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

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

  3. 可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item。

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

import scrapyclass ItcastItem(scrapy.Item):name = scrapy.Field()level = scrapy.Field()info = scrapy.Field()

三、制作爬虫 (spiders/itcastSpider.py)

爬虫功能要分两步:

1. 爬数据

  • 在当前目录下输入命令,将在mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域的范围:
scrapy genspider itcast "itcast.cn"
  • 打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码:
import scrapyclass ItcastSpider(scrapy.Spider):name = "itcast"allowed_domains = ["itcast.cn"]start_urls = ('http://www.itcast.cn/',)def parse(self, response):pass

其实也可以由我们自行创建itcast.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.itcast.cn/channel/teacher.shtml",)

修改parse()方法

def parse(self, response):with open("teacher.html", "w") as f:f.write(response.text)

然后运行一下看看,在mySpider目录下执行:

scrapy crawl itcast

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

一个Scrapy爬虫项目里,可以存在多个爬虫。各个爬虫在执行时,就是按照 name 属性来区分。

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


2. 取数据

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

<div class="li_txt"><h3>  xxx  </h3><h4> xxxxx </h4><p> xxxxxxxx </p>

是不是一目了然?直接上XPath开始提取数据吧。

  • 我们之前在mySpider/items.py 里定义了一个ItcastItem类。 这里引入进来
  from mySpider.items import ItcastItem
  • 然后将我们得到的数据封装到一个 ItcastItem 对象中,可以保存每个老师的属性:
from mySpider.items import ItcastItemdef parse(self, response):#open("teacher.html","wb").write(response.body).close()# 存放老师信息的集合items = []for each in response.xpath("//div[@class='li_txt']"):# 将我们得到的数据封装到一个 `ItcastItem` 对象item = ItcastItem()#extract()方法返回的都是字符串name = each.xpath("h3/text()").extract()title = each.xpath("h4/text()").extract()info = each.xpath("p/text()").extract()#xpath返回的是包含一个元素的列表item['name'] = name[0]item['title'] = title[0]item['info'] = info[0]items.append(item)# 直接返回最后数据return items
  • 我们暂时先不处理管道,后面会详细介绍。

保存数据

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始把其他的博客搬家到这里了

今天&#xff0c;用一晚上的时间进行一下文章的迁移吧。这样以后查询就可以在自己的博客中查找了&#xff0c;也算是给自己一个写作的规律。 从很多个大牛的博客中都阅读到&#xff0c;写博客对于一个coder的重要性。希望这次可以坚持。转载于:https://www.cnblogs.com/cyforev…

java系统高并发解决方案(转载)

转载博客地址&#xff1a;http://blog.csdn.net/zxl333/article/details/8685157 一个小型的网站&#xff0c;比如个人网站&#xff0c;可以使用最简单的html静态页面就实现了&#xff0c;配合一些图片达到美化效果&#xff0c;所有的页面均存放在一个目录下&#xff0c;这样的…

Request/Response【学习笔记03】

Request Request 部分源码&#xff1a; # 部分代码 class Request(object_ref):def __init__(self, url, callbackNone, methodGET, headersNone, bodyNone, cookiesNone, metaNone, encodingutf-8, priority0,dont_filterFalse, errbackNone):self._encoding encoding # t…

TotoiseSVN的上手教程

本文转自&#xff1a;http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html TotoiseSVN的基本使用方法&#xff1a; 一、签入源代码到SVN服务器 假如我们使用Visual Studio在文件夹StartKit中创建了一个项目&#xff0c;我们要把这个项目的源代码签入到SVN Serv…

ALV可输入状态下输入金额字段变小数的问题

http://blog.163.com/mxb_sapyeah/blog/static/10335262520167109022155/ 小数位数两位 当我在给ALV上给该字段输入整数 ‘1234 ‘ 时&#xff0c;该数据居然会默认变成‘12.34’ 可以在这里解决这个问题。就是定义字段目录的时候&#xff0c;对于金额字段指定参考数据类型就…

Downloader Middlewares反反爬虫【学习笔记04】

反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying degrees of sophistication. Getting around those measures can be difficult and tricky, and may sometimes require special infrastructure. Please consi…

【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

转自&#xff1a;【欧阳鹏】http://blog.csdn.net/ouyang_peng Android 设备的CPU类型(通常称为”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.arm64-v8a: 第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星 G…

HDFS的简介及基本操作(常用的命令参数介绍)

目录前言&#xff1a;1、HDFS基本概念2、HDFS基本操作总结&#xff1a; 目录 前言&#xff1a; 总算有空来接着写大数据的学习笔记了&#xff0c;今天就把之前学过的HDFS的基础知识详细的介绍一下&#xff0c;如有哪点写的不足希望大家多多指教。 1、HDFS基本概念 1.1、前…

Settings【学习笔记05】

Settings Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core)&#xff0c;插件(extension)&#xff0c;pipeline及spider组件。比如 设置Json Pipeliine、LOG_LEVEL等。 参考文档&#xff1a;http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/setti…

java命令

javac.exe是编译.java文件java.exe是执行编译好的.class文件javadoc.exe是生成Java说明文档jdb.exe是Java调试器javaprof.exe是剖析工具转载于:https://www.cnblogs.com/Berryxiong/p/6143016.html

TensorFlow训练单特征和多特征的线性回归

线性回归 线性回归是很常见的一种回归&#xff0c;线性回归可以用来预测或者分类&#xff0c;主要解决线性问题。相关知识可看“相关阅读”。 主要思想 在TensorFlow中进行线性回归处理重点是将样本和样本特征矩阵化。 单特征线性回归 单特征回归模型为&#xff1a;ywxb 构建模…

大数据之HDFS应用开发(java API)

目录1、搭建开发环境2、获取api中的客户端对象3、DistributedFileSystem实例对象所具备的方法4、HDFS客户端操作数据代码示例 目录 1、搭建开发环境 window下开发的说明: A、在windows的某个目录下解压一个hadoop的安装包 B、将安装包下的lib和bin目录用对应windows版本平…

shell脚本执行方式,更方便更快捷。

在进行linux测试时编写脚本是必不可少的。最近经常使用Linux&#xff0c;感觉太频繁地敲击键盘有些累了&#xff0c;于是想到了Shell脚本。可以把太多的命令写成一个脚本&#xff0c;这样每次执行一遍 shell文件&#xff0c;就可以省去了敲击键盘的时间。于是在网上搜了一些有…

行为科学统计第1章

行为科学统计 Statistics for the Behavioral Sciences 一周只学习一次不如每周学习比较多的几次高效噢&#xff5e;&#xff3b;一开始&#xff0c;你并不知道这是一个会写着画风突变的读书笔记?…&#xff3d; 第I部分 简述与描述性统计 第1章 统计学入门 这本书我就是觉得这…

闭包---在函数内部再定义一个函数

什么是闭包 # 定义一个函数 def test(number):# 在函数内部再定义一个函数&#xff0c;并且这个函数用到了外边函数的变量&#xff0c;那么将这个函数以及用到的一些变量称之为闭包def test_in(number_in):print("in test_in 函数, number_in is %d" % number_in)re…

慕课网_《Java实现对称加密》学习总结

时间&#xff1a;2017年4月11日星期二说明&#xff1a;本文部分内容均来自慕课网。慕课网&#xff1a;http://www.imooc.com教学示例源码&#xff1a;https://github.com/zccodere/s...个人学习源码&#xff1a;https://github.com/zccodere/s... 第一章&#xff1a;对称加密算…

大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)

目录前言&#xff1a;1、MapReduce原理2、mapreduce实践&#xff08;WordCount实例&#xff09; 目录 今天先总体说下MapReduce的相关知识&#xff0c;后续将会详细说明对应的shuffle、mr与yarn的联系、以及mr的join操作的等知识。以下内容全是个人学习后的见解&#xff0c;如…

生动形象的理解什么是装饰器!

装饰器 装饰器是程序开发中经常会用到的一个功能&#xff0c;用好了装饰器&#xff0c;开发效率如虎添翼&#xff0c;所以这也是Python面试中必问的问题&#xff0c;但对于好多初次接触这个知识的人来讲&#xff0c;这个功能有点绕&#xff0c;自学时直接绕过去了&#xff0c;…

PLSQL 申明和游标

--从键盘输入一个数 accept b prompt 请输入一个大于零的数字; declareanum number : &b; beginwhile anum>0loopdbms_output.put_line(anum);anum:anum-1;end loop; end;declarev_num number; begin -- 从stsu表中选出id最大的值&#xff0c;并根据该值打印次数select …

20155222 2016-2017-2 《Java程序设计》第8周学习总结

20155222 2016-2017-2 《Java程序设计》第8周学习总结 教材学习内容总结 Java NIO(New IO)是一个可以替代标准Java IO API的IO API&#xff08;从Java 1.4开始)&#xff0c;Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers&#xff08;通道和缓冲区&…