介绍
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'])
...
项目目录介绍
文件说明:
- scrapy.cfg 项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines 数据处理行为,如:一般结构化的数据持久化
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效**,正确写法USER_AGENT='xxxx'**
- spiders 爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
settings.py文件介绍
- 默认情况下,scrapy会遵循爬虫协议
- 可以通过修改配置文件参数,强行爬取,不遵循协议
ROBOTSTXT_OBEY = False
- 配置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'
- 配置日志级别,不配置的话在带运行日志的情况下会打印所有的日志
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/文件中
- 在items.py中写一个类
- 在爬虫文件中导入,在parse方法中实例化得到item对象
- 将数据放到item对象中,使用
yield
关键字返回- 在settings.py中配置(数字越小优先级越高)
ITEM_PIPELINES = { 'firstscrapy.pipelines.ChoutiFilePipeline': 300, .... }
- 在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