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 ...
随机推荐
- Linux系统禁止root账号远程登录
修改配置文件/etc/ssh/sshd_config,去掉PermitRootLogin前的注释,修改值为no,然后重启sshd服务即可 #LoginGraceTime 2m PermitRootLo ...
- rest framework 之路由系统
一.自定义路由 1.urls.py from django.conf.urls import url, include from web.views import s11_render urlpatt ...
- xadmin引入django-debug-toolbar调试工具
一.安装: pip install django-debug-toolbar 安装django-debug-toolbar库 https://github.com/jazzband/django-de ...
- php组合设计模式(composite pattern)
过十点. <?php /* The composite pattern is about treating the hierarchy of objects as a single object ...
- Oracle的去重函数 distinct
原贴地址:http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html#m0 SQL中distinct的用法 1.作用于单列 2.作 ...
- 公司框架-关于verifyInputgbg()方法的使用注意事项
verifyInputgbg这个方法的主要作用是:一次校验页面上的所有非空的比录项. 今天在使用这个方法的时候,遇到了这样一个问题,自己在页面上明明都录入有值,但是在还是报页面的录入信息不完整.阻断. ...
- three arrays HDU - 6625 (字典树)
three arrays \[ Time Limit: 2500 ms \quad Memory Limit: 262144 kB \] 题意 给出 \(a\),\(b\) 数组,定义数组 \(c[i ...
- 使用openrc 管理容器中的服务
对于后台任务一般是不建议在容器中运行的,但是如果我们为了简化应用的部署,可能会使用后台任务进行服务的管理,类似的 工具很多,supervisor,systemd , init.d 同时对于docker ...
- kafka中的offset概念
在 Kafka 中无论是 producer 往 topic 中写数据, 还是 consumer 从 topic 中读数据, 都避免不了和 offset 打交道, 关于 offset 主要有以下几个概念 ...
- STL next_permutation 全排列
调用方法: ]={,,,}; )){ ;i<;i++) printf("%d ",arr[i]); puts(""); } 测试效果: 注:可以看到1 2 ...