Scrapy简介
一种纯python实现的,基于twisted异步爬虫处理框架。优点
基本组件概念
Scrapy主要包含5大核心组件:
- 引擎(scrapy)
- 调度器(Scheduler)
- 下载器(Downloader)
- 爬虫(Spiders)
- 项目管道(Pipeline)
项目实践
开发环境: win10 + python3.6 + scrapy2.4.1
1、项目创建
首先进入CMD命令窗口,输入如下命令:
scrapy startproject xxxx #xxxx代表你要创建的项目名
执行命令后会生成相应的项目文件,如下所示:
各文件结构作用说明:
- spiders目录: 负责存放继承自scrapy的爬虫类。里面主要是用于分析response并提取返回的item或者是下一个URL信息,每个Spider负责处理特定的网站或一些网站。
- _init_.py: 项目的初始化文件。
- items.py: 负责数据模型的建立,类似于实体类。定义我们所要爬取的信息的相关属性。Item对象是种容器,用来保存获取到的数据。
- middlewares.py: 自己定义的中间件。可以定义相关的方法,用以处理蜘蛛的响应输入和请求输出。
- pipelines.py: 负责对spider返回数据的处理。在item被Spider收集之后,就会将数据放入到item pipelines中,在这个组件是一个独立的类,他们接收到item并通过它执行一些行为,同时也会决定item是否能留在pipeline,或者被丢弃。
- settings.py: 负责对整个爬虫的配置。提供了scrapy组件的方法,通过在此文件中的设置可以控制包括核心、插件、pipeline以及Spider组件。常见配置参数
- scrapy.cfg: scrapy基础配置,scrapy项目如何通过scrapy.cfg切换配置文件
2.在item.py文件中定义实体数据
如:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class ZhilianItem(scrapy.Item):
job =scrapy.Field()
number = scrapy.Field()
company = scrapy.Field() #公司名称
logo = scrapy.Field() #公司logo
website = scrapy.Field() #公司主页
# positionUrl = scrapy.Field() #职位首页
city = scrapy.Field() #工作城市
job_place = scrapy.Field() #工作地点
min_wage = scrapy.Field()
max_wage = scrapy.Field()
education = scrapy.Field()
industry = scrapy.Field() #公司属性 property
scale= scrapy.Field() #公司规模
post_type = scrapy.Field() #job_type
job_experience = scrapy.Field()
job_benefits = scrapy.Field()
job_duty = scrapy.Field() #工作城市,为空
update_time = scrapy.Field()
3.在spiders目录中编写具体爬虫文件
编写第一个scrapy蜘蛛,最后通过yield item语句可将数据送入piplines组件中执行数据固化操作。
4.编写piplines组件(需要激活),用于存储item数据
scrapy框架之Pipeline管道类
Scrapy用Pipeline写入MySQL
爬虫 异步数据写入框架 (adbapi)
5.启动爬虫
方式一, 在cmd命令行中输入如下命令:
scrapy crawl xxxx #xxxx为定义在某个spiders组件中的name
方式二, 通过编写python文件,此文件位于spiders文件夹中:
# -*- coding: utf-8 -*-
# 主程序入口
from scrapy.cmdline import execute
# cmd运行命令行程序
execute(['scrapy', 'crawl', 'xxxx']) #xxxx为定义在某个spider组件中的name
其它
动态传参
python scrapy 传入自定义参数需要注意的几点,使用-a传参时,当具有多个参数是,使用多个-a命令即可:如:
scrapy carwl 爬虫名 -a arg1=argval -a arg2=argval2
采用execute方法执行时,同理,如:
execute(f"scrapy crawl ZhiLianSpider -a log_file_name={log_file_name} -a job_type_str={job_type_str}".split())
部署web端scrapy项目
参考: spider-通过scrapyd网页管理工具执行scrapy框架
所需python包(本地测试时,一个电脑既可以是服务器端也可以是客户端):
- pip install scrapyd (服务器端)
- pip install scrapyd-deploy (客户端)
- pip install pywin32
可通过scrapyd-deploy将scrapy项目部署(部署前需要在scrapy项目中的.cfg文件中进行相关配置)到装有scrapyd组件上的服务器上,即可通过url链接控制scrapy爬虫项目的相关执行流程。可通过访问服务器端URL链接的方式(如http://127.0.0.1:6800/)来监控当前爬虫状态。
动态传参
参数定义方式和命令行运行项目时一样,不同的是传递参数的过程是通过url来执行的,如:
http://localhost:6800/schedule.json
(post方式,data={"project":myproject,"spider":myspider,"arg1":arg1val})
data参数也可拼接在url后面,通过?和&连接。
除此之外,也可通过curl命令进行访问,如:
curl http://localhost:6800/schedule.json -d project=ZhiLian -d spider=ZhiLianSpider -d log_file_name=test -d job_type_str=ss
除此之外,还可通过访问其它Url链接来获取当前爬虫的执行状态。
详参: django–中运行scrapy框架
PS: 每次修改更新scrapy项目后,都要保存重新部署项目。