最近一段时间开始研究爬虫,后续陆续更新学习笔记

爬虫,说白了就是获取一个网页的html页面,然后从里面获取你想要的东西,复杂一点的还有:

  • 反爬技术(人家网页不让你爬,爬虫对服务器负载很大)
  • 爬虫框架(你不可能逮到一个需求就从头写个爬虫把,框架已经有了)
  • 多线程

当然这是我自己的理解,而scrapy框架算是比较流行的python爬虫框架,开始搞把

目前的套路就是学到能爬你想爬的any网站,然后获取你想要的any数据,至于反爬什么的,网络限制什么的,再看吧,把基础的弄好.

用的是1.4版本,默认已经安装好了.

中文版教程(1.0)

英文版教程(最新)

创建项目:

  1. dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy$ scrapy startproject myfirstpro

后面开可以再跟一个目录名称,如果没有就是同名的,你可以这样:   $ scrapy startproject myfirstpro  mydir

我们可以看出文件结构:

  1. dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy$ tree
  2. .
  3. └── myfirstpro
  4. ├── myfirstpro
  5.    ├── __init__.py
  6.    ├── items.py
  7.    ├── middlewares.py
  8.    ├── pipelines.py
  9.    ├── settings.py
  10.    └── spiders
  11.    └── __init__.py
  12. └── scrapy.cfg
  13.  
  14. directories, files

第一个爬虫:

爬虫位置在spiders 里面,目录下的名为 quotes_spider.py 的文件中

  1. #!/usr/bin/python
  2. #coding=utf-8
  3.  
  4. import scrapy
  5.  
  6. class QuotesSpider(scrapy.Spider):
  7. name = "quotes"  #用于识别 Spider。 它在项目中必须是唯一的,也就是说,您不能为不同的 Spider 设置相同的名称。
  8.  
  9. def start_requests(self):  #必须返回一个 Requests 的迭代(您可以返回一个 requests 列表或者写一个生成器函数),Spider 将从这里开始抓取。 随后的请求将从这些初始请求连续生成。没有也行,但是要有start_urls ,这是个列表,放初始的链接
  10. urls = [
  11. 'http://quotes.toscrape.com/page/1/',
  12. 'http://quotes.toscrape.com/page/2/',
  13. ]
  14. for url in urls:
  15. yield scrapy.Request(url=url, callback=self.parse)
  16.  
  17. def parse(self, response):  #用来处理每个请求得到的响应的方法。 响应参数是 TextResponse 的一个实例,它保存页面内容,并且还有其他有用的方法来处理它。方法通常解析响应,将抓取的数据提取为字典,并且还可以查找新的 URL 来跟踪并从中创建新的请求(Request)。
  18. page = response.url.split("/")[-2]
  19. filename = 'quotes-%s.html' % page
  20. with open(filename, 'wb') as f:
  21. f.write(response.body)  #直接把服务器的响应全保存了
  22. self.log('Saved file %s' % filename)  #出现在日志里的一个方法

运行:

  1. dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ scrapy crawl quotes

可以看到生成的文件:

  1. dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ tree
  2. .
  3. ├── myfirstpro
  4.    ├── __init__.py
  5.    ├── __init__.pyc
  6.    ├── items.py
  7.    ├── middlewares.py
  8.    ├── pipelines.py
  9.    ├── settings.py
  10.    ├── settings.pyc
  11.    └── spiders
  12.    ├── __init__.py
  13.    ├── __init__.pyc
  14.    ├── quotes_spider.py
  15.    └── quotes_spider.pyc
  16. ├── quotes-.html
  17. ├── quotes-.html
  18. └── scrapy.cfg
  19.  
  20. directories, files

在爬虫中提取数据

到目前为止,它并没有提取任何数据,只将整个 HTML 页面保存到本地文件。这里用到了xpath语法来提取数据

