Scrapy框架

是一个爬去网页数据,提取数据结构的框架,只需要输入少量代码框架就可以帮你快速抓取需要的数据

Scrapy是一个异步网络框架

===================================================

之前的爬去数据往往都是请求网页 ,然后获取数据提取数据和URL ,下次请求URL 然后处理数据

而Scrapy中拉取引擎的概念

 

=========================开始使用=========================================

pip install Scrapy  有依赖包(如果报错请参考:https://blog.csdn.net/lwx356481/article/details/81224667)‘

1在控制台输入 scrapy startproject mo2vie  

2按照提示CD 进目录 

3. scrapy genspider example example.com (只能爬去的域名)

4.在spiders 下的某个爬虫文件写提取数据

# -*- coding: utf-8 -*-
import scrapy


class ItcastSpider(scrapy.Spider):
    name = 'itcast' #爬虫名称
    allowed_domains = ['itcast.com']#只爬去的范围
    start_urls = ['http://itcast.com/']#开始爬去的网页

    def parse(self, response):
        teacher_list=response.xpath('//div[@class="tea_con"]//li')
        for teacher_info in teacher_list :
            item={}
            title=teacher_info.xpath('./div[@class="li_txt"]/h3/text()').extract()[0]
            position = teacher_info.xpath('./div[@class="li_txt"]/h4/text()').extract()[0]
            item["title"]=title
            item["position"] =position
            yield  item


    

 

如何让爬去数据返回没有日志文件的警告:

在setting.py 文件中设置 LOG_LEVEL="WARNING"

并且setting 文件中 打开注释

ITEM_PIPELINES = {
   'movie.pipelines.MoviePipeline': 300,
}

scrapy crawl itcast 开始爬虫
 

 

 

extract()[0] 是在一个类似列表对象的对象取出真正xpath

如果没有就会报错 因为索引超出 

extract_first() 是取第一个没有就为None

最后会通过生成器 传出 item 

 

爬虫(生成器)通过yield-------》引擎---------》管道====》管道

'movie.pipelines.MoviePipeline': 300, 为权重 先进低的再出高的

======================================

一般我们爬取多个网站 需要对数据进行处理 ,解决思路:

1.在item 加入网站参数 如item["wz"]="baidu"

然后在Pipeline参数item中筛选出

 

2.可以根据爬虫名字来筛选数据

if spider.name=="11":
    pass

======================================================================

import logging
logging=logging.getLogger(__name__) #实例化一个logging 对象 
logging.warning("1234556") #输出警告日志2019-03-16 14:46:03 [movie.spiders.itcast] WARNING: 12345

LOG_FILE="./LOG.log 保存文件

==================================================================================

制造出一个request对象 ,
if next_url != "javascript:;" :
    yield scrapy.Request(next_url,callback=self.parse)

加入callback=self.parse 引擎会自动的把request对象返回给制定的函数来执行

scrapy.Request(next_url,callback[,meta,dont_filter=Flase])

callback 指定传入的url 被哪个解析函数处理

meta 不同之间函数传递用

dont_filter默认有url去重功能

================================================================

shell 的使用 

scrapy shell  “网页地址”

进入交互界面

可以对各个功能进行调试

 

===============================================================

Pipeline 在里面定义 open_spi

===============================================================

dont_filter=True

 

===============================================================================

苏宁爬虫:数据重复怎么办,后一次循环会改变前一次循环结果,scrapy同时操作item ,使用item来自一个大分类,

注意:因为是多线程的原因,item 被多个引用

所以item 需要深拷贝

=========================================================================

CrawSpider 无需手动的寻找url

 

会生成一个页面

其中allow 是正则表达式 如果满足的话 就会请求,

callback 就会把提出出来的请求交给某个函数处理  

follow 提出出来的url是否继续过滤(重头开始Ture  

allow_domains 域名的白名单列表

deny_domains 域名的黑名单列表

===================================================================

下载中间件:(现在setting开始DOWNLOADER_MIDDLEWARES)

process_request() 一般用于请求,添加随机的UA,添加代理,

返回 None继续往下走 将请求交给后续的中间件进行处理;

返回response 不继续往下走下载件 全部process_request() 都会被执行一遍改response

返回Request 对象 :停止进入下一个中间件, 调用该函数里的内容,然后再走一边中间件,直到对应的process_request() 处理新的request.

raise一个 IgnoreRequest 异常 :调用process_exception 

 

process_response() 一般处理相应,需要return ,retsponse request,raise一个 IgnoreRequest 异常

 终止后续中间件的执行 继续执行后续的中间件

 

===================================================================

模拟登陆三种方式

方式一:可以使用带cookie 来生成一个rquest对象 来模拟登陆 (放到请求头里无效)

即 :yield scrapy.Request(url=i,callback=self.parse,cookies=self.cookies)

方式二: 会自动寻找from表单,fromdata input的name作为键 ,填写的内容为值

def parse(self, response):
    yield scrapy.FormRequest.from_response(response,formdata={"login":"492557688@qq.com","password":"a13736784065"},callback=self.parse_detail)

方式三:自动生成data数据自己找每一个键值对

生成data={}

yield scrapy.FormReques("seiion提交地址",data,callback=“解析函数”)

 

======================================================

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值