1.创建项目语法

scrapy startproject 项目名
scrapy startproject myscrapy
注意在命令行下使用,创建好之后用pycharm打开
scrapy2__创建scrapy项目
scrapy2__创建scrapy项目
下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录

在spiders目录下创建py文件,接下来所有的功能都在这个文件里面编写

scrapy2__创建scrapy项目

2.编写hello.py开始写蜘蛛

  1. 创建一个类,该类必须继承scrapy.Spider或者是其他的蜘蛛类型
  2. 定义一个蜘蛛的名字,name = ‘’
  3. 定义需要爬取的网址
  4. 继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面,简单理解就是下载页面。
  5. 代码如下(参照scrapy中文网)
    import scrapy
    class hello(scrapy.Spider):
        name = 'hello'
        def start_requests(self):
            # 要爬取的网址(http://lab.scrapyd.cn/),只为爬虫练习使用
            urls = [
                'http://lab.scrapyd.cn/page/1/',
                'http://lab.scrapyd.cn/page/2/',
            ]
            for url in urls:
                yield scrapy.Request(url=url, callback=self.parse)
        def parse(self, response):
            page = response.url.split("/")[-2]  # 根据上面的链接提取分页,如:/page/1/,提取到的就是:1
            filename = 'mingyan-%s.html' % page
            # 拼接文件名,如果是第一页,最终文件名便是:hello-1.html
            with open(filename, 'wb') as f:  # python文件操作,不多说了;
                f.write(response.body)  # 刚才下载的页面去哪里了?response.body就代表了刚才下载的页面!
    

3.在pycharm中Terminal中执行

  1. scrapy crawl hello(hello是蜘蛛的name)

    scrapy2__创建scrapy项目

    7.在项目的目录下发现者两个文件hello.html---------------运行成功

    scrapy2__创建scrapy项目

4.复习python基础知识

  1. yield

    • yield 谬雪峰官网生成器
    • Python yield使用浅析 - 廖雪峰的官方网站 **
      简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
      也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法)理解yield和generator
      当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

    一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

    yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰
    1 . 简单输出斐波那契數列前 N 个数,直接打印print()没有提高复用性
    2 . 返回一个list,,,前提内存够用的。。list占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代。
    3 . 利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class。缺点:代码不简单
    4 . 如果我们想要保持第一版 fab 函数的简洁性,同时又要获得 iterable 的效果,yield 就派上用场了

    	def odd():
    	    print('step 1')
    	    yield (1)
    	    print('step 2')
    	    yield(3)
    	    print('step 3')
    	    yield(5)
    
    		>>> o = odd()  ---generator
    		>>> next(o) ----开始执行程序,直到遇见yield中断。直到next再次遇到再次中断。
    		step 1
    		1
    		>>> next(o)
    		step 2
    		3
    		>>> next(o)
    		step 3
    		5
    		>>> next(o)
    		Traceback (most recent call last):
    		  File "<stdin>", line 1, in <module>
    		StopIteration
    

    可以看到,odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用next(o)就报错。

    回到fib的例子,我们在循环过程中不断调用yield,就会不断中断。当然要给循环设置一个条件来退出循环,不然就会产生一个无限数列出来。

    同样的,把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:for n in fib(6): print(n)fib(6)是一个generator

    但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:scrapy2__创建scrapy项目

  2. 回调函数------https://www.zhihu.com/question/19801131/answer/27459821 理解

相关文章: