第二章 简单网页的爬取与Xpath、Json使用 2021-09-09

爬虫系列总目录

本章节介绍爬虫中使用的基础库用于选择,过滤页面信息。包括requests,bs4,xpath,正则表达式re,json 等内容,能够实现对简单页面的获取。
第二章 爬虫基础库-requests/bs4
第二章 正则表达式
第二章 简单网页的爬取与Xpath、Json使用


一、数据的分类

爬虫的步骤简单来说可以分为:

  1. 定目标(明确爬取的内容–>网址等等)
  2. 爬数据(获取所有的内容)
  3. 取数据(解析数据,去掉我们不需要的数据)
  4. 存数据(根据自己需求存储)

其中第三步获取数据,获取到的内容一般来说分为两部分:结构化数据和非结构化数据
结构化数据

  • 结构化数据: 先定义结构,再存入数据, 如JSON文件及XML文件
  • 非结构化数据:先有数据,在定义结构,如:文本、电话号码、邮箱地址、HTML文件

二、解析某段子网

2.1 确定目标

目标网站:https://duanzixxxx.com/
第二页: https://duanzixxxx.com/page/2/

2.2 获取响应

编码的查看方法,

  • head meta
    在这里插入图片描述
  • 页面中查找 charset 属性
    在这里插入图片描述
def get_response(url, headers=None):
    """获取响应"""

    _headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
    }
    if headers:
       _headers = headers
    res = requests.get(url, headers=_headers)
    # 如果当前网站不是utf8的编码 需要在括号内指定对应的编码
    return res.content.decode()   

2.3 筛选数据

拓展: re.S
如果需要匹配的目标数据中有换行,在Python的正则表达式中,有一个参数为re.S。它表示“.”的作用扩展到整个字符串,包括“\n”。

a = '''asdfsafhellopass:
     worldafdsf
     '''
b = re.findall('hello(.*?)world',a)
c = re.findall('hello(.*?)world',a,re.S)

2.4 运行并保存数据

三.使用Xpath解析数据

XPath 是一门在 XML 文档中查找信息的语言。XPath使用路径表达式来选取 XML 文档中的节点或节点集。

3.1 什么是XML

  • XML 指可扩展标记语言(EXtensible MarkupLanguage)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 的标签需要我们自行定义。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

3.1.1 XML 和 HTML 的区别:

  • XML :(Extensible Markup Language)(可扩展标记语言)被设计为传输和存储数据,其
    焦点是数据的内容。
  • HTML: HyperText Markup Language(超文本标记语言)显示数据以及如何更好显示数据。
  • HTMLDOM: Document Object Model for HTML (文档对象模型)通过 HTML DOM,可以访问所有的 HTML 元素,连同它们所包含的文本和属性。可以对其中的内容进行修改和删,同时也可以创建新的元素。

3.2 解析网页

# etree.parse()  # 从文件中读取html代码
# etree.HTML()  # 从字符串中解析html代码

from lxml.html import fromstring
# 从字符串中解析html代码
# fromstring()  与 etree.HTML() 功能相等

from lxml import etree
html = etree.parse('baidutieba.html', etree.HTMLParser())
# 选取节点
all_li = html.xpath('//li')

3.3 选取节点

XPath 使用路径表达式来选取 XML 文档中的节点或者节nodename 选取此节点的所有子节点集。

  • nodename 选取此节点的所有子节点。
  • / 从根节点选取。
  • // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
  • . 选取当前节点。
  • .. 选取当前节点的父节点。
  • @ 选取属性。
  • /text()---->获取的是标签中直系的文本内容 结果为list
  • //text()----->标签中非直系的文本内容(所有的文本内容) 结果为list

例如:

  • div 选取 div元素的所有子节点。
  • /div 选取根元素 div。注意:假如路径起始于正斜杠( / ),则此路径始终代表到div元素
    的绝对路径!
  • div/p 选取属于 div 的子元素的所有 p 元素。
  • //div 选取所有 div 子元素,而且不管它们在文档中的位置。
  • div//p 选择属于 div 元素的后代的所有 p 元素,而且不管它们位于 div 之下的什么位置。
  • //@box1 选取名为box1 的所有属性。

3.4 使用通配符选取未知节点

通配符及描述

  • * 匹配任何元素节点。
  • @* 匹配任何属性节点。
  • node() 匹配任何类型的节点。

3.5 遍历HTML 页面中的家族树

网页的每个元素都包括父元素,兄弟元素和子元素。使用这些关系方便我们更好的遍历页面。

table = tree.xpath('//table')[0]
# 获取所有子元素
table.getchildren()
# 获取父元素
table.getprevious()
# 获取兄弟元素
table.getnext()

四、 JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

4.1 Python处理json

在Python中内置了一个模块json,用来处理json数据。该模块提供了四个功能:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。

  • json.loads() :把Json格式字符串解码转换成Python对象
  • json.dumps(): 实现python类型转化为json字符串,返回一个str对象 把一个Python对象编码转换成Json字符串。
  • json.dump():将Python内置类型序列化为json对象后入文件
  • json.load():读取文件中json形式的字符串元素 转化成python类型

4.2 JsonPath(了解)

JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具。JsonPath 对于 JSON 来说,相当于XPATH 对于 XML。
JsonPath与XPath语法对比:Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
在这里插入图片描述
五、练习
段子网数据获取
36kr 首页文章获取
JS 练习 腾讯招聘数据获取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值