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方法). 方法 ...
随机推荐
- pc端配置详细 2017级机械设计新生 史浩然
品牌名称:SAMSUNG/三星 证书状态:有效 申请人名称:苏州三星电子电脑有限公司 型号:940X3K-K01 操作系统:window8.1 产品名 ...
- windows时间同步脚本
#!/usr/bin/env python# -*- coding:UTF-8 -*-# 脚本用于windows时间同步,设置window计划任务每五分钟执行一次 import timeimport ...
- 记一次insert因为db file sequential read影响性能导致性能原因的分析
通过详细的10046 trace发现,大量的io等待分布在以下数据文件上:Misses in library cache during parse: 0Elapsed times include wa ...
- January 29 2017 Week 5 Sunday
In order to be irreplaceable one must always be different. 若想无可替代,必须与众不同. If all your skills or pers ...
- java 开发常用IDE
1.IntelliJ IDEA 2.eclipse 3.netbeans 这三个IDE都不错,据说IntelliJ IDEA最好,主要还是看个人喜好和需要.
- 高CPU业务
高CPU业务 Gearman是当年LiveJournal用来做图片resize的,大家也明白图片resize是一个高CPU的操作,如果让web网站去做这个高CPU的功能,有可能会拖垮你的 web应用, ...
- Java 中的引用
JVM 是根据可达性分析算法找出需要回收的对象,判断对象的存活状态都和引用有关. 在 JDK1.2 之前这点设计的非常简单:一个对象的状态只有引用和没被引用两种区别. 这样的划分对垃圾回收不是很友好, ...
- IOS ASI (第三方请求)
什么是ASI全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大基于底层的CFNetwork框架,运行效率很高可惜作者早已停止更新,有一些潜在的BUG无人去解决很多公司的旧项目里面 ...
- AngularJs学习笔记--Understanding the Model Component
原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular文档讨论的上下文中,术语“model”可以 ...
- iOS学习笔记09-核心动画CoreAnimation
http://www.cnblogs.com/liutingIOS/p/5368536.html 一.CALayer CALayer包含在QuartzCore框架中,具有跨平台性,在iOS中使用Cor ...