scrapy官方文档http://doc.scrapy.org/en/latest/

一、scrapy安装

安装lxml:pip3 install lxml

安装wheel:pip3 install wheel

安装Twisted:pip3 install Twisted

安装pyOpenSSL:pip3 install C:\Users\penghuanhuan\Downloads\pyOpenSSL-19.0.0-py2.py3-none-any.whl

https://pypi.org/project/pyOpenSSL/#files下载whl文件

安装pywin32:pip3 install pywin32安装

安装scrapy:pip3 install scrapy

通过执行scripy验证是否安装完成,如下,输入scrapy会输出版本及使用介绍。

二、scrapy基本用法

  • 创建项目:scrapy startproject projectname,创建的项目保存在当前的路径下
  • 进入项目:cd projectname
  • 创建爬虫:scrapy genspidr 爬虫名 url,默认使用basic模板
  • 运行爬虫:scrapy crawl 爬虫名,通过scrapy crawl可查看该命令的用法介绍
  • shell:scrapy shell url可在命令行进入shell进行调试,结果保存在response中,exit()退出shell
  • view:scrapy view url,将网页源代码下载到本地并通过浏览器打开,通过scrapy view可查看该命令用法介绍
  • fetch:scrapy fetch url,直接将日志和网页源代码输出在屏幕上,通过scrapy fetch可查看该命令用法介绍
  • runspider:scrapy runspider spider_file,参数为爬虫文件的名称,带有.py后缀
  • settings:scrapy settings --get varname,获取配置文件中的变量值,如果在项目下运行输出项目的配置,否则输出scrapy对应的默认值
  • 生成文件:scrapy crawl 爬虫名 -o filename.json,运行爬虫并将网页源代码保存在文件中
  • 列出项目内所有爬虫:scrapy list
  • 查看模板:scrapy genspider -l,默认有basic、crawl、csvfeed、xmlfeed四个模板
  • - t 指定模板创建爬虫:scrapy genspidr -t 模板名称 爬虫名 url
  • 检查语法错误:scrapy check 爬虫名
  • scrapy version:查看scrapy的版本,加参数-v可查看依赖库及其对应的版本
  • scrapy bench:查看当前网速下爬虫的速度

例如要爬取quotes.toscrape.com页面

执行完成后通过pycharm打开项目,文件结构如下,爬虫文件为spiders下的scrapy1.py,最原始的内容如下。

        

三、scrapy项目文件

1.爬虫文件

scrapy爬虫不能直接执行项目的爬虫文件,需要在cmd命令行或者pycharm的terminal通过scrapy crawl 爬虫名来执行。

爬虫文件在项目的spiders目录下,定义了一个继承scrapy.Spider的类,类名为“爬虫名Spider”,并自带一个空的parse方法,该方法接收一个response即爬虫结果。

name为爬虫的名称,allowed_domains为允许爬取的域名,start_urls为爬取的网站url

如果爬虫正常运行,那么response=<200 http://quotes.toscrape.com>,并且可通过response.url获取正在爬取的网址。

爬虫执行时会自动执行类的parse方法,默认创建的parse方法为空,因此看不到任何返回结果,可修改为打印response的文本查看parse方法的执行。

2.items文件

items文件定义了一个继承scrapy.Item的类,它定义了要爬取的数据结构,例如要爬取quotes.toscape.com页面的名言、作者和标签,可改写该类,对其定义text、author、tags三个属性,类型为scrapy.Field。

       

然后在爬虫文件中实例化items文件定义的类,并将爬取到的信息赋值给实例通过yield返回。

from .. import items
def parse(self, response):
for quote in response.css('.quote'):
item = items.Scrapy1Item()
item['text'] = quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tag::text').extract()
yield item

上述是只爬取了创建爬虫的第一个url页面,而实际通常要爬取多个页面,这就需要在爬虫文件的parse方法定义下一个要爬取的url,并通过scrapy.Request(url)实现循环爬取。

def parse(self, response):
for quote in response.css('.quote'):
item = items.Scrapy1Item()
item['text'] = quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tag::text').extract()
yield item
next_page = response.css('.pager .next a::attr(href)').extract_first()
next_url = response.urljoin(next_page)
yield scrapy.Request(next_url,callback=self.parse)

执行爬虫时可通过加上-o参数,将爬取到的结果以json的形式保存,scrapy crawl scrapy1 -o scrapy1.json,文件存放在项目的根目录下。

scrapy还支持其他的格式,scrapy1.jl (每个结果为一行,即json去掉[]后的每一个对象)、scrapy1.csv、scrapy1.xml、scrapy1.pickle、scrapy1.marshal

也可直接将结果上传至ftp,scrapy crawl scrapy1 -o ftp://ftp.example.com/path/name.csv。

3.pipelines文件

pipelines文件默认也定义了一个类,通过类的process_item方法用于对获取到的数据进行处理,process_item方法默认返回得到数据。

要想使pipelines文件生效,需要修改settings文件的ITEM_PIPELINES参数,该参数默认是被注释的。pipelines文件可定义多个类,每个类都需要在settings的ITEM_PIPELINES中设置,如下,后面值的表示数据处理的优先级,值越小优先级越高。

