scrapy 笔记2.0

scrapy运行流程
先弄清除他的运行流程之外,得先知道他的5大核心组件
1 spider,爬虫
2 引擎
3 调度器
4 下载器
5 管道

流程:
- 在爬虫类中定义要爬取得url,将url封装成一个对象,传入引擎
- 引擎接收到对象,将对象传到调度器
- 调度器由2个部分组成,一个是过滤器,一个是队列,每一个url对象都会经过过滤器去重,然后存在队列中,将队列传给引擎
- 引擎接收到队列,将队列给到下载器
- 下载器接到队列,在互联网中下载资源,下好得资源得到一个response,将response传递给引擎
- 引擎将response传递给爬虫得parse方法,解析response,然后封装item,将item传递给管道进行持久化存储

问题:
为什么都要经过引擎?
    - 因为引擎可以触发事务
    - Scrapy引擎是整个框架的核心。它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

在爬虫和引擎之间 下载器和引擎之间都有个中间件
    - 下载器和引擎之间得中间件可以做ip池和UA池

创建项目
- scrapy startproject namepro
- cd namepro
- scrapy genspider name www.xxx.com

启动项目
- scrapy crawl name

settings需要配置
- 开启管道
- 可以开启多个管道,连着一起用,需要的是优先执行问题
- 传递给管道得值 yield item item 必须是Request, BaseItem, dict, None 其他报错
- 爬虫中间件,下载中间件,都需要开启

pipeline使用
- 为什么需要多个pipeline,可能有多个spider,不同的pipeline处理不同的item的内容
- pipeline的权重越小,优先级越大
- process_item不能改名
- spider参数 spider.name 返回项目名字

logging模块
- LOG_LEVEL = 'ERROR'
- LOG_FILE = './log.log'

构造请求 翻页

传参数
yield scrapy.Request(url='xx',rollback=self.parse,meta={'item':item})
    item = response.meta.get('item')
    item['x'] = x
    yield item

DEBUG:
pass

scrapy shell
使用方法: scrapy shell url地址 进入类似python终端界面
可以调试 response.xxx 之类

管道 -> 数据保存
- open_spider(self,spider) 爬虫开启执行 -> 数据库建立连接 仅执行一次
- process_item(self,item,spider) 处理Item -> 存入数据库
- close_spider(self,spider) 爬虫结束 -> 数据库关闭连接 执行一次
- from_crawler(self,crawler)

全站爬取 crawlspider
- scrapy startproject xxpro
- scrapy genspider -t crawl xx www.xx.com

# 定义提取规则地方
rules = (
    # LinkExtractor 连接提取器,提取url地址
    # callback 提取出来的response给callback处理, 可以不写
    # follow 当前url地址的响应是否重新经过rules来提取url地址
    Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)

- crawlspider里面不能定义parse方法
- 如果多个rule都满足一个url,会选择第一个进行操作

scrapy携带cookie模拟登录
- 先去找起始url的首页,不需要cookie登录的那种,
- 获取他的cookie,再去请求需要cookie的网页

下载中间件的使用
- DownloaderMiddlewares:
process_request(self,request,spider):
当每个request请求通过下载中间件的时候,该方法调用, UA伪造,代理
request.headers['User-Agent'] = 'ua'
request.meta['proxy'] = '代理' https / http 看爬取的网站是什么

    process_response(self,request,response,spider):
        当下载器完成http请求,传递响应给引擎的时候调用
        return response

    process_exception(request,exception,spider)
        出错时调用

scrapy发送post请求
scrapy.FormRequest(url,formdata,callback)

scrapy.FormRequest.from_response(response,formdata={user,pwd},callback)  # 简单
                                # input用户名 name的值作为键 fromid formname 定位form表单

问题
数据重复怎么办
- 后一次循坏会改变前一次的结果,item同时会被操作,而且使用的item来之同一个
- 使用深copy复制item
url地址js生成怎么办
- 寻找规律
- 在响应中会有当前页码数和总的页码数
crawlspider
- 如何使用
1 scrapy startproject namepro
2 scrapy genspider -t crawl name
3 完善rules 一个元组 一个Rule linkExtractor callback follow
4 完善callback
- 使用场景
1 url的规则能够通过正则或者xpath
2 最终页面有全部数据的时候使用,如果没有,在callback中手动构造请求
-注意点
1 parse函数不能定义
2 继承自CrawlSpider
下载中间件
process_request()
处理请求
添加cookie
添加ua request.headers['u-a']
添加代理 request.meta['proxy']
不需要return
process_response()
处理响应
需要 return response

模拟登录
    - 携带cookie登录
        scrapy.request(url,callback,cookies={})
        不能吧cookies放在headers中
    - 使用FormRequest
        scrapy.FormRequest(url,formdata={},callback) formdata 请求体
    - 自动寻找form表单中的action的url
        scrapy.FormRequest.form_response(response,formdata={},callback)  formdata 用户名,密码
上一篇:python爬虫七


下一篇:Scrapy(3)将蜘蛛狠狠的踩在地上摩擦摩擦