美文网首页我爱编程
怎么从本地JavaScript语句中提取数据

怎么从本地JavaScript语句中提取数据

作者: 小贤tx | 来源:发表于2018-06-27 17:11 被阅读0次

CSS表达式和XPath表达式不是银色的子弹

当抓取一些网页时,数据被包含在一些本地JavaScript语句(js对象)中,我们需要找到一种方法来提取数据,而不会导入诸如phantomjs之类的重度浏览器。css表达和xpath表达无法很好地完成这项工作,我们需要其他选择来解决这个问题。

如果你Scrapy tutorial在谷歌搜索,大多数会告诉你如何使用css或xpath表达式来提取数据,只要你喜欢。但是,regex在另一些情况下,它是帮助您提取数据的另一个强大工具,似乎它已被大多数人忽略。

在这个Scrapy教程中,我将向您展示如何使用Regex和Json从原生JavaScript语句中提取数据。但是,您也可以在使用其他框架(如BeautifulSoup)开发web scraper时使用该方法。

检查HTML源代码

假设我们正在抓取的目标网页是http://quotes.toscrape.com/js/,如果您检查该网页的html源代码,您会发现数据是在javascript对象中调用的data。

var data = [ 

      “tags” :[ 

              “change” ,“deep-thoughts” ,

               “thinking” ,

                “world” 

            ],

           “author” :{ 

                 “name” :“Albert Einstein” ,

                 “goodreads_link” :“/ author / show / 9810.Albert_Einstein“ ,

                 ”slug“ :”Albert-Einstein“ 

             },”text“ :”\ u201c我们创造的世界是我们思考的过程,不改变我们的思维就不能改变。\ u201d “ },

......


data当页面在网络浏览器中呈现时,网页中的JavaScript会迭代对象并创建DOM,因为它不包含在原始HTML中,因此您无法使用xpath表达式或css表达式来提取Scrapy或BeautifulSoup中的数据。

在我们开始之前,您应该对Json的基本知识有所了解。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。人类阅读和写作很容易。机器解析和生成很容易。它基于JavaScript编程语言的一个子集

在这里,我们需要从HTML源代码中提取有效的json文本,然后json在Python中使用库来加载数据,之后我们可以轻松访问数据。

正则表达式来提取数据,JSON来加载数据

正则表达式是用于描述搜索模式的特殊文本字符串。你可以将正则表达式看作类固醇上的通配符。

首先,我们可以re从Python 进入Scrapy shell和导入库。

$ scrapy shell'http://quotes.toscrape.com/js/'

在[1]中:import re


现在我们需要从代码块中提取JavaScript列表

在[ 2 :data = re 。的findall (“VAR数据=(+);?\ n ” ,响应。体。解码(“UTF-8” ),再。小号)


让我解释一下这个说法。我们使用re.findall帮助我们从中找到匹配文本的方法response.body。var data =(.+?);这里是我们创建的正则表达式表达式的含义是查找var data第一个和第一个之间的所有内容;\n。这re.S是正则表达式传递的正则表达式,这里re.S告诉正则表达式引擎表达式匹配换行符。

如果re.findall可以找到一个mateched,它会回退,如果没有,它会返回None。提取json数据文本后,我们可以在Python中使用json库来加载数据,以便我们可以轻松访问数据。

导入json

ls = []

如果数据:    

        ls = json.loads(data [0])

如果ls:    

       打印(LS)


现在我们可以看到数据可以像Python原生字典和列表一样被访问。

[{'author':{'goodreads_link':'/author/show/9810.Albert_Einstein',  

    '名字':'阿尔伯特爱因斯坦',  

    'slug':'Albert-Einstein'},  

    'tags':['change','deep-thoughts','thinking','world'],  

     '文本':''我们创造它的世界是我们思考的过程。不改变我们的想法就不能改变。“'}, 

  {'author':{'goodreads_link':'/author/show/1077326.J_K_Rowling',  

    'name':'JK罗琳',  

       'slu'':'JK罗琳'},  

      'tags':['abilities','choices'],  

      '文本':'“这是我们的选择,哈利,它显示了我们真正的实力,远远超过

我们的能力。”'}, 

{'author':{'goodreads_link':'/author/show/9810.Albert_Einstein',  

      '名字':'阿尔伯特爱因斯坦',  

      'slug':'Albert-Einstein'},  

      '标签':['励志','生活','生活','奇迹','奇迹'],  '文字':'“只有两种方式来过你的生活。其中一个就像没有奇迹。另一种就好像一切都是奇迹。“'},  ......

]


有没有一些好的资源或工具可以让我学习正则表达式?

如果你想学习正则表达式,你可以检查re模块的doc 。

python2重新模块

python3重新模块

如果你想调试你的正则表达式,你可以检查regex101,这是一个很棒的在线免费工具,可以让你调试你的正则表达式。

有没有其他的方法来从JavaScript中抓取数据

JavaScript的数据将被用于创建网页的html元素,所以如果你很难在scrapy蜘蛛中编写正则表达式,你可以使用Selenium来完成工作。

真实世界的例子

现在我可以给你一个真实的例子,让你更好地理解关键点。

例如,你的老板需要你收集一些关于时尚产业的数据,那么你可能想写蜘蛛来获取zara.com的数据,当挖掘zara产品的数据时,你会发现产品的细节包含在javascript代码块,因此您可以使用我上面讨论的方法快速提取数据。

您可以在代码块中找到产品的详细信息

window.zara.appConfig = ............window.zara.viewPayload = window.zara.dataLayer;

现在你可以享受自己的写的过程了。

相关文章

  • 怎么从本地JavaScript语句中提取数据

    CSS表达式和XPath表达式不是银色的子弹 当抓取一些网页时,数据被包含在一些本地JavaScript语句(js...

  • .Net学习之--SQL Server(二)

    一些最重要的SQL语句: SELECT - 从数据库中提取数据 UPDATA - 跟新数据库中的数据 DELETE...

  • MySQL学习

    mysql -uroot -p//登录 //基本语句SELECT - 从数据库中提取数据UPDATE - 更新数据...

  • javascript基础

    javascript: 变量的使用、数据类型、if判断、循环语句 javascript 中的注释: //...

  • python学习第四天

    1.爬虫 大数据 , 提取本地hmtl中的数据 步骤①新建html文件②读取③使用lxml中的xpath语法进行提...

  • javascript tips记录

    使用javascript过程中遇到的一些tips javascript if 语句 javascript的条件语句...

  • 2019-08-09 SQL

    2019-08-09 下午: SQL :结构性查询语句。从数据库查询、提取、插入、删除数据。 No sql 是SQ...

  • 数据提取之JSON

    数据提取 什么是数据提取? 简单的来说,数据提取就是从响应中获取我们想要的数据的过程 数据分类 非结构化的数据:h...

  • PHP MySQL Delete(删除纪录)

    DELETE FROM 语句用于从数据库表中删除行。 删除数据库中的数据 DELETE FROM 语句用于从数据库...

  • sqlite3逆序分页读取数据

    项目中有一个需求: 从本地数据库读取数据,读取方式为分页、逆序; 如下: 核心的语句就是下面的sql 语句 因为每...

网友评论

    本文标题:怎么从本地JavaScript语句中提取数据

    本文链接:https://www.haomeiwen.com/subject/ciciyftx.html