整体架构

  1. 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。
  2. 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
  3. 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。
  4. 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
  5. 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  6. 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  7. 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
  8. 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

数据流过程:

  1. 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
  2. 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
  3. 引擎向调度器请求下一个要爬取的URL。
  4. 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
  6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
  7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
  8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
  9. (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

简单example

 1 import scrapy
2
3 from 例子.items import 例子Item
4
5 class 例子Spider(scrapy.Spider):
6 name = "例子"
7 allowed_domains = ["例子.org"]
8 start_urls = [
9 "例子1", "例子2"
10 ]  #此为列表
11
12 def parse(self, response):
13 for sel in response.xpath('xpath代码'):
14 item = 例子Item()
15 item['title'] = sel.xpath('a/text()').extract()
16 item['link'] = sel.xpath('a/@href').extract()
17 item['desc'] = sel.xpath('text()').extract()
18 yield item

制作Scrapy爬虫项目步骤

  1 新建项目

    startproject 项目名

  2 明确目标(items.py)

  3 制件爬虫程序

    进入到spiders文件夹中,执行:

    scrapy genspider 爬虫文件名 "域名"

    #  ex::::   scrapy genspider baiduspaider "www.baidu.com

  4 处理数据(pipelines.py)

  5 配置settings.py

  6 运行爬虫程序

    scrapy crawl 爬虫名

scrapy 项目文件详解

  

文件配置详解

  settings.py

   USER_AGENT = 'baidu (+http://www.yourdomain.com)'

  # 是否遵循robot协议,改为False
   ROBOTSTXT_OBEY = False
  # 最大并发量 ,默认为16
  CONCURRENT_REQUESTS = 32
  # 下载延迟时间
  DOWNLOAD_DELAY = 3
  # 请求报头
  DEFAULT_REQUEST_HEADERS = {
   'User-Agent':"Mozilla/5.0",
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
      }
  # 下载中间件
  DOWNLOADER_MIDDLEWARES = {
   'baidu.middlewares.BaiduDownloaderMiddleware': 543,
    }
  # 项目管道
  ITEM_PIPELINES = {
   'baidu.pipelines.BaiduPipeline': 300, # 此处有优先级
      }
def parse(self, response):
  #response.xpath('h1') 结果为选择器对象
  #[<selector ... data = <h1 class="" >>]
  # response.xpath('//h1/text()')结果选择器对象
  # [<selector ...data="text()">]
  # response.xpath('//h1/text()').extract()
  # ['text()']
 知识点
  1 extract():获取选择器对象中的文本内容
    response.xpath('')得到的结果为选择器对象的列表
  2 pipellines.py中必须有1个函数叫
    def process_item(self,item,spider):
      return item [如果有多个piplines的话,需要使用return返回]
  3 爬虫程序中,start_urls必须为列表
    
  4 scrapy设置 log :settings.py
    LOG_LEVEL = "DEBUG"
    5层日志级别
      CRITICAL:严重错误
      ERROR :一般错误
      WARNING:警告信息
      DEBUG:调试信息
      INFO:一般信息
    LOG_FILE ='xx.log' #设置指定log文件 # parse函数是第一次从start_url中初始URL发请求,
# 得到响应后必须要调用的函数
def parse(self,response): 2 如何保存为csv ,或是 json文件
  1 scrapy crawl tengxun -o tenxun.csv
  2 scrapy crawl tengxun -o tenxun.json
  解决导出乱码问题(在settings里面加入一个变量)
    FEED_EXPORT_ENCODING = 'utf-8'
3 下载器中间件
  1 随机User-Agent
    1 settings.py
      1 更改settings.py 中更改 USER_AGENT
      2 更改settings.py 中更改 DEFALUT_REQUEST_HEADERS ={"":"",}
    2 设置中间件[ USER_AGENT]  的更改
      1 新建一个useragent.py,存放大量USER_AGENT
      2 middleawres.py中写class
      3 settings.py中开启 DOWNLOADER_MIDDLEWARES           
      主要重写
      class xxx..DownloaderMiddleware(object):
        def process_request(self,request,spider):
            request.headers["User-Agent"]=random.choice(USER_AGENT_LIST)
  2 设置代理
    也是重写
    def process_request(self,request,spider):
      proxyList=[  
          "http://1.1.1.1:80",
          "http://1.1.1.2:80",
          "http://user:password@1.1.1.1:80",
          .....
        ]  
      # request的meta  参数
      request.meta['proxy'] = random.choice(proxyList)   3 图片管道ImagePipeline
    1 使用流程(要操作的文件)
      1 settings.py
        设置图片要保存的路径的变量
        IMAGES_STORE ="/home/admin/aaa/images"
    2 pipelines.py
      1 导入scrapy定义好的图片管道类
        from scrapy.pipelines.images import ImagesPipeline
      2 定义自己的class,继承scrapy的图片管道类
        class xxxImagePipeline(ImagesPipeline):
          def get_media_requests(self,item,info):
5 dont_filter参数
  scrapy.Request(url,callback=parse,dont_filter=.) 
  1 False:默认,检查域
  2 True:忽略域组检查
6 scrapy shell
  1 scrapy shell "http://www.baidu.com"
  2 response.txt
7 CrawlSpider类
  from scrapy.linkerextractors import LinkExitractor
  1 Spider的派生类
    Spider类:只爬取start_urls列表中的网页
    CrawlSpider类,定义了一些规则(ruler)来提供提取链接,跟进链接,
  2 创建CrawlSpider模板爬虫文件
    加-t crawl
    
    ex > scrapy genspider -t crrawl tengxun 'xxx.com'
  3 示例,从页面中提取所有的链接
    1 scrapy shell 'xxx.com'
    2 from scrapy.linkerextractors import LinkExtractor # 导入链接规则匹配类,用来提取符合规则的链接
      from scrapy.spiders import CrawlSpider,Rule    # 导入spiders的派生类CrawlSpider,Rule指定特定操作
    3 linkList = LinkExtractor(aallow=("正则"))
    4 linkList =extract_links(response)
  4 Rule
    1 作用:对爬取网站动作指定特点操作
      rules = (
          Rule(LinkExtractor(allow=r'正则'),
          callback = 'parseHtml',
          follow=True),)
        )
   
    
  ocr_电子扫描
  Ubuntu: sudo apt-get install tesseract-ocr
  
