[ SPIDER ] scrapy 框架简介

介绍

Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。

scrapy的执行流程

开发者只需要在固定的位置写固定的代码(写的最多的就是spider)

  • 五大组件

引擎(EGINE):大总管,负责控制数据的流向;

调度器(SCHEDULER):由它来决定下一个要抓取的网址是什么,去重;

下载器(DOWLOADER):用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的;

爬虫(SPIDERS):开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求request;

项目管道(ITEM PIPLINES):在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

  • 两大中间件

爬虫中间件:位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入和输出(用的很少)

下载中间件:引擎和下载器之间,加代理,加头,集成selenium

scrapy安装

Linux/mac下安装

pip3 install scrapy

window下安装

直接使用pip3 install scrapy安装可能会有一部分安装不成功,安装不成功的话就采用下述解决方案。

1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:www.lfd.uci.edu/~gohlke/pyt… 2、pip3 install lxml 3、pip3 install pyopenssl 4、下载并安装pywin32:sourceforge.net/projects/py… 5、下载twisted的wheel文件:www.lfd.uci.edu/~gohlke/pyt… 6、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl 7、pip3 install scrapy

安装完成之后打开cmd直接输入scrapy验证是否安装成功(python解释器下的scripts文件夹需要放在环境变量中),安装成功之后就可以在指定目录下创建scrapy项目了。

scrapy创建及运行项目

创建项目

命令行cd到指定目录下创建爬虫项目

创建爬虫项目的命令:scrapy startproject 项目名称(尽量不要使用中文)

scrapy startproject myscrapy

创建爬虫文件

在命令行中创建爬虫文件需要先cd到项目文件夹中cd myscrapy,在执行创建爬虫文件命令。

在pycharm中使用终端直接创建爬虫文件即可。

创建爬虫文件命令: scrapy genspider 爬虫文件名 爬虫地址

scrapy genspider chouti dig.chouti.com
# 一执行就会在spider文件夹下创建出一个py文件,名字叫chouti

终端(teminal)运行爬虫

  • 带运行日志

scrapy crawl chouti

  • 不带运行日志

scrapy crawl chouti --nolog

支持右键执行爬虫文件

在与spiders文件夹相同路径的文件夹下新建一个main.py(名字任意)

想执行多个爬虫,就一条一条增加。

直接右键运行main.py就可以执行在该文件中写入的爬虫文件

from scrapy.cmdline import execute


execute(['scrapy','crawl','chouti','--nolog'])
execute(['scrapy','crawl','baidu'])
...

项目目录介绍

文件说明:

  1. scrapy.cfg 项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
  2. items.py 设置数据存储模板,用于结构化数据,如:Django的Model
  3. pipelines 数据处理行为,如:一般结构化的数据持久化
  4. settings.py 配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效**,正确写法USER_AGENT='xxxx'**
  5. spiders 爬虫目录,如:创建文件,编写爬虫规则

注意:一般创建爬虫文件时,以网站域名命名

settings.py文件介绍

  1. 默认情况下,scrapy会遵循爬虫协议
  2. 可以通过修改配置文件参数,强行爬取,不遵循协议
ROBOTSTXT_OBEY = False
  1. 配置USER_AGENT
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
  1. 配置日志级别,不配置的话在带运行日志的情况下会打印所有的日志
LOG_LEVEL = 'ERROR'

scrapy的数据解析⭐⭐⭐⭐⭐

  • xpath选择器
- 取文本
response.xpath('//a[contains(@class,"link-title")]/text()').extract()
- 取属性
response.xpath('//a[contains(@class,"link-title")]/@href').extract()

  • css选择器
- 取文本
response.css('.link-title::text').extract()
- 取属性
response.css('.link-title::attr(href)').extract_first()

  • 提取数据
- 提取所有,结果放在一个列表中
response.xpath('.....').extract()

- 提取第一条
response.xpath('.....').extract()[0]
response.xpath('.....').extract_first()

scrapy的持久化存储⭐⭐⭐⭐⭐

  • 方案一:爬虫文件中的parse函数必须返回列表套字典的形式(了解)

    会限制存储文件的格式

scrapy crawl chouti -o chouti.csv

  • 方案二:pipeline item存储到redis/mysql/文件中
  1. 在items.py中写一个类
  2. 在爬虫文件中导入,在parse方法中实例化得到item对象
  3. 将数据放到item对象中,使用yield关键字返回
  4. 在settings.py中配置(数字越小优先级越高)
ITEM_PIPELINES = {
   		'firstscrapy.pipelines.ChoutiFilePipeline': 300,
    ....
		}
  1. 在pipelines.py中写ChoutiFilePipeline(写入数据库为例)
 
 
port pymysql
class ChoutiMysqlPipeline(object):
    # 进来时仅执行一次该方法
    def open_spider(self,spider):
        self.conn=pymysql.connect( host='127.0.0.1', user='root', ,
                 database='chouti', port=3306)
   
	# 退出时仅执行一次该方法
    def close_spider(self,spider):
        self.conn.close()
        
    def process_item(self, item, spider):
        cursor=self.conn.cursor()
        sql='insert into article (title,url,photo_url)values(%s,%s,%s) '
        cursor.execute(sql,[item['title'],item['url'],item['photo_url']])
        self.conn.commit()
        yield item		# 如果有多个管道流,此处必须要返回item;否则后续的管道接收不到需要的item

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值