Python3爬虫(十七) Scrapy框架(一)
Infi-chu:
http://www.cnblogs.com/Infi-chu/
1.框架架构图:

2.各文件功能
scrapy.cfg 项目的配置文件
items.py 定义了Item数据结构,所有Item的定义都可以放在这里
pipelines.py 定义了Item Pipeline的实现
settings.py 定义了项目的全局配置
middlewares.py 定义了spider 中间件和downloader中间件
spiders 每一个爬虫的实现,每一个爬虫对应一个文件
3.创建项目
scrapy startproject 项目名
4.创建爬虫
cd 项目名称
scrapy genspider spider名称 网站域名
创建后会生成一个包含文件名的spider类,其中有三个属性和一个方法
三个属性:
name 每个项目唯一的名字
allow_domains 允许爬取的域名
start_urls 在启动时爬取的URL列表
一个方法:
parse() 默认情况下,被调用start_urls里面的链接 构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数。这个方法是负责解析返回的响应、提取数据或进一步生成要处理的请求
5.创建Item
Item是保存爬虫的容器,他的使用方法和字典比较类似。
Item需要继承scrapy.Item类且定义类型是scrapy.Field字段。
能获取到的内容有比如有text、author、tags
import scrapy
class spider名Item(scrapy.Item):
text=scrapy.Field()
author=scrapy.Field()
tags=scrapy.Field()
6.解析response
在scrapy.Item类中可以直接对response变量包含的内容进行解析
divclass名.css('.text') 带有此标签的节点
divclass名.css('.text::text') 获取正文内容
divclass名.css('.text').extract() 获取整个列表
divclass名.css('.text::text').extract() 获取整个列表的内容
divclass名.css('.text::text').extract_first() 获取第一个
7.使用Item
对新创建的spider进行改写
import scrapy
from 项目名.item import spider名Item
class spider名Spider(scrapy.Spider):
name = '爬虫名'
allow_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com"] def parse(self,response):
r = response.css('.quote')
for i in r:
item = spider名Item()
item['text']=i.css['.text::text'].extract_first()
item['author']=i.css['.author::text'].extract_first()
item['tags']=i.css('.tags .tag::text').extract_first()
yield item
8.后续request
前面讲了初始页面的抓取,现在讲解之后的页面怎么抓取
class spider名Spider(scrapy.Spider):
name = '爬虫名'
allow_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com"] def parse(self,response):
r = response.css('.quote')
for i in r:
item = spider名Item()
item['text']=i.css['.text::text'].extract_first()
item['author']=i.css['.author::text'].extract_first()
item['tags']=i.css('.tags .tag::text').extract_first()
yield item next_page=response.css('.pager .next a::attr("href")').extract_first()
url=response.urljoin(next_page)
yield scrapy.Request(url=url,callback=self.parse) # url是请求链接,callback是回调函数,当指定了回调函数的请求完成之后,获取到响应,引擎将把这个响应作为参数传递给这个回调函数,回调函数将进行解析或生成下一个请求。
9.运行
scrapy crawl spider名
10.保存
#保存到JSON文件
scrapy crawl spider名 -o spider名.json # 输入
# 输出
scrapy crawl spider名 -o spider名.jl
scrapy crawl spider名 -o spider名.jsonlines
scrapy crawl spider名 -o spider名.csv
scrapy crawl spider名 -o spider名.pickle
scrapy crawl spider名 -o spider名.xml
scrapy crawl spider名 -o spider名.marshal
scrapy crawl spider名 -o ftp://username:password@.../spider名.xml
11.使用Item Pipeline
如果想存入到数据库或筛选有用的Item,此时需要用到我们自己定义的Item Pipeline
我们一般使用Item Pipeline做如下操作
清理HTML数据
验证爬取数据,检查爬取字段
查重并丢弃重复内容
将爬取结果保存到数据库
在pipelines.py文件中编写
import pymongo
from scrapy.exceptions import DropItem
class TextPipeline(obj):
def __init__(self):
self.limit=50 def process_item(self,item,spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip()+'...'
return item
else:
return DropItem('Missing Text') class MongoPipeline(obj):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri=mongo_uri
self.mongo_db=mongo_db @classmethod
def from_crawler(cls,crawl):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
) def open_spider(self,spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db] def process_item(self,item,spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item def close_spider(self,spider):
self.client.close()
在settings.py中编写
ITEM_PIPELINES = {
'项目名.pipelines.TextPipeline':300,
'项目名.pipelines.MongoPipeline':400,
}
MONGO_URI = 'localhost'
MONGO_DB = '项目名'
Python3爬虫(十七) Scrapy框架(一)的更多相关文章
- Python3 爬虫之 Scrapy 框架安装配置(一)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...
- Python3 爬虫之 Scrapy 核心功能实现(二)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...
- Python网络爬虫之Scrapy框架(CrawlSpider)
目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) ...
- 爬虫06 /scrapy框架
爬虫06 /scrapy框架 目录 爬虫06 /scrapy框架 1. scrapy概述/安装 2. 基本使用 1. 创建工程 2. 数据分析 3. 持久化存储 3. 全栈数据的爬取 4. 五大核心组 ...
- Python逆向爬虫之scrapy框架,非常详细
爬虫系列目录 目录 Python逆向爬虫之scrapy框架,非常详细 一.爬虫入门 1.1 定义需求 1.2 需求分析 1.2.1 下载某个页面上所有的图片 1.2.2 分页 1.2.3 进行下载图片 ...
- 爬虫之scrapy框架
解析 Scrapy解释 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓 ...
- Python学习---爬虫学习[scrapy框架初识]
Scrapy Scrapy是一个框架,可以帮助我们进行创建项目,运行项目,可以帮我们下载,解析网页,同时支持cookies和自定义其他功能. Scrapy是一个为了爬取网站数据,提取结构性数据而编写的 ...
- Python爬虫进阶(Scrapy框架爬虫)
准备工作: 配置环境问题什么的我昨天已经写了,那么今天直接安装三个库 首先第一步: ...
- 爬虫之Scrapy框架介绍
Scrapy介绍 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内 ...
- 16.Python网络爬虫之Scrapy框架(CrawlSpider)
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
随机推荐
- QT的组件布局
在QT的IDE下,编写一个自定义布局. #include<QApplication> #include<QWidget> #include<QSpinBox> #i ...
- oracle客户端plsql安装
1.确认版本 自己的操作系统版本(32位还是64位),oracle instant client(oracle客户端版本)和plsql版本 我自己的版本是:oracle客户端版本 64位,plsql ...
- Python学习---高阶函数的学习
高阶函数 高阶函数:函数名可以作为参数传递输入,函数名还可以作为返回值返回 函数名可以重新赋值,因为其本身就是一个变量 函数本身就是一个对象, 函数的变量名f本身就是指向函数本身的,加上括 ...
- Python学习---重点模块之logging
日志级别 日志级别 critical > error > warning > info > debug, 默认是从warning开始打印 import logging # 日 ...
- 文本处理三剑客之 Sed ——高级编辑命令
本篇介绍sed的高级编辑命令 高级编辑命令 P:打印模式空间开端至\n内容,并追加到默认输出之前 n: 读取匹配到的行的下一行覆盖至模式空间 N:读取匹配到的行的下一行追加至模式空间 h: 把模式空间 ...
- libevent-signal(1)
现在已经知道,libevent有三种事件类型,分别是时钟事件,信号事件,i/o事件.今天就分析一下信号事件,下面是一个简单的信号事件demo #include <sys/types.h> ...
- ASP.NET 页面基本优化.
一.禁用Browser Link(目前主要用来是刷新vs ide 浏览界面),直接干掉. <!-- Visual Studio Browser Link --> <script ty ...
- spring的声明式的事物管理和编程事务管理的区别
一.Spring对编程式事务的支持 Spring中的事务分为物理事务和逻辑事务: 物理事务:就是底层数据库提供的事务支持,如JDBC或JTA提供的事务: 逻辑事务:是Spring管理的事务,不同于物理 ...
- Thread-Specific-Storage for C/C++
引用出处:https://www.cse.wustl.edu/~schmidt/PDF/TSS-pattern.pdf 摘要: 理论上多线程会提高程序性能,但实际上,由于在获取和释放锁的开销,多线程经 ...
- Hibernate之openSession与getCurrentSession的区别
openSession 与 getCurrentSession的区别(1)openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定 ...