验证: tesseract test1.jpg test1.txt
python 调用 : 需要安装
方法很少,就用1 个,图片转字符串
: image_to_string
from PIL_to_string ex:::
import pytesseract
from PIL import Image
image = Image.open('test1.jpg')
s= pytesseract.image_to_string(image)
print(s)

# 重写spider类的start_request()方法,去掉start_urls
 def start_requests(self)
      

小白_开始学Scrapy__原理的更多相关文章

  1. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  2. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  3. 跟vczh看实例学编译原理——零:序言

    在<如何设计一门语言>里面,我讲了一些语言方面的东西,还有痛快的喷了一些XX粉什么的.不过单纯讲这个也是很无聊的,所以我开了这个<跟vczh看实例学编译原理>系列,意在科普一些 ...

  4. 小白该怎么学《马哥Linux从入门到精通》

    首先,必须说明我已经不是小白啦~现在的我在国内某独角兽担任运维工程师,带着一个四人小团队,在运维方面也算是有些心得,勉强过来回答一下这个问题,就算抛砖引玉了. 所有人都是从小白阶段过来的,我=也经历过 ...

  5. Typora+图床详解(小白都能学得会)

    Typora+图床详解(小白都能学得会) 1 了解工作 博客中用的笔记软件--Typora(Markdown语法) 博客中用的图床--阿里云对象存储(Object Storage Service,简称 ...

  6. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  7. mysql小白系列_10 mysql主从复制原理

    1.如何解决主从复制延迟的问题? (1)主从复制原理 http://www.cnblogs.com/jenvid/p/8410922.html 1.salve执行slave start,salve服务 ...

  8. 一步一步学J2SE-ConcurrentHashMap原理

    ConcurrentHshMap的数据结构是由一个Segment数组和多个HashEntry数组组成,在Segement数组中包含了HashEntry数组.数据结构如下图所示: Segement数组的 ...

  9. 惊了!!! 小白零基础学java (月薪过万是你的梦想嘛) 手把手教学 就怕你不动手【二十五】第二章【初识MySQL】

    初识MySQL1. 了解主流的数据库和数据库分类1.1 数据库概念数据库:按照数据结构来组织.存储和管理数据的一种建立在计算机存储设备上的仓库. 数据库的优势: 1. 可以持久化存储大量的数据.方便我 ...

随机推荐

  1. Node中使用MySQL报错:TypeError: Cannot read property 'query' of undefined

    Node中使用MySQL报错: TypeError: Cannot read property 'query' of undefined at /Users/sipeng/Desktop/彭思/201 ...

  2. C# Newtonsoft.Json JObject 操作

    C# Newtonsoft.Json JObject 操作举例 JArray j = new JArray(); JObject obj = new JObject( ") ); JObje ...

  3. Python3之高阶函数filter

    Python内建的filter()函数用于过滤序列 和map()一样,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是T ...

  4. conda安装的国内镜像配置,实现快速下载

    conda安装的国内镜像配置,实现快速下载 anaconda的所有的软件包全部在国外,安装起来很麻烦,关键是下载速度慢,而且经常中断,所以需要配置国内安装的镜像,下载速度就很快了. 一.conda换国 ...

  5. 【miscellaneous】gstreamer构建的简单方法

    在博文"Gstreamer在Ubuntu上的安装和MP3的播放"中,写了在ubuntu上从头到尾构建gstreamer的详细过程,那是我在一次小项目培训中和队友一起努力了将近一周的 ...

  6. vue报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    在.vue文件中引入了 element-ui 的 table 和 pagination 组件后,报错:Component template should contain exactly one roo ...

  7. [学习笔记] Blender 常用工具栏,选择及游标

    Shift + A 创建物体 选择工具: 默认是框选 shift 鼠标左键 加选, 再次可减选 游标 默认情况下游标在世界中心.创建新物体时,会自动被创建在游标的位置.可以随意改变游标的位置,便于建模 ...

  8. Mac10.14.6安装并破解PyCharm

    之前安装了PyCharm的Community版本, 用了半天之后发现好多功能都没有, 于是准备安装专业版然后破解. 安装包直接去官网下载, 不多说. 破解补丁的下载地址如下: 链接:https://p ...

  9. [转帖]Keccak简介

    Keccak简介 https://blog.csdn.net/chengqiuming/article/details/82819769 2018年09月23日 08:04:40 cakincqm 阅 ...

  10. 关于npm install 报错 EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org

    在公司里使用了isa连接外网,刚开始使用npm 安装依赖的时候一直报错EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org,我们的老大给 ...