python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

#  settings 配置 UA
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'

一丶scrapy的图片数据爬取(流数据的爬取)

​ scrapy中封装好了一个管道类(ImagesPipeline),基于该管道类可以实现图片资源的请求和持久化存储

编码流程:

  • 爬虫文件中解析出图片的地址
  • 将图片地址封装到item中且提交给管道
  • 管道文件中自定义一个管道类(父类:ImagesPipeline)
  • 重写三个方法:
    • def get_media_requests(self,item,info):
    • def file_path(self,request,response=None,info=None):
    • def item_completed(self,result,item,info):
  • 在配置文件中开启管道且加上IMAGES_STORE = './imgLibs'

在scrapy中如何进行手动请求发送

​ yield scrapy.Request(url,callback)

在scrapy中如何进行post请求的发送?

​ yield scrapy.FormRequest(url,callback,formdata)

如何对起始的url进行post请求的发送?

  • 重写父类的start_requests(self):
    def start_requests(self):
    for url in self.start_urls:
    yield scrapy.FormRequest(url,callback=self.parse,formdata={})

在scrapy中如何提升爬取数据的效率?

增加并发:
    默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

降低日志级别:
    在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘ERROR’

禁止cookie:
    如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False

禁止重试:
    对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

减少下载超时:
    如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 1 超时时间为10s

请求传参(深度爬取)

  • 深度爬取:
    • 爬取的数据没有存在同一张页面中。
  • 如何实现请求传参
    • Request(url,callback,meta={}):可以将meta字典传递给callback
    • callback接收item:response.meta

scrapy的五大核心组件

引擎(Scrapy)
  用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler)
  用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader)
  用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders)
  爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline)
  负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

scrapy的中间件

  • 有哪些中间件。
    • 下载中间件(推荐)
    • 爬虫中间件
  • 下载中间件的作用
    • 批量拦截所有的请求和响应
  • 为什么拦截请求
    • 篡改请求的头信息(UA)
      • request.headers['User-Agent'] = 'xxxxx'
    • 代理
  • 为什么拦截响应
    • 篡改响应数据
    • 篡改响应对象(推荐)

项目:

网易新闻(国内,国际,军事,航空,无人机)新闻数据的标题和内容

  • 分析:
    • 1.每一个板块下对应的新闻数据都是动态加载出来的
    • 2.会对五个板块的响应数据进行数据解析,但是板块对应的响应对象是不包含动态加载的新闻数据,目前
      获取的每一个板块对应的响应对象是不满足需求的响应对象!!!
    • 3.将不满足需求的5个响应对象(工程中一共会有1+5+n),修改成满足需求。
      • 找到指定的5个不满足需求的响应对象(中间件)
  • 你的redis如果不可以写入字典
    • pip install -U redis==2.10.6
posted @ 2019-10-15 23:13  染指未来  阅读(280)  评论(0编辑  收藏  举报