Scrapy 爬虫通常生成许多包含提取到的数据的字典。 为此,我们在回调方法中使用 yield Python 关键字,如下所示:

  1. #!/usr/bin/python
  2. #coding=utf-
  3. #
  4. import scrapy
  5.  
  6. class QuotesSpider(scrapy.Spider):
  7. name = "quotes"
  8. start_urls = [
  9. 'http://quotes.toscrape.com/page/1/',
  10. 'http://quotes.toscrape.com/page/2/',
  11. ]
  12.  
  13. def parse(self, response):
  14. for quote in response.css('div.quote'):
  15. yield {
  16. 'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
  17. 'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
  18. 'tag': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract(),
  19. }

运行爬虫,会有日志显示:

  1. -- :: [scrapy.core.engine] DEBUG: Crawled () <GET http://quotes.toscrape.com/page/1/> (referer: None)
  2. -- :: [scrapy.core.scraper] DEBUG: Scraped from < http://quotes.toscrape.com/page/1/>
  3. {'text': u'\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d', 'tag': [u'change', u'deep-thoughts', u'thinking', u'world'], 'author': u'Albert Einstein'}
  4. -- :: [scrapy.core.scraper] DEBUG: Scraped from < http://quotes.toscrape.com/page/1/>
  5. {'text': u'\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d', 'tag': [u'abilities', u'choices'], 'author': u'J.K. Rowling'}

存储抓取的数据

存储抓取数据的最简单的方法是使用 Feed exports,使用以下命令:

  1. scrapy crawl quotes -o quotes.json

这将生成一个 quotes.json 文件,其中包含所有抓取到的 JSON 序列化的数据。

由于历史原因,Scrapy 追加内容到给定的文件,而不是覆盖其内容。 如果您在第二次之前删除该文件两次运行此命令,那么最终会出现一个破坏的 JSON 文件。您还可以使用其他格式,如 JSON 行(JSON Lines):

  1. scrapy crawl quotes -o quotes.jl

JSON 行格式很有用,因为它像流一样,您可以轻松地将新记录附加到文件。 当运行两次时,它不会发生 JSON 那样的问题。 另外,由于每条记录都是单独的行,所以您在处理大文件时无需将所有内容放到内存中,还有 JQ 等工具可以帮助您在命令行中执行此操作。

在小项目(如本教程中的一个)中,这应该是足够的。 但是,如果要使用已抓取的项目执行更复杂的操作,则可以编写项目管道(Item Pipeline)。 在工程的创建过程中已经为您创建了项目管道的占位符文件pipelines.py, 虽然您只需要存储已抓取的项目,不需要任何项目管道。

输出的文件格式,可以看出,有多种格式可以选择:

  1. dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ scrapy crawl quotes -o -h
  2. Usage
  3. =====
  4. scrapy crawl [options] <spider>
  5.  
  6. crawl: error: Unrecognized output format '', set one using the '-t' switch or as a file extension from the supported list ('xml', 'jsonlines', 'jl', 'json', 'csv', 'pickle', 'marshal')

跟踪链接

或许你希望获取网站所有页面的 quotes,而不是从 http://quotes.toscrape.com 的前两页抓取。

现在您已经知道如何从页面中提取数据,我们来看看如何跟踪链接。

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3.  
  4. class ToScrapeSpiderXPath(scrapy.Spider):
  5. name = 'quotes'
  6. start_urls = [
  7. 'http://quotes.toscrape.com/',
  8. ]
  9.  
  10. def parse(self, response):
  11. for quote in response.xpath('//div[@class="quote"]'):
  12. yield {
  13. 'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
  14. 'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
  15. 'tag': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
  16. }
  17.  
  18. next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
  19. if next_page_url is not None:
  20. yield scrapy.Request(response.urljoin(next_page_url),callback=self.parse)
  21. # if next_page_url is not None:  #相对链接
  22. # yield response.follow(next_page_url, callback=self.parse)

现在,在提取数据之后,parse() 方法查找到下一页的链接,使用 urljoin() 方法构建一个完整的绝对 URL(因为链接可以是相对的),并生成(yield)一个到下一页的新的请求, 其中包括回调方法(parse)。

您在这里看到的是 Scrapy 的链接跟踪机制:当您在一个回调方法中生成(yield)请求(request)时,Scrapy 将安排发起该请求,并注册该请求完成时执行的回调方法。

