scrapy框架学习

scrapy框架的概念和流程

scrapy是一个python编写的开源网络爬虫框架。它被设计用于爬取网络数据、提取结构性数据的框架。

少量的代码,就能够快速的抓取

工作流程

爬虫流程:

变形之后的scrapy流程:

   

1.爬虫起始url构造成request对象-->爬虫中间件-->引擎-->调度器

2.调度器把request-->引擎-->下载中间件-->下载器

3.下载器发送请求,获取response响应-->下载中间件--->引擎---->爬虫中间件---爬虫

4.1爬虫提取url地址,组装成request对象--->爬虫中间件--->引擎-->调度器,重复步骤2

4.2爬虫提取数据-->引擎-->管道处理和保存数据

scrapy的三个内置对象

  • request请求对象:由url method post_data headers等构造
  • response响应对象:由url body status headers等构成
  • item数据对象:本质是个字典

scrapy中每个模块的具体作用

scrapy入门使用

创建一个爬虫项目:输入命令scrapy startproject 模块名称

创建爬虫目标文件: 输入scrapy genspider 爬取名 网站域名

运行scrapy:scrapy crawl <爬虫名字>

完善爬虫

修改起始url

检查修改允许的域名

在parse方法中实现爬取逻辑

注意:

  • scrapy.Spider爬虫类中必须有名为parse的解析
  • 如果网站结果层次比较复杂,也可以自定义其他解析函数
  • 在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_url中的url地址不受这个限制
  • 启动爬虫的时候注意启动的位置,是在项目路径下启动
  • parse()函数中使用yield返回数据,注意:解析函数中的yield能够传递的对象只能是:Baseitem(请求对象),Request(数据对象),dict,None

定位元素以及提取数据、属性值的方法

1.response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法

2.额外方法extract():返回一个包含有字符串的列表

3.额外方法extract_first():返回列表中的第一个字符串,列表为空返回None

        xpath方法返回的是选择器对象,extract()用于从选择器中提取数据
        xpath结果为只含有一个值的列表,可以使用extract_first(),
        如果为多个值则使用extract()

response响应对象的常用属性

  • response.url:当前响应的url地址
  • response.request.url:当前响应对象的请求的url地址
  • response.headers:响应头
  • response.request.headers:当前响应的请求头
  • response.body:响应体,也就是html代码,byte类型
  • response.status:响应状态码

保存数据

在pipelines.py文件中定义对文件的操作

定义一个管道类
重写管道类的process_item方法
process_item方法处理完item之后必须返回给引擎

在settings中启用管道:


scrapy数据建模和请求

数据建模

为什么 

定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查
配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字段代替
使用scrapy的一些特定组件需要item做支持,如scrapy的ImagePipeline管道类

怎么做?

在item.py文件中定义要提取的字段:

class MyspiderItem(scrapy.Item):
    name = scrapy.Field()

怎么用?

模板类定义以后需要在爬虫中导入并且实例化,之后的使用方法和使用字典相同

请求

翻页请求的思路

requests模块实现翻页请求:

1.找到下一页的URL地址

2.调用requests.get(url)

scrapy实现翻页请求:

1.找到下一页的url地址

2.调用url地址的请求对象,传递给引擎

构造(request)请求对象,并发送请求

1.确定url地址

2.构造请求,scrapy.Request(url,callback)

  •   callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析

3.把请求交给引擎:yield scrapy.Request(url,callback)

注意:

1.可以在settings中设置ROBOT协议

ROBOTSTXT_OBEY = False

2.可以在settings中设置User-Agent:

# sceapy发送的每一个请求的默认UA都是设置的这个User-Agent 
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
ROBOTSTXT_OBEY = False

其他参数

scrapy.Request

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=Fallse])

参数解释

中括号中的参数为可选参数,可写可不写
callback:表示当前的url响应交给哪个函数去处理(默认为parse函数)
meta:实现数据在不同解析函数中传递,meta默认带有部分数据,比如下载延迟、请求深度等(用于解析方法之间的数据传递,常用在一条数据分散在多个不同结构的页面中的情况)
dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为True,start_urls中的地址会被反复请求,否则程序不会启动
headers:接收一个字典,其中不包括cookies
cookies:接收一个字典,专门放置cookies
method:指定POST或GET请求
body:接收json字符串,为post的数据发送payload_post请求


meta参数的使用

meta的作用:meta可以实现数据在不同的解析函数中的传递

在爬虫文件的parse方法中,提取详情页增加之前callback指定的parse_detail函数:

def parse(self, response):
    ...
    yield scrapy.Request(detail_url, callback=self.parse_detail,mate={"item":item})
...

def parse_detail(self, response):
    # 获取之前传入的item
    item=response.meta["item"]

注意:

1.meta参数是一个字典

2.meta字典中有一个固定的键proxy,表示代理ip

 


开发流程总结

1.创建项目

scrapy startproject 项目名

2.明确目标

在item.py文件中进行建模

3.创建爬虫

3.1创建爬虫

scrapy genspider 爬虫名 允许的域

3.2完成爬虫

修改起始url
检查修改允许的域名allowed_aomains
编写解析方法

 4.保存数据

在pipelines.py文件中定义对数据的处理的管道
在settings.py文件中注册启用管道

scrapy管道的使用

1.pipeline中常用的方法:

  • process_item(self,item,spider):
  • 管道类中必须有的函数
  • 实现对item数据的处理
  • 必须return item
  • open_spider(self,spider):在爬虫开启的时候仅执行一次
  • close_spider(self,spider):在爬虫关闭的时候仅执行一次

2.管道文件的修改

def open_spider(self, spider):
    if spider.name == 'guidian':
        self.file = open('guet.json', 'w')

def close_spider(self, spider):
    if spider.name == 'guidian':
        self.file.close()
class MongoPipeline(object):
    def open_spider(self, spider):
        if spider.name == 'guidian':
            self.client = MongoClient('127.0.0.1', 27017)
            self.db = self.client['guet']
            self.col = self.db['guidian']

    def process_item(self, item, spider):
        if spider.name == 'guidian':
            data = dict(item)
            self.col.insert(data)
        return item

    def close_spider(self, spider):
        if spider.name == 'guidian':
            self.client.close()


scrapy中间件的使用

scrapy中间件的分类和作用

分类

根据scrapy运行流程中所在位置不同分为:

1.下载中间件

2.爬虫中间件

作用

1.对header以及cookie进行更换和处理

2.使用代理ip等

3.对请求进行定制化caoz

但在scrapy默认的情况下 两种中间件都在middlewares.py一个文件中

爬虫中间件使用方法和下载中间件相同,且功能重复,通常使用下载中间件

下载中间件的使用方法

Downloader Middlewares默认方法:

  • process_request(self,request,spider):

    1.当每个request通过下载中间件时,该方法被调用

    2.返回None值:没有return也就是返回None,如果所有的下载器中间件都返回为None,则请求最终被交给下载器

    3.返回Response对象:将响应对象交给spider进行解析,(不经过下载器Downloader)

    4.返回Request对象:如果返回请求,把request对象通过引擎交给调度器(Scheduler)

  • process_response(self,request,response,spider):

    1.当下载器完成http请求,传递响应给引擎的时候调用

    2.返回Response对象:将响应对象交给spider进行解析

    3.返回Request对象:如果返回请求,把request对象通过引擎交给调度器

  • 在setting.py中配置开启中间件,权重值越小越先执行
posted @ 2022-08-04 01:37  阿Qi早起了吗  阅读(92)  评论(0)    收藏  举报