网页源码解析模块介绍及实战

皮卡丘联合爬虫业界大牛FastGets整理一系列文章,介绍python爬虫基础知识、大牛多年反爬经验,有难度网站抓取实战、爬虫系统架构设计、安卓app逆向分析。帮助小白入门,初级工程师成为资深工程师,大神回顾。大家有任何问题可留言交流,欢迎转发分享。

上一篇主要介绍了爬虫抓取的模块,抓取下来的文本内容主要是json字符串形式或html源码形式,前者解析比较方便,直接使用python3的json模块的loads方法,即可将json字符串形式转变成python常用的列表或字典形式;后者比较麻烦,所以本文主要介绍后者的解析。这里主要介绍xpath和正则表达式来解析html源码并提取所需信息。

一、xpath介绍

xpath是XML路径语言,它是一种用来确定XML文档中某部分位置的语言。xpath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。这里主要使用实战例子来介绍笔者在爬虫源码解析中的几种常用方法。

1. 首先我们使用lxml模块将html源码字符串转换成HtmlElement对象的树形结构。Python 标准库中自带的 xml 模块与第三方库BeautifulSoup,性能都不够好,而且缺乏一些人性化的 api,相比之下,第三方库lxml,速度比较快,对用户比较友好。代码如下:

2. 下面我们用xpath的路径表达式来定位树形结构上的元素,提取我们所需要的信息。

(1) 定位html标签节点

(2) 定位到标签的属性

(3) 定位到标签里面的文本

(4) 根据特定的属性选择节点

(5) 获取节点的父亲节点

(6) 获取节点的后续同级节点

(7) 节点对象一些常用的方法

3. 下面我们来解析36kr新闻详情页面的数据

(1) 在Chrome里面安装xpath helper插件,在工具栏,更多工具,扩展程序,里面搜索xpath helper,然后安装。

(2) 下面我们来看看http://36kr.com/p/5130007.html这篇新闻的标题的xpath。

打开页面后,点击红色箭头标记处的小图标,就会出现xpath helper插件,我们在xpath helper里面写xpath,右边就会展示我们xpath路径的结果,下面我们运行代码看看结果。

可以看到,输出的结果是空列表,但是我们的xpath又没有写错,怎么会这样呢?出现这种原因,很大可能是html源码与浏览器的开发者工具里面显示的不一样,因为浏览器加载源码会执行一些js代码,致使它们不一样。这个时候,我们点击显示网页源码,我们从源码里面查找不到class='mobile_article'。但是笔者发现我们所需要的数据在props变量的值里面,这是一个json字符串,如下图。

我们可以用正则表达式,将json字符串提取出来,然后用json模块来解析,代码如下。

二、正则表达式介绍

正则表达式简单来讲就是字符串规则,用这个规则,我们从html源码字符串里面提取出符合我们规则的信息,python中主要使用re模块来做正则表达式。爬虫中使用的正则表达式并不复杂,都是一些比较简单的。由于我们篇幅有限,我们就在实战中介绍一些常用的。

笔者经常使用re.findall(pattern, string)方法来提取string中的所需要的信息,pattern即是正则表达式。如下示例:

以下是常用正则表达式字符集

熟练掌握正则表达式是每一个程序员必须具备的技能。python正则表达式详细介绍可以看这篇文章 http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

三、爬虫抓取解析实战

抓取虎嗅网(https://www.huxiu.com/)新闻,分析虎嗅网的网页结构可知,虎嗅网的新闻资讯分为不同的类别,我们分别抓取这些类别,然后再进入类别下面的新闻列表页进行抓取,如下图。

点击电商消费类别,出现电商消费类的新闻列表,如下图。

抓取思路:我们先从虎嗅网首页抓取新闻资讯类别,然后进入每个类别的列表页抓取新闻列表,然后再抓取新闻的详情页。笔者提供如下代码:

以后每篇文章的代码都可以在github的CrawlArticles仓库查看:https://github.com/piweidong/CrawlArticles

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180501G0EM2B00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券