js 爬虫抓取网页数据(关于爬虫内容的分享,我会分成两篇,六个部分来分享)

优采云 发布时间: 2022-03-08 04:07

  js 爬虫抓取网页数据(关于爬虫内容的分享,我会分成两篇,六个部分来分享)

  关于爬虫内容的分享,我将分为两部分,分享六个部分,分别是:

  1) 我们的目的是什么

  2) 内容从何而来

  3) 了解网络请求

  4) 一些常见的限制

  5) 尝试解决问题的想法

  6) 效率权衡

  本文首先讨论前三个部分。

  一、我们的目的是什么

  一般来说,我们需要抓取的是一个网站或者一个应用程序的内容,以提取有用的价值。内容一般分为两部分,非结构化文本,或结构化文本。

  1. 关于非结构化数据

  1.1 HTML 文本(包括 javascript 代码)

  HTML文本基本上是传统爬取过程中最常见的,也就是大部分时间会遇到的情况,比如爬取一个网页,得到HTML,然后需要解析一些常用元素,提取一些关键信息. 其实HTML应该属于结构化的文本组织,但是因为我们需要的关键信息不是直接可以得到的,需要对HTML进行解析和搜索,甚至可以得到一些字符串操作,所以还是归为非结构化数据。加工。

  常用的分析方法如下:

  *敏*感*词*融版块

  

  这里的 id 是金融。我们使用css选择器,即“#finance”来获取金融区的html。同理,可以根据具体的css选择器获取其他内容。

  XPATH是一种页面元素的路径选择方法,可以使用chrome快速获取,例如:

  

  copyXPATH 将得到 - //*[@id="finance"]

  正则表达式,使用标准正则解析,一般将HTML视为普通文本,并使用指定格式匹配为相关文本,适用于小片段文本,或者某个字符串,或者HTML收录javascript代码,不能使用CSS选择器或 XPATH 。

  和正则表达式一样,比较懒的方法,不推荐。

  1.2 一段文字

  比如一个文章,或者一个句子,我们的初衷是提取有效信息,所以如果是滞后处理,可以直接存储。如果需要实时提取有用信息,常用的处理方式有以下几种:

  根据捕获到的网站的类型,使用不同的词库,进行基本的分词,然后变成词频统计,类似于向量的表示,词是方向,词频是长度。

  自然语言处理,进行语义分析,并用结果来表达,例如正面和负面。

  2. 关于结构化数据

  结构化数据是处理它的最佳方式。一般是类似于JSON格式的字符串。您可以直接解析 JSON 数据并提取 JSON 的关键字段。

  二、内容从何而来

  过去,我们经常需要获取的内容主要来自网页。一般来说,当我们决定爬取时,就是网页上能看到的所有内容。但是随着近几年移动互联网的发展,我们也发现越来越多的内容会来自移动应用,所以爬虫不仅仅局限于抓取和解析网页,还可以模拟移动端的网络请求要抓取的应用程序,因此我将分两部分解释这部分。

  1. 网页内容

  网页内容一般是指我们最终在网页上看到的内容,但是这个过程并不像直接在网页的代码中收录内容那么简单,所以对于很多新手来说,会出现很多问题,比如:

  显然,当用 Chrome 或 Firefox 检查页面时,可以看到 HTML 标签中收录的内容,但在抓取时为空。

  很多内容必须通过点击按钮或执行交互操作来显示在页面上。

  因此,对于很多新手来说,做法是使用别人模拟浏览器操作的某种语言的库。其实就是调用本地浏览器或者收录一些执行javascript的引擎进行模拟操作来抓取数据。在抓取大量数据的情况下,效率非常低,相当于给技术人员自己用了一个盒子,那么这些内容到底是怎么显示在网页上的呢?主要分为以下几种情况:

  这种情况最容易解决。一般来说,基本上都是写死的静态网页,或者是使用模板渲染的动态网页。浏览器获取HTML的时候已经收录了所有的关键信息,所以直接在网页上面看到的内容可以通过特定的HTML标签获取

  这种情况是因为虽然网页显示时内容在html标签中,但实际上是通过执行js代码添加到标签中的,所以此时内容在js代码中,而js的执行是在浏览器端执行。所以当你使用程序请求网页地址时,得到的响应是网页代码和js代码,所以你可以在浏览器端看到内容。由于解析时没有执行js,所以一定要发现指定html标签下的内容一定是空的。此时的处理方式一般是查找收录该内容的js代码字符串,然后通过正则表达式获取对应的内容,而不是解析HTML标签。

  这种情况现在很常见,尤其是网页内容以分页的形式显示,并且页面没有刷新,或者是在网页上进行交互操作后获取到的内容。那么我们如何分析这些请求呢?这里我以Chrome的操作为例进行说明:

  

  所以当我们开始刷新页面的时候,我们需要开始跟踪所有的请求,观察数据是从哪里加载的。那么当我们找到核心异步请求时,只需要抓取异步请求即可。如果原创网页没有任何有用的信息,则无需抓取原创网页。

  2. 应用内容

  因为现在移动应用越来越多,很多有用的信息都在app里面。另外,在解析非结构化文本和结构化文本方面,结构化文本会简单很多。如果你同时拥有网站和App,建议爬取App,大部分情况下基本上只是一些JSON数据API。那么如何抓取App的数据呢?一般的方法是抓包。基本方法是在电脑上安装抓包软件,配置好端口,然后记下ip。手机端和电脑在同一个局域网,然后在手机的网络连接中设置代理。该应用程序执行一些操作。如果有网络数据请求,会被抓包软件记录下来。就像上面Chrome对网络请求的分析一样,可以看到所有的请求,模拟请求操作。这里我推荐 Mac 的 Charles 软件和 Windows 的 Fiddler2。

  怎么用,后面会详细解释,可能会涉及到HTTPS证书的问题。

  三、了解网络请求

  我刚刚广泛地提到了我们需要找到和提出的一些要求。请求只是一个过客,但是请求是一个很重要的部分,包括如何绕过限制以及如何发送正确的数据,都需要正确的请求,这里详细展开请求以及如何模拟请求。

  我们常说爬虫其实就是一堆HTTP请求,找到要爬取的链接,不管是网页链接还是App抓取得到的API链接,然后发送请求包得到返回包(有也是 HTTP 长连接,或者 Streaming ,这里不考虑),所以核心要素是:

  1)网址

  2)请求方法(POST、GET)

  3)请求包头

  4)请求包内容

  5)返回包头

  在使用 Chrome 捕获网络请求或使用抓包工具分析请求时,最重要的是弄清楚请求头中的 URL、请求方法和字段。大部分问题都在headers中,最常被限制的字段是即User-Agent、Referer、Cookie。此外,Base Auth还在headers中添加了Autheration字段。

  请求的内容是post时需要发送的数据,一般对Key-Value进行urlencode

  大部分返回的包头都会被人忽略,可能仅仅获取到内容就够了,但其实很多时候很多人会发现请求包的url、请求方法和内容都是对了,为什么没有返回内容,还是找到了请求,其实这大概有两个原因:

  一种是返回包的内容是空的,但是返回包的headers字段中有一个Location。这个Location字段告诉浏览器重定向,所以有时候代码不会自动跟踪,自然就没有内容了;

  还有一个就是很多人头疼的cookie问题。简单来说就是为什么浏览器知道你的请求是合法的,比如登录等。其实可能是你之前请求的返回包的header中有一个字段叫做Set-Cookie,Cookie本地存在。一旦设置好,除非过期,否则会自动添加到请求字段中,所以Set-Cookie中的内容会告诉浏览器存储了多长时间,存储了哪些内容,在哪个路径下有用。Cookie 都是在指定域下,一般不跨域,域就是你请求的链接主机。

  所以在分析request的时候一定要注意前4个,模拟的时候保持一致,观察第5个return是受限还是redirect。

  孔淼

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线