scrapy之初见
scrapy号称是当今最为强大的爬虫框架,是所有有兴趣接触爬虫学习同学绕不开的强大神器
5 + 2模块
scrapy爬虫组成一共有7个部分
Engine:不需要用户修改
- 控制所有模块之间的数据流
- 根据条件触发时间
Downloader:不需要用户修改
- 根据用户请求下载网页
Scheduler:不需要用户修改
- 对所有爬取请求进行调度管理
Downloader Middleware:用户可以编写配置代码
- 实施Engine, scheduler, Downloader之间进行用户的可配置的控制
- 修改,丢弃,新增请求或响应
Spider:需要用户编写
- 解析Downloader返回的响应(Response)
- 产生爬取项(scraped item)
- 产生额外的爬取请求(Request)
Item Pipelines:需要用户编写
- 以流水线的方式处理Spider产生的爬取项
- 由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型
- 可能操作包括:清理,检验和查重爬取项中的HTML数据,将数据存储到数据库
Spider Middleware:用户可以编写配置代码
- 对请求和爬取项的再处理
- 修改,丢弃,新增请求或爬取项
Scrapy常用命令
startproject:创建一个新工程 scrapy startproject< name >[dir]
genspider:创建一个爬虫 scrapy genspider [options]< name >< domai n>
settings:获取爬虫配置信息 scrapy setting[options]
crawl:运行一个爬虫 scrapy crawl< spider >
list:列出工程中所有爬虫 scrapy list
shell:启动URL调试命令行 scrapy shell[url]
步骤
1. 步骤一:建立一个Scrapy爬虫工程
进入你想建立工程的文件目录,输入command:scrapy startproject projectname
出现了from cryptography.hazmat.bindings._openssl import ffi, libImportError: DLL load failed: 操作系统无法运行 %1。问题,赶紧conda install openssl试试
问题照旧,再试下conda install -c conda-forge scrapy看看
问题依旧,怒删libeay.dll问题解决
生成的工程目录
projectname/ ->外层目录
scrapy.cfg ->部署Scrapy爬虫的配置文件(用于放在服务器上,在部署在服务器上的爬虫要改动,当前水平不用)
projectname/ ->Scrapy框架的用户自定义Python代码
- __init__.py -> 初始化脚本,不用修改
- Items.py ->Items代码模板(继承类),通常不用用户编写
- middlewares.py -> Middlewares代码模板(继承类),需要扩展middlewres的功能时需要修改
- pipelines.py -> Pipelines代码模板(继承类)
- settings.py -> Scrapy爬虫的配置文件,优化功能时要改
- spiders/ -> 工程中建立的爬虫,Spiders代码模板目录(继承类)
- __init__.py ->初始文件,无需修改
- __pycache__/ ->缓存目录,无需修改
步骤二:在工程中产生一个scrapy爬虫
scrapy genspider spidername spiderurl
此条命令后就会生成一个文件spidername.py
# -*- coding: utf-8 -*-
import scrapy
class Demo1Spider(scrapy.Spider):#必须继承于scrapy.Spider的子类
name = 'demo1'
allowed_domains = ['python123.io']#只能爬取这个域名以下的网页
start_urls = ['http://python123.io/']#以列表形式存爬取的初始页面
def parse(self, response):#用于处理响应,解析内容形成字典,发现新的url
pass
步骤3:配置产生的spider爬虫
就是改spidername.py文件
# -*- coding: utf-8 -*-
import scrapy
class Demo2Spider(scrapy.Spider):
'''
name = 'demo2'
#allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
'''
def start_requests(self):
urls = ['http://python23.io/ws/demo.html']
for url in urls:
yield scrapy.Requests(url = url, callback = self.parser)
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
步骤4:运行爬虫,获取网页
scrapy crawl spidername
yield关键字
yield – 生成器
生成器是一个不断产生值的函数
包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
def gen(n):
for i in range(n):
yield i**2
for i in gen(5):
print(i, " ", end = "")
Scrapy爬虫的数据类型
Requests类
Response类
Item类
Requests类
- 表示一个http请求
- 由Spider生成,由Downloader执行
属性或方法
- .url Requests对应的请求url地址
- .method对应的请求的方法,’get’,’post’等
- .headers字典类型风格的请求头
- .body请求内容主题,字符串类型
- .meta用户添加的扩展信息,在Scrapy内部模块传递信息使用
- .copy()复制该请求
Response类
- 表示一个http响应
- 由Downloader生成,由spider执行
属性或方法
- .url Response对应的请求url地址
- .statusHTTP状态码
- .headers对应的头部信息
- .body对应的内容信息,字符串类型
- .flags一组标记
- .request产生Response类型对应的Request对象
- .copy()复制该响应
Items类
- 表示一个从HTML页面中提取的信息内容
- 由Spider生成,由pipline处理
- Item类似字典类型,可以按照字典类型操作
属性或方法
- Beautiful Soup
- CSSselector
- …
CSS Selector
< html >.css(‘a(标签名称)::attr(href)(属性标签)’).extract()