目录
一、Scrapy是什么?
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
二、Scrapy五大基本构成
Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。
(1)、调度器(Scheduler):
调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。
(2)、下载器(Downloader):
下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。
(3)、 爬虫(Spider):
爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
(4)、 实体管道(Item Pipeline):
实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。
(5)、Scrapy引擎(Scrapy Engine):
Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。
三、整体架构图
四、安装步骤
1.下载并安装
pip install scrapy
2.项目建立&爬虫命令
scrapy startproject 项目名
scrapy genspider 爬虫名 域名
scrapy crawl 爬虫名
复制代码
示例演示:
scrapy startproject scrapy2209
cd scrapy2209
scrapy genspider baidu www.baidu.com
复制代码
创建后目录大致页如下
|-ProjectName #项目文件夹
|-ProjectName #项目目录
|-items.py #定义数据结构
|-middlewares.py #中间件
|-pipelines.py #数据处理
|-settings.py #全局配置
|-spiders
|-_ init _.py #爬虫文件
|-baidu.py
|-scrapy.cfg #项目基本配置文件
import scrapy
class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['www.baidu.com']
start_urls = ['http://www.baidu.com/']
def parse(self, response):
tile=response.xpath('//html/head/title/text()')
print(tile)
复制代码
打开一个终端cmd,输入scrapy crawl baidu(爬虫名),就可以看到一大堆输出信息,而其中就包括我们要的内容
有时候会出现403错误:
[scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 beijing.8684.cn/x_35b1e697>: HTTP status code is not handled or not allowed
那是因为——被屏蔽了,我们来伪装一下,在settings.py文件里加上USER_AGENT:
出来了!!
四、日志等级与日志保存
在setting.py里面可以设置日志的等级与日志存放的路径
相关变量
LOG_LEVEL= ""
LOG_FILE="日志名.log"
日志等级分为
1.DEBUG 调试信息
2.INFO 一般信息
3.WARNING 警告
4.ERROR 普通错误
5.CRITICAL 严重错误
如果设置
LOG_LEVEL="WARNING",就只会WARNING等级之下的ERROR和CRITICAL
默认等级是1
五、导出为json或scv格式
执行爬虫文件时添加-o选项即可
scrapy crawl 项目名 -o *.csv
scrapy crawl 项目名 -o *.json
对于json文件,在setting.js文件里添加,设置编码格式,否则会乱码:
FEED_EXPORT_ENCODING='utf-8'
示例:
from scrapy import cmdline
cmdline.execute('scrapy crawl baidu -o baidu.csv'.split())
复制代码
六、参考文献
python scrapy 报错 DEBUG: Ignoring response 403 - 时光不改 - 博客园 (cnblogs.com) Scrapy爬虫框架,入门案例(非常详细)_JJH的创世纪-DevPress官方社区 (csdn.net)