使用它,您可以根据您定义的规则构建复杂的跟踪链接机制,并根据访问页面提取不同类型的数据。

在我们的示例中,它创建一个循环,跟踪所有到下一页的链接,直到它找不到要抓取的博客,论坛或其他站点分页。

不像 scrapy.Request,response.follow 支持相对 URL - 不需要调用urljoin。请注意,response.follow 只是返回一个 Request 实例,您仍然需要生成请求(yield request)。

scrapy 学习笔记1的更多相关文章

  1. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...

  2. Scrapy:学习笔记(1)——XPath

    Scrapy:学习笔记(1)——XPath 1.快速开始 XPath是一种可以快速在HTML文档中选择并抽取元素.属性和文本的方法. 在Chrome,打开开发者工具,可以使用$x工具函数来使用XPat ...

  3. scrapy学习笔记(1)

    初探scrapy,发现很多入门教程对应的网址都失效或者改变布局了,走了很多弯路.于是自己摸索做一个笔记. 环境是win10 python3.6(anaconda). 安装 pip install sc ...

  4. Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战

    基础知识 class scrapy.spiders.CrawlSpider 这是抓取一般网页最常用的类,除了从Spider继承过来的属性外,其提供了一个新的属性rules,它提供了一种简单的机制,能够 ...

  5. scrapy 学习笔记2

    本章学习爬虫的 回调和跟踪链接 使用参数 回调和跟踪链接 上一篇的另一个爬虫,这次是为了抓取作者信息 # -*- coding: utf-8 -*- import scrapy class Myspi ...

  6. scrapy学习笔记一

    以前写爬虫都是直接手写获取response然后用正则匹配,被大佬鄙视之后现在决定开始学习scrapy 一.安装 pip install scrapy 二.创建项目 scrapy startprojec ...

  7. Scrapy 学习笔记(一)数据提取

    Scrapy 中常用的数据提取方式有三种:Css 选择器.XPath.正则表达式. Css 选择器 Web 中的 Css 选择器,本来是用于实现在特定 DOM 元素上应用花括号内的样式这样一个功能的. ...

  8. scrapy 学习笔记

    1.scrapy 配合 selenium.phantomJS 抓取动态页面, 单纯的selemium 加 Firefox浏览器就可以抓取动态页面了, 但开启窗口太耗资源,而且一般服务器的linux 没 ...

  9. scrapy学习笔记

    1.scrapy用哪条命令行重新编辑已有的项目?cd projectname 2.如何在pycharm中开启scrapy?先在终端创建一个项目(即文件夹),再在pycharm中打开.

随机推荐

  1. 「Django」rest_framework学习系列-路由

    自动生成4个url路由:from rest_framework import routersrouter = routers.DefaultRouter()router.register(r'wrx' ...

  2. 「Django」与mysql8连接的若干问题

    1.setting配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #数据库驱动名 'NAME': 'my_tes ...

  3. 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)

    所谓的以查询取代临时变量:就是当你的程序以一个临时变量保存某一个表达式的运算效果.将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函数的调用.此后,新函数就可以被其他函数调用. ...

  4. 面向对象 ( OO ) 的程序设计——理解对象

    本文地址:http://www.cnblogs.com/veinyin/p/7607938.html  1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...

  5. Tomcat 调优及 JVM 参数优化

    Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...

  6. 2-Python基础语法-内存管理-运算符-程序控制

    目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...

  7. python基础===拆分字符串,和拼接字符串

    给定某字符,只需要保留其中的有效汉字或者字母,数字之类的.去掉特殊符号或者以某种格式进行拆分的时候,就可以采用re.split的方法.例如 ============================== ...

  8. (转)什么是CDC类(Communication Device Class)

    全文地址:http://justmei.blog.163.com/blog/static/1160998532010321112522467/ 什么是CDC类 (Communication Devic ...

  9. mac 卸载 node并重新安装

    系统升级到 Sierra 之后,npm 经常出问题,最终把 node 卸载了,安装了新版本.mac 卸载 node 比较麻烦,stackoverflow 上面找到一个方法还不错,特地记录下来,代码如下 ...

  10. MySQL 视图、触发器、函数、存储过程

    1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...