scrapy入门案例
一. 新建项目(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/ 网站里的所有讲师的标题、描述、详情链接地址和日期。
打开
scrapyDemo
目录下的items.pyItem 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)。
接下来,创建一个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对象来作为唯一参数,主要作用如下:- 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
- 生成需要下一页的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入门案例的更多相关文章
- Python爬虫Scrapy(二)_入门案例
本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...
- Scrapy 爬虫框架入门案例详解
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...
- 爬虫框架Scrapy入门——爬取acg12某页面
1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_ ...
- Scrapy 入门教程
Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通常我们可以很简单的通过 ...
- SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)
SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...
- SpringMvc核心流程以及入门案例的搭建
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- Struts2第一个入门案例
一.如何获取Struts2,以及Struts2资源包的目录结构的了解 Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...
- MyBatis入门案例、增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
随机推荐
- getResourceAsStream的路径问题
1.Class类的getResourceAsStream this.getClass().getResourceAsStream("/resource.properties"); ...
- JVM 整体流程介绍
一. JVM自身的物理结构 从图中可以看出 JVM 的主要组成部分 ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine( ...
- HTML那些标签已废弃,被代替
表单:cellpadding,cellspacing属性:已废弃, 替代者: table { border-collapse:collapse; } table, td, th { border:1p ...
- Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed.
解决方案有三种: 1,无视,直接commit自己的代码. git commit -m "your msg" 2,stash stash翻译为“隐藏”,如下操作: git stash ...
- Distance(2019年牛客多校第八场D题+CDQ+树状数组)
题目链接 传送门 思路 这个题在\(BZOJ\)上有个二维平面的版本(\(BZOJ2716\)天使玩偶),不过是权限题因此就不附带链接了,我也只是在算法进阶指南上看到过,那个题的写法是\(CDQ\), ...
- 项目Beta冲刺(3/7)(追光的人)(2019.5.25)
所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...
- Spring Boot 集成 Kafka
相关文章 网址 Spring Boot系列文章(一):SpringBoot Kafka 整合使用 http://www.54tianzhisheng.cn/2018/01/05/SpringBoot- ...
- Spring Boot 中的测试:JUnit
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html
- wordpress防止垃圾邮件的另一种方法
我们知道wordpress可以用Akismet插件防止垃圾邮件,前面ytkah还讲过contact form 7如何搭配Akismet过滤垃圾邮件,还有什么方法呢?我们留在网站上的邮箱有可能被爬虫批量 ...
- sqoop2相关实例:hdfs和mysql互相导入(转)
原文地址:http://blog.csdn.net/dream_an/article/details/74936066 超详细讲解Sqoop2应用与实践 2017年07月10日 20:06:57 阅读 ...