1. 一、基础学习
    - scrapy框架
  2. 介绍:大而全的爬虫组件。
  3.  
  4. 安装:
  5. - Win:
  6. 下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
  7.  
  8. pip3 install wheel
  9. pip install Twisted18.4.‑cp36cp36mwin_amd64.whl
  10.  
  11. pip3 install pywin32
  12.  
  13. pip3 install scrapy
  14. - Linux:
  15. pip3 install scrapy
  16.  
  17. 使用:
  18. Django:
  19. # 创建project
  20. django-admin startproject mysite
  21.  
  22. cd mysite
  23.  
  24. # 创建app
  25. python manage.py startapp app01
  26. python manage.py startapp app02
  27.  
  28. # 启动项目
  29. python manage.runserver
  30.  
  31. Scrapy
  32. # 创建project
  33. scrapy startproject xdb
  34.  
  35. cd xdb
  36.  
  37. # 创建爬虫
  38. scrapy genspider chouti chouti.com
  39. scrapy genspider cnblogs cnblogs.com
  40.  
  41. # 启动爬虫
  42. scrapy crawl chouti
  43.  
  44. . 创建project
  45. scrapy startproject 项目名称
  46.  
  47. 项目名称
  48. 项目名称/
  49. - spiders # 爬虫文件
  50. - chouti.py
  51. - cnblgos.py
  52. ....
  53. - items.py # 持久化
  54. - pipelines # 持久化
  55. - middlewares.py # 中间件
  56. - settings.py # 配置文件(爬虫)
  57. scrapy.cfg # 配置文件(部署)
  58.  
  59. . 创建爬虫
  60. cd 项目名称
  61.  
  62. scrapy genspider chouti chouti.com
  63. scrapy genspider cnblgos cnblgos.com
  64.  
  65. . 启动爬虫
  66. scrapy crawl chouti
  67. scrapy crawl chouti --nolog
  68.  
  69. 总结:
  70. - HTML解析:xpath
  71. - 再次发起请求:yield Request对象

二、eg:爬取抽屉

  1. # -*- coding: utf- -*-
  2. import scrapy
  3. from scrapy.http.response.html import HtmlResponse
  4. # import sys,os,io
  5. # sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
  6.  
  7. class ChoutiSpider(scrapy.Spider):
  8. name = 'chouti'
  9. allowed_domains = ['chouti.com']
  10. start_urls = ['http://chouti.com/']
  11.  
  12. def parse(self, response):
  13. # print(response,type(response)) # 对象
  14. # print(response.text)
  15. """
  16. from bs4 import BeautifulSoup
  17. soup = BeautifulSoup(response.text,'html.parser')
  18. content_list = soup.find('div',attrs={'id':'content-list'})
  19. """
  20. # 去子孙中找div并且id=content-list
  21. f = open('news.log', mode='a+')
  22. item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
  23. for item in item_list:
  24. text = item.xpath('.//a/text()').extract_first()
  25. href = item.xpath('.//a/@href').extract_first()
  26. print(href,text.strip())
  27. f.write(href+'\n')
  28. f.close()
  29.  
  30. page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
  31. for page in page_list:
  32. from scrapy.http import Request
  33. page = "https://dig.chouti.com" + page
  34. yield Request(url=page,callback=self.parse) # https://dig.chouti.com/all/hot/recent/2

三、知识点

  1. 第一部分:scrapy框架
  2. . scrapy依赖twisted
  3. 内部基于事件循环的机制实现爬虫的并发。
  4. 原来的你:
  5. url_list = ['http://www.baidu.com','http://www.baidu.com','http://www.baidu.com',]
  6.  
  7. for item in url_list:
  8. response = requests.get(item)
  9. print(response.text)
  10.  
  11. 现在:
  12. from twisted.web.client import getPage, defer
  13. from twisted.internet import reactor
  14.  
  15. # 第一部分:代理开始接收任务
  16. def callback(contents):
  17. print(contents)
  18.  
  19. deferred_list = [] # [(龙泰,贝贝),(刘淞,宝件套),(呼呼,东北)]
  20. url_list = ['http://www.bing.com', 'https://segmentfault.com/','https://stackoverflow.com/' ]
  21. for url in url_list:
  22. deferred = getPage(bytes(url, encoding='utf8')) # (我,要谁)
  23. deferred.addCallback(callback)
  24. deferred_list.append(deferred)
  25.  
  26. # # 第二部分:代理执行完任务后,停止
  27. dlist = defer.DeferredList(deferred_list)
  28.  
  29. def all_done(arg):
  30. reactor.stop()
  31.  
  32. dlist.addBoth(all_done)
  33.  
  34. # 第三部分:代理开始去处理吧
  35. reactor.run()
  36.  
  37. . scrapy
  38. 命令:
  39. scrapy startproject xx
  40. cd xx
  41. scrapy genspider chouti chouti.com
  42.  
  43. scrapy crawl chouti --nolog
  44.  
  45. 编写:
  46. def parse(self,response):
  47. # .响应
  48. # response封装了响应相关的所有数据:
  49. - response.text
  50. - response.encoding
  51. - response.body
  52. - response.request # 当前响应是由那个请求发起;请求中 封装(要访问的url,下载完成之后执行那个函数)
  53. # . 解析
  54. # response.xpath('//div[@href="x1"]/a').extract_first()
  55. # response.xpath('//div[@href="x1"]/a').extract()
  56. # response.xpath('//div[@href="x1"]/a/text()').extract()
  57. # response.xpath('//div[@href="x1"]/a/@href').extract()
  58. # tag_list = response.xpath('//div[@href="x1"]/a')
  59. for tag in tag_list:
  60. tag.xpath('.//p/text()').extract_first()
  61.  
  62. # . 再次发起请求
  63. # yield Request(url='xxxx',callback=self.parse)

