一.什么是scrapy?
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
二.组件
-
引擎(Scrapy Engine):是整个scrapy框架的核心,负责各大组件之间的通讯,信号、数据传递等
-
爬虫(Spider):对response对象进行数据提取,一是提取出所需url封装成request对象交给Engine以进入Scheduler,二是提取数据交给Engine,由其交给Pipeline进行保存处理
-
调度器(Scheduler):接受由引擎传来的request请求对象并对其进行排列进入队列,在Engine需要时交还request对象
-
下载器(Downloader):接受由Engine从Scheduler获取传来的request对象进行访问,返回访问该request对象后的response对象
-
管道(Item Pipeline):负责对由Spider解析后传来的数据进行处理,如存储到文本,数据库
-
下载器中间件(Downloader Middlewares):介于Engine和Downloader之间的中间件,主要功能为添加ip代理,添加cookie,添加UA,请求重试
-
爬虫中间件(Spider Middlewares):介于Engine和Spider之间的中间件,主要功能为处理响应,请求,数据项
三.基本工作流程
- Spider对url进行封装为request对象交给Engine,由Engine交给Scheduler
- Scheduler接受request对象对其进行排列后入队
- Engine接受Scheduler返还的request对象并将其交给Downloader
- Downloader接收request对象并访问,最后返还response对象并交由Engine
- Engine将response对象交给Spider
- Spider对response对象进行解析,将数据中所需url步骤1,其余提取的数据交由Engine再交给Item Pipeline进行处理
- Item Pipline接受Item后对其进行数据处理,如存储到数据库中
四.scrapy项目实战讲解
此处以4399为例
1.创建项目存放目录,单机右键打开于终端
2.创建项目
scrapy startproject game
当在此终端输入以上命令回车后出现如下图所示则代表项目创建成功
此时的scrapy目录结构如下图所示:
3.创建Spider
先进入到game中:
cd game
创建爬虫:
scrapy genspider xiao 4399.com
4399.com:允许爬的域名,为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域名不同,则被过滤掉。
创建成功:
4.Spider代码编写
import scrapy
class XiaoSpider(scrapy.Spider):
name = "xiao"
allowed_domains = ["4399.com"]
start_urls = ["http://4399.com/"]
def parse(self, response):
lilist = response.xpath('//div[@class="middle_3 cf"]/div/div[1]/ul[@class="tm_list "]/li')
for li in lilist:
name = li.xpath('./a/text()').extract_first()
img = li.xpath('./a/img/@lz_src').extract_first()
dic = {
'name' : name,
'img' : img,
}
yield dic
5.Pipelines代码编写
class GamePipeline:
def process_item(self, item, spider):
with open(r'F:\PycharmProjects\ljf\Spider\scrapy\game\game_file\name.txt','a+',encoding='utf-8') as file:
file.write(str(item)+'\n')
return item
项目中管道默认是不打卡的,我们需要在setting.py文件中将管道打开:
ITEM_PIPELINES = { "game.pipelines.GamePipeline": 300, }
当Piplines中存在多个类对数据进行处理时,字典中的value越大,优先级越低,value越小,优先级越高
6.启动Spider
scrapy crawl xiao
在启动Spider后将显示出一大堆日志信息,我们可以在setting.py文件中添加代码:
LOG_LEVEL = "ERROR"
以重新设置日志等级,此时只有大于等于ERROR级别的日志信息会进行显示
7.运行结果
ider后将显示出一大堆日志信息,我们可以在setting.py文件中添加代码:
LOG_LEVEL = "ERROR"
以重新设置日志等级,此时只有大于等于ERROR级别的日志信息会进行显示