【2022】1月14日随记

学习内容

Python数据解析

数据解析主要的方式有三种:

  • 使用正则表达式。这种方案的优点是不局限于Python,实际上很多有关模式匹配的场景中都能应用到;缺点也很明显,实际应用的表达式不容易写。
  • 使用Beautiful Soap模块。与正则表达式的方案刚好相反,该模块中的解析功能依赖于其中的属性或是函数,相对而言方便使用和理解;但是这个方法只有在Python的环境下可以使用(其实无伤大雅,甚至有点废话)。
  • 使用Xpath模块。Xpath是Python的一个库,但是实际上来源于XML Path Language(直译为XML路径语言)。这种语言设计的初衷是为了能够轻易地在XML文件中查找信息,鉴于XML是HTML的一种扩展,自然也能够用来定位HTML中的信息。它介于上述两种方法之间,既保证了格式字符串比较容易编写,又不完全局限于Python的环境,因此通常可以作为首要选择。

数据解析是数据处理流程中的步骤,对于使用爬虫获取并处理数据而言,通常可以在请求并获得想要的原始页面数据之后完成。

mountains

使用正则表达式

相比于昨天的简易案例,今天的代码加上了UA伪装,并尝试爬取图片。

import requests
import re

if __name__ == "__main__":
    url = "https://www.grobsr.com/post-2022-1-13/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
                      "(KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
    }
    pageContent = requests.get(url, headers=headers).text
    expression = "<div class=\"wp-block-image\">.*?data-original=\"(.*?)\" src.*?</div>"
    imageUrl = re.findall(expression, pageContent, re.S)
    image = requests.get(imageUrl[0], headers=headers).content  # 由于昨天的文章中只有一张图片,不必写循环处理
    filepath = "./" + imageUrl[0].split('/')[-1]
    with open(filepath, "wb") as filePointer:
        filePointer.write(image)

总的来说,逻辑上没有什么大的问题,如果要说难还是难在正则表达式本身。

使用Beautiful Soap模块

和正则表达式的内容大部分是一致的,区别从实例化BeautifulSoap(表示类)的对象开始。实例化的过程中构造函数需要两个参数:原始页面的数据和固定字符串”lxml“,其中lxml是一个用来快速处理XML和HTML的Python库。

之后Beautiful Soap模块提供了一系列属性和函数用来定位所需信息,其中:

  • 可以使用标签名的属性来获取第一次出现的对应标签
  • 可以使用find()函数,入参是标签名,同样可以获取第一次出现的对应标签
  • 可以使用find_all()函数来获取所有同样的标签形成的列表
  • 可以使用select()函数来通过css选择器来获取标签

获取到标签之后,其中的文本内容可以通过text属性/get_text()函数来取得标签下的所有文本,或者通过string属性仅取得直属于当前标签的文本。此外,还能够将(标签的)属性名作为键值取出相应的属性值。

import requests
from bs4 import BeautifulSoup

if __name__ == "__main__":
    url = "https://www.grobsr.com/post-2022-1-13/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
                      "(KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
    }
    pageContent = requests.get(url, headers=headers).text
    beautifulSoup = BeautifulSoup(pageContent, "lxml")
    # 注意此处的imageUrl和第一种方法中类型不同
    imageUrl = beautifulSoup.select(".wp-block-image img")[0]["data-original"]
    image = requests.get(imageUrl, headers=headers).content  # 由于昨天的文章中只有一张图片,不必写循环处理
    filepath = "./" + imageUrl.split('/')[-1]
    with open(filepath, "wb") as filePointer:
        filePointer.write(image)

使用Xpath模块

在Python的数据解析范畴内,虽然Xpath也可以认为是一个Python库,但是使用的过程更近似于正则表达式——其中的关键是写好标签的格式字符串。

和许多文件字符串类似的,/表示一层目录,//表示多层目录。在标签或是某一层目录中,可以使用依据格式获取所需要的属性值。

import requests
from lxml import etree

if __name__ == "__main__":
    url = "https://www.grobsr.com/post-2022-1-13/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
                      "(KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
    }
    pageContent = requests.get(url, headers=headers).text
    tree = etree.HTML(pageContent)
    # 注意此处的imageUrl和第二种方法中类型不同
    imageUrl = tree.xpath("//div[@class=\"wp-block-image\"]//img/@data-original")
    image = requests.get(imageUrl[0], headers=headers).content  # 由于昨天的文章中只有一张图片,不必写循环处理
    filepath = "./" + imageUrl[0].split('/')[-1]
    with open(filepath, "wb") as filePointer:
        filePointer.write(image)

心得体会

综合看来,数据处理相关的操作还是免不了要和正则表达式打交道。虽然到今天为止还是觉得这个内容非常折磨,但有时间还是要详细地再去把它掌握好。

有个小彩蛋:我网站中的图片是用webp格式存储的,当时作出这个选择是因为听说这样效率比较高。但是今天爬取图片完成,尝试打开验证的时候发现Pycharm不支持直接打开webp文件,所以这种格式到底是更便捷还是更累赘呢?

  请注意信息的时效性:文章标题下的时间是文章发布时间,光标在该处悬停可以看到最新修改时间。
  版权声明:
    若无特殊说明,本站所有内容均为原创,采用 CC BY-NC-SA 4.0 许可协议进行共享 。
    需转载请注明原文标题:【2022】1月14日随记 及链接:https://www.grobsr.com/post-2022-1-14/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