四、持久化

  1. 今日内容:scrapy
  2. - 持久化 pipeline/items
  3.  
  4. - 去重
  5.  
  6. - cookie
  7.  
  8. - 组件流程:
  9. - 下载中间件
  10.  
  11. - 深度
  12.  
  13. 内容详细:
  14.  
  15. . 持久化
  16. 目前缺点:
  17. - 无法完成爬虫刚开始:打开连接; 爬虫关闭时:关闭连接;
  18. - 分工明确
  19. pipeline/items
  20. a. 先写pipeline
  21. class XXXPipeline(object):
  22. def process_item(self, item, spider):
  23. return item
  24.  
  25. b. Item
  26. class XdbItem(scrapy.Item):
  27. href = scrapy.Field()
  28. title = scrapy.Field()
  29.  
  30. c. 配置
  31. ITEM_PIPELINES = {
  32. 'xdb.pipelines.XdbPipeline': ,
  33. }
  34.  
  35. d. 爬虫,yield每执行一次,process_item就调用一次。
  36.  
  37. yield Item对象
  38.  
  39. 编写pipeline
  40. from scrapy.exceptions import DropItem
  41.  
  42. class FilePipeline(object):
  43.  
  44. def __init__(self,path):
  45. self.f = None
  46. self.path = path
  47.  
  48. @classmethod
  49. def from_crawler(cls, crawler):
  50. """
  51. 初始化时候,用于创建pipeline对象
  52. :param crawler:
  53. :return:
  54. """
  55. print('File.from_crawler')
  56. path = crawler.settings.get('HREF_FILE_PATH')
  57. return cls(path)
  58.  
  59. def open_spider(self,spider):
  60. """
  61. 爬虫开始执行时,调用
  62. :param spider:
  63. :return:
  64. """
  65. print('File.open_spider')
  66. self.f = open(self.path,'a+')
  67.  
  68. def process_item(self, item, spider):
  69. # f = open('xx.log','a+')
  70. # f.write(item['href']+'\n')
  71. # f.close()
  72. print('File',item['href'])
  73. self.f.write(item['href']+'\n')
  74.  
  75. # return item # 交给下一个pipeline的process_item方法
  76. raise DropItem()# 后续的 pipelineprocess_item方法不再执行
  77.  
  78. def close_spider(self,spider):
  79. """
  80. 爬虫关闭时,被调用
  81. :param spider:
  82. :return:
  83. """
  84. print('File.close_spider')
  85. self.f.close()
  86.  
  87. 注意:pipeline是所有爬虫公用,如果想要给某个爬虫定制需要使用spider参数自己进行处理。

scrapy框架学习之路的更多相关文章

  1. 自己的Scrapy框架学习之路

    开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...

  2. 【SpringCloud之pigx框架学习之路 】2.部署环境

    [SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.下载代码 git clone https://git.pig4c ...

  3. 【SpringCloud之pigx框架学习之路 】1.基础环境安装

    [SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.Cmder.exe安装 (1) windows常用命令行工具 下 ...

  4. go server框架学习之路 - 写一个自己的go框架

    go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...

  5. Scrapy框架学习 - 使用内置的ImagesPipeline下载图片

    需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...

  6. Scrapy框架学习笔记

    1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...

  7. Scrapy框架学习(一)Scrapy框架介绍

    Scrapy框架的架构图如上. Scrapy中的数据流由引擎控制,数据流的过程如下: 1.Engine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取得URL. 2.En ...

  8. scrapy框架学习

    一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...

  9. Scrapy框架学习参考资料

    00.Python网络爬虫第三弹<爬取get请求的页面数据> 01.jupyter环境安装 02.Python网络爬虫第二弹<http和https协议> 03.Python网络 ...

随机推荐

  1. MySQL 占用cpu 100%

    目前的线上数据库,分为主从两个库,从库用来做比较耗时的数据统计分析. 今天top了一下从库服务器,发现mysqld 在很长一段时间都占用105% cpu,一开始以为是从库在处理主库的binlog. 两 ...

  2. JavaScript操作BOM对象

    1)windows对象 浏览器对象模型(BOM :Browser  Object  Model)是JavaScript的组成之一,它提供了独立于内容与浏览 器窗口进行交互的对象,使用浏览器对象模型可以 ...

  3. Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...

  4. 四:(之三)制作镜像和一些docker命令

    3.DIY image 3.1如何去掉sudo权限命令,让当前用户拥有操作docker的权限? 3.2 制作一个image: 拉取一个非常小的base image,hello-world.其中是一个可 ...

  5. ORM版学员管理系统1

    ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...

  6. dns资源记录类型

    资源记录的定义格式: 语法:name [TTL] IN RR_TYPE value SOA: name:当前区域的名字,例如"magedu.com.",或者"2.168. ...

  7. Android : 基于alsa库的音乐播放

    继上篇:Android : alsa-lib 移植 ,这篇随笔实现一个demo基于移植好的alsa库在Android平台上播放wav文件: 一.利用ffmeg将一个mp3文件转换成wav文件: (1) ...

  8. linux 创建安装redis服务

    1.找下redis的官方的下载地址:http://download.redis.io/releases/redis-3.2.8.tar.gz  有最新的就下载最新 先下载解压跟安装 wget http ...

  9. 对FPGA的时钟资源理解(更新中)

    7系列FPGA中包含了多达24个CMT(时钟管理单元)(实际上V7常见只有20个),MMCM和PLL均为时钟综合器,对外部输入时钟.内部时钟进行处理,生成需要的低抖动时钟.PLL是MMCM的功能子集, ...

  10. jdk,jre和jvm

    JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库 JRE是Java Runtime En ...