ITEM_PIPELINES = {
'firstscrapy.pipelines.Scrapy1Pipeline': 300,
'firstscrapy.pipelines.test': 400,
}

要将爬取到的数据写入mongoDB,可在Pipeline文件中定义MongoPipeline类并在ITEM_PIPELINES中设置,如下。

import pymongo
class MongoPipeline(object):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_uri = crawler.settings.get('MONGO_URI'), #MONGO_URI='localhost',MONGO_DB='firstscrapy',已在settings文件中定义
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()

scrapy基本用法的更多相关文章

  1. scrapy shell 用法(慢慢更新...)

    scrapy shell 命令 1.scrapy shell url #url指你所需要爬的网址 2.有些网址数据的爬取需要user-agent,scrapy shell中可以直接添加头文件, 第①种 ...

  2. scrapy xpath用法

    一.实验环境 1.Windows7x64_SP1 2.anaconda3 + python3.7.3(anaconda集成,不需单独安装) 3.scrapy1.6.0 二.用法举例 1.开启scrap ...

  3. scrapy Formrequest用法(豆瓣登录案例)

    # -*- coding: utf-8 -*-import scrapyfrom scrapy.http import Request,FormRequest class DbSpider(scrap ...

  4. Scrapy Item用法示例(保存item到MySQL数据库,MongoDB数据库,使用官方组件下载图片)

    需要学习的地方: 保存item到MySQL数据库,MongoDB数据库,下载图片 1.爬虫文件images.py # -*- coding: utf-8 -*- from scrapy import ...

  5. Scrapy高级用法

    日志相关 一.日志相关变量 LOG_LEVEL = '' LOG_FILE = '文件名.log' 二.日志级别 5 CRITICAL :严重错误 4 ERROR :普通错误 3 WARNING :警 ...

  6. scrapy Selector用法及xpath语法

    准备工作 html示例: <?xml version="1.0" encoding="UTF-8"?> <html <head> ...

  7. Scrapy详解

    一.爬虫生态框架 在管道传数据只能传字典和items类型. 将 上一return语句注释则会报错  如: 如上图,爬虫文件中有一个name属性,如果多个爬虫可以通过这个属性在管道控制分析的是哪个爬虫的 ...

  8. Scrapy爬取美女图片第三集 代理ip(上) (原创)

    首先说一声,让大家久等了.本来打算那天进行更新的,可是一细想,也只有我这样的单身狗还在做科研,大家可能没心思看更新的文章,所以就拖到了今天.不过忙了521,522这一天半,我把数据库也添加进来了,修复 ...

  9. scrapy shell命令的【选项】简介

    在使用scrapy shell测试某网站时,其返回400 Bad Request,那么,更改User-Agent请求头信息再试. DEBUG: Crawled () <GET https://w ...

随机推荐

  1. git和github入门指南(2.2)

    2.4.常用git命令 2.4.1.回顾前面使用的命令 1.git add 文件名 这个命令用来将代码提交到暂存区 2.git status 可以查看当前提交的状态 3.git commit -m ' ...

  2. 基于AOP和ThreadLocal实现日志记录

    基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...

  3. 【Xamarin.Forms 3】页面类型

    系列目录 微信 1.[Xamarin.Forms 1]App的创建与运行 2.[Xamarin.Forms 2]App基础知识与App启动 知乎 1.[Xamarin.Forms 1]App的创建与运 ...

  4. 自描述C++部分面试题集

    1.谈谈啥叫对象成员以及对象成员的构造函数调用调用方式. 在类中定义的数据成员一般都是基本的数据类型.但是类中的成员也可以是对象,叫做对象成员. C++中对对象的初始化时非常重要的操作,当创建一个对象 ...

  5. js 图片压缩上传(base64位)以及上传类型分类

    一.input file上传类型 1.指明只需要图片 <input type="file" accept='image/*'> 2.指明需要多张图片 <input ...

  6. MySQL调优 优化需要考虑哪些方面

    MySQL调优 优化需要考虑哪些方面   优化目标与方向定位 总体目标:使得响应时间更快,吞吐量更大. (throughout --- 吞吐量:单位时间内处理事务的数量) 如何找到需要优化的地方 使用 ...

  7. 洛谷 P4408 [NOI2003]逃学的小孩

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  8. Uni-app登录态管理(vuex)

    应用中,保持登录状态是常见需求,本文讲解使用uni-app框架时如何保持用户登录状态. 即:初次进入应用为未登录状态------->登录---------->关闭应用,再次打开------ ...

  9. .Net Core 2.2升级3.1的避坑指南

    写在前面 微软在更新.Net Core版本的时候,动作往往很大,使得每次更新版本的时候都得小心翼翼,坑实在是太多.往往是悄咪咪的移除了某项功能或者组件,或者不在支持XX方法,这就很花时间去找回需要的东 ...

  10. java 基本语法(十) 数组(三) 二维数组

    1.如何理解二维数组? 数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则,此数组A称为二维数组. 2.二维数组的声明与初始化 正确的方式: int[ ...