scrapy 学习笔记1
最近一段时间开始研究爬虫,后续陆续更新学习笔记
爬虫,说白了就是获取一个网页的html页面,然后从里面获取你想要的东西,复杂一点的还有:
- 反爬技术(人家网页不让你爬,爬虫对服务器负载很大)
- 爬虫框架(你不可能逮到一个需求就从头写个爬虫把,框架已经有了)
- 多线程
当然这是我自己的理解,而scrapy框架算是比较流行的python爬虫框架,开始搞把
目前的套路就是学到能爬你想爬的any网站,然后获取你想要的any数据,至于反爬什么的,网络限制什么的,再看吧,把基础的弄好.
用的是1.4版本,默认已经安装好了.
创建项目:
- dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy$ scrapy startproject myfirstpro
后面开可以再跟一个目录名称,如果没有就是同名的,你可以这样: $ scrapy startproject myfirstpro mydir
我们可以看出文件结构:
- dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy$ tree
- .
- └── myfirstpro
- ├── myfirstpro
- │ ├── __init__.py
- │ ├── items.py
- │ ├── middlewares.py
- │ ├── pipelines.py
- │ ├── settings.py
- │ └── spiders
- │ └── __init__.py
- └── scrapy.cfg
- directories, files
第一个爬虫:
爬虫位置在spiders 里面,目录下的名为 quotes_spider.py 的文件中
- #!/usr/bin/python
- #coding=utf-8
- import scrapy
- class QuotesSpider(scrapy.Spider):
- name = "quotes" #用于识别 Spider。 它在项目中必须是唯一的,也就是说,您不能为不同的 Spider 设置相同的名称。
- def start_requests(self): #必须返回一个 Requests 的迭代(您可以返回一个 requests 列表或者写一个生成器函数),Spider 将从这里开始抓取。 随后的请求将从这些初始请求连续生成。没有也行,但是要有start_urls ,这是个列表,放初始的链接
- urls = [
- 'http://quotes.toscrape.com/page/1/',
- 'http://quotes.toscrape.com/page/2/',
- ]
- for url in urls:
- yield scrapy.Request(url=url, callback=self.parse)
- def parse(self, response): #用来处理每个请求得到的响应的方法。 响应参数是 TextResponse 的一个实例,它保存页面内容,并且还有其他有用的方法来处理它。方法通常解析响应,将抓取的数据提取为字典,并且还可以查找新的 URL 来跟踪并从中创建新的请求(Request)。
- page = response.url.split("/")[-2]
- filename = 'quotes-%s.html' % page
- with open(filename, 'wb') as f:
- f.write(response.body) #直接把服务器的响应全保存了
- self.log('Saved file %s' % filename) #出现在日志里的一个方法
运行:
- dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ scrapy crawl quotes
可以看到生成的文件:
- dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ tree
- .
- ├── myfirstpro
- │ ├── __init__.py
- │ ├── __init__.pyc
- │ ├── items.py
- │ ├── middlewares.py
- │ ├── pipelines.py
- │ ├── settings.py
- │ ├── settings.pyc
- │ └── spiders
- │ ├── __init__.py
- │ ├── __init__.pyc
- │ ├── quotes_spider.py
- │ └── quotes_spider.pyc
- ├── quotes-.html
- ├── quotes-.html
- └── scrapy.cfg
- directories, files
在爬虫中提取数据
到目前为止,它并没有提取任何数据,只将整个 HTML 页面保存到本地文件。这里用到了xpath语法来提取数据
Scrapy 爬虫通常生成许多包含提取到的数据的字典。 为此,我们在回调方法中使用 yield Python 关键字,如下所示:
- #!/usr/bin/python
- #coding=utf-
- #
- import scrapy
- class QuotesSpider(scrapy.Spider):
- name = "quotes"
- start_urls = [
- 'http://quotes.toscrape.com/page/1/',
- 'http://quotes.toscrape.com/page/2/',
- ]
- def parse(self, response):
- for quote in response.css('div.quote'):
- yield {
- 'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
- 'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
- 'tag': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract(),
- }
运行爬虫,会有日志显示:
- -- :: [scrapy.core.engine] DEBUG: Crawled () <GET http://quotes.toscrape.com/page/1/> (referer: None)
- -- :: [scrapy.core.scraper] DEBUG: Scraped from < http://quotes.toscrape.com/page/1/>
- {'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'}
- -- :: [scrapy.core.scraper] DEBUG: Scraped from < http://quotes.toscrape.com/page/1/>
- {'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,使用以下命令:
- scrapy crawl quotes -o quotes.json
这将生成一个 quotes.json 文件,其中包含所有抓取到的 JSON 序列化的数据。
由于历史原因,Scrapy 追加内容到给定的文件,而不是覆盖其内容。 如果您在第二次之前删除该文件两次运行此命令,那么最终会出现一个破坏的 JSON 文件。您还可以使用其他格式,如 JSON 行(JSON Lines):
- scrapy crawl quotes -o quotes.jl
JSON 行格式很有用,因为它像流一样,您可以轻松地将新记录附加到文件。 当运行两次时,它不会发生 JSON 那样的问题。 另外,由于每条记录都是单独的行,所以您在处理大文件时无需将所有内容放到内存中,还有 JQ 等工具可以帮助您在命令行中执行此操作。
在小项目(如本教程中的一个)中,这应该是足够的。 但是,如果要使用已抓取的项目执行更复杂的操作,则可以编写项目管道(Item Pipeline)。 在工程的创建过程中已经为您创建了项目管道的占位符文件pipelines.py, 虽然您只需要存储已抓取的项目,不需要任何项目管道。
输出的文件格式,可以看出,有多种格式可以选择:
- dahu@dahu-OptiPlex-:~/PycharmProjects/myscrapy/myfirstpro$ scrapy crawl quotes -o -h
- Usage
- =====
- scrapy crawl [options] <spider>
- 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 的前两页抓取。
现在您已经知道如何从页面中提取数据,我们来看看如何跟踪链接。
- # -*- coding: utf-8 -*-
- import scrapy
- class ToScrapeSpiderXPath(scrapy.Spider):
- name = 'quotes'
- start_urls = [
- 'http://quotes.toscrape.com/',
- ]
- def parse(self, response):
- for quote in response.xpath('//div[@class="quote"]'):
- yield {
- 'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
- 'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
- 'tag': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
- }
- next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
- if next_page_url is not None:
- yield scrapy.Request(response.urljoin(next_page_url),callback=self.parse)
- # if next_page_url is not None: #相对链接
- # 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的更多相关文章
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...
- Scrapy:学习笔记(1)——XPath
Scrapy:学习笔记(1)——XPath 1.快速开始 XPath是一种可以快速在HTML文档中选择并抽取元素.属性和文本的方法. 在Chrome,打开开发者工具,可以使用$x工具函数来使用XPat ...
- scrapy学习笔记(1)
初探scrapy,发现很多入门教程对应的网址都失效或者改变布局了,走了很多弯路.于是自己摸索做一个笔记. 环境是win10 python3.6(anaconda). 安装 pip install sc ...
- Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战
基础知识 class scrapy.spiders.CrawlSpider 这是抓取一般网页最常用的类,除了从Spider继承过来的属性外,其提供了一个新的属性rules,它提供了一种简单的机制,能够 ...
- scrapy 学习笔记2
本章学习爬虫的 回调和跟踪链接 使用参数 回调和跟踪链接 上一篇的另一个爬虫,这次是为了抓取作者信息 # -*- coding: utf-8 -*- import scrapy class Myspi ...
- scrapy学习笔记一
以前写爬虫都是直接手写获取response然后用正则匹配,被大佬鄙视之后现在决定开始学习scrapy 一.安装 pip install scrapy 二.创建项目 scrapy startprojec ...
- Scrapy 学习笔记(一)数据提取
Scrapy 中常用的数据提取方式有三种:Css 选择器.XPath.正则表达式. Css 选择器 Web 中的 Css 选择器,本来是用于实现在特定 DOM 元素上应用花括号内的样式这样一个功能的. ...
- scrapy 学习笔记
1.scrapy 配合 selenium.phantomJS 抓取动态页面, 单纯的selemium 加 Firefox浏览器就可以抓取动态页面了, 但开启窗口太耗资源,而且一般服务器的linux 没 ...
- scrapy学习笔记
1.scrapy用哪条命令行重新编辑已有的项目?cd projectname 2.如何在pycharm中开启scrapy?先在终端创建一个项目(即文件夹),再在pycharm中打开.
随机推荐
- 「Django」rest_framework学习系列-路由
自动生成4个url路由:from rest_framework import routersrouter = routers.DefaultRouter()router.register(r'wrx' ...
- 「Django」与mysql8连接的若干问题
1.setting配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #数据库驱动名 'NAME': 'my_tes ...
- 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
所谓的以查询取代临时变量:就是当你的程序以一个临时变量保存某一个表达式的运算效果.将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函数的调用.此后,新函数就可以被其他函数调用. ...
- 面向对象 ( OO ) 的程序设计——理解对象
本文地址:http://www.cnblogs.com/veinyin/p/7607938.html 1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...
- Tomcat 调优及 JVM 参数优化
Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- python基础===拆分字符串,和拼接字符串
给定某字符,只需要保留其中的有效汉字或者字母,数字之类的.去掉特殊符号或者以某种格式进行拆分的时候,就可以采用re.split的方法.例如 ============================== ...
- (转)什么是CDC类(Communication Device Class)
全文地址:http://justmei.blog.163.com/blog/static/1160998532010321112522467/ 什么是CDC类 (Communication Devic ...
- mac 卸载 node并重新安装
系统升级到 Sierra 之后,npm 经常出问题,最终把 node 卸载了,安装了新版本.mac 卸载 node 比较麻烦,stackoverflow 上面找到一个方法还不错,特地记录下来,代码如下 ...
- MySQL 视图、触发器、函数、存储过程
1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...