工程的创建
-
cd
-
数据解析
- 请求发送:start_urls
- 函数:parse
- start_requests方法:
- 就是讲start_urls中的url进行get请求的发送
- xpath进行的解析
- etree解析的区别:
- extract():有多个元素的列表中
- extract_first():只有一个元素的列表中
- etree解析的区别:
-
持久化存储
- 基于终端指令
- 只可以将数据存储到指定后缀的文本文件中
- 存储的数据必须为parse方法的返回值
- 指令:scrapy crawl spiderName -o filePath
- 基于管道
- 1.解析数据
- 2.在item类中定义相关的属性
- name = scrapy.Field()
- 3.解析到的数据存储到item类型的对象
- 4.将item提交给管道
- yield item
- 5.在管道中接受item(process_item),进行任意形式的持久化存储
- 6.开启管道
- 注意事项:
- 一个管道类对应什么
- 一个管道类对应一种形式的存储
- process_item=》return item
- 一个管道类对应什么
- 基于终端指令
-
手动请求发送
- get:
- yield scrapy.Request(url,callback)
- post:
- yield scrapy.FormRequest(url,callback)
- get:
-
核心组件
- 引擎
- 事务的触发
- spider
- 产生url,发起请求,数据解析
- 调度器
- 过滤器
- 队列
- 管道
- 下载器
- 引擎
-
今日内容
- 请求传参
- 作用:实现深度爬取
- 什么深度爬取:
- 爬取的数据没有存在于同一张页面中
- 在进行手动请求发送的时候可以将一个meta字典传递给callback指定的回调函数
- yield scrapy.Request(url,callback,meta)
- 在回调函数中如何接收meta:
- response.meta['key'] #将meta字典中key对应的value值取出
- 中间件
- 爬虫中间件:位于引擎和Spider中间
- 下载中间件:位于引擎和下载器中间(推荐)
- 作用:拦截请求和响应
- 为什么需要拦截请求?
- UA伪装(篡改请求的头信息)
- process_request
- request.headers['User-Agent'] = 'xxx'
- process_request
- 设置代理
- process_exception:
- request.meta['proxy'] = 'http://ip:port'
- return request:将修正后的请求对象进行重新发送
- process_exception:
- UA伪装(篡改请求的头信息)
- 为什么需要拦截响应?
- 篡改响应数据
- 网易新闻数据爬取
- 实现流程:
- 1.解析出5个板块对应页面的url
- 2.对五个板块的url发起请求
- 3.获取板块的页面源码数据
- 问题:板块的页面源码数据(响应数据)中没有包含新闻的标题和新闻详情页的url(动态加载的数据)
- 处理:将响应对象的响应数据进行篡改,将其该为包含动态加载数据的响应数据
- selenium帮助我们捕获到包含了动态加载的响应数据
- selenium在scrapy中如何使用
- 实例化一个浏览器对象(爬虫文件中)
- 在中间件的process_response中进行selenium后续的操作
- 在爬虫文件的爬虫类中重写一个closed(self,spider),关闭浏览器
- selenium在scrapy中如何使用
- 实现流程:
- 请求传参
-
作业:
-
将网易新闻的新闻数据进行爬取
- title
- content
-
基于百度AI将新闻的类型和关键字进行提取
-
持久化存储:
-
mysql
- 库表:
- 新闻标题
- 新闻内容
- 新闻类型
- 新闻关键字
- 库表:
-
error:
- x0x无法被gbk识别
- s.replase('x0x','')
- x0x无法被gbk识别
-