山东大学软件工程应用与实践——ECommerceCrawlers代码分析(二)

2021SC@SDUSC


目录

一、摘要

二、正则表达式解析

1.介绍

2.正则表达式元字符

3.re模块 

4.re模块爬取豆瓣top250实例 

三、bs4解析 

1.介绍

2.语法

四、xpath解析

1.介绍

2.用法

3.实例

 五、总结


一、摘要

本篇博客是项目代码分析的第二篇,由于整个项目都是基于python的爬虫项目,所以我需要先学习python爬虫的相关技术,掌握这方面的知识,然后再分析项目代码。 

本篇主要介绍的是我学习与爬虫相关的数据解析技术(正则表达式解析、bs4解析、xpath解析),因为爬虫一般抓取的都是网页的内容,在复杂繁多的网页内容里如何找到需要的内容,这就需要用到数据提取解析技术。

二、正则表达式解析

1.介绍

Regular Expression,正则表达式,⼀种使用表达式的⽅式对字符串进行匹配的语法规则,爬虫抓取的网页内容本质上就是一个超长的字符串,正则表达式可以很容易的从中提取数据。它的优点是速度快,效率高,准确性高。

2.正则表达式元字符

元字符:具有固定含义的特殊符号 常⽤元字符:

  1.  . 匹配除换⾏符以外的任意字符
  2. \w 匹配字⺟或数字或下划线
  3. \s 匹配任意的空⽩符
  4. \d 匹配数字
  5. \n 匹配⼀个换⾏符
  6. \t 匹配⼀个制表符
  7. ^ 匹配字符串的开始
  8. $ 匹配字符串的结尾
  9. \W 匹配⾮字⺟或数字或下划线
  10. \D 匹配⾮数字
  11. \S 匹配⾮空⽩符
  12. a|b 匹配字符a或字符b
  13. () 匹配括号内的表达式,也表示⼀个组
  14. [...] 匹配字符组中的字符
  15. [^...] 匹配除了字符组中字符的所有字符

量词:控制前面的元字符出现的次数

  1. * 重复零次或更多次
  2. + 重复⼀次或更多次
  3. ? 重复零次或⼀次
  4. {n} 重复n次
  5. {n,} 重复n次或更多次
  6. {n,m} 重复n到m次

贪婪匹配(尽可能多的匹配)与惰性匹配(尽可能少的匹配)。 

  1. .* 贪婪匹配
  2. .*? 惰性匹配

3.re模块 

在python中用re模块来使用正则表达式

  1. findall 查找所有,返回list
  2. search 会进⾏匹配,但是如果匹配到了第⼀个结果,就会返回这个结果,如果匹配不上search返回的则是None
  3. match 只能从字符串的开头进行匹配
  4. finditer,和findall差不多,只不过这时返回的是迭代器
  5. compile() 可以将⼀个长长的正则进行预加载,方便后面的使用

4.re模块爬取豆瓣top250实例 

import requests
import re
import csv
url = "https://movie.douban.com/top250"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400"
}
resp = requests.get(url, headers=headers)
page_content = resp.text
# 解析数据,正则表达式
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
                 r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?<span '
                 r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
                 r'<span>(?P<num>.*?)人评价</span>', re.S)
# 开始匹配
result = obj.finditer(page_content)
f = open("data.csv", mode="w",encoding="utf-8")
csvwriter = csv.writer(f)
for it in result:
    dic = it.groupdict()
    dic['year'] = dic['year'].strip()
    csvwriter.writerow(dic.values())
f.close()
print("over!")

 爬取之后保存为csv文件,结果如图:

 

三、bs4解析 

1.介绍

Beautiful Soup库是解析、遍历、维护“html标签树”的功能库。在爬虫中用于解析数据。

2.语法

import requests
from bs4 import BeautifulSoup

resp = requests.get(url)
page = BeautifulSoup(resp.text)
page.find("div", class="xxx")

页面源代码丢给BeautifulSoup,然后就可以通过bs对象去检索页面源代码中的html标签了,BeautifulSoup对象获得html中的内容主要用两个方法实现:

  1. find(标签, 属性=值)  (在页面中查找xxx标签,并且标签的xxx属性必须是xxx值)
  2. find_all()

 find查找一个,find_all查找所有的,二者参数一致。

四、xpath解析

1.介绍

XPath是一门在 XML文档中查找信息的语言,XPath可用来在 XML⽂档中对元素和属性进行遍历。而HTML是属于XML的⼀个子集,所以完全可以用xpath去查找html中的内容。

安装:

pip install lxml

2.用法

将要解析的html内容构造出etree对象,使用etree对象的xpath()方法配合xpath表达式来完成对数据的提取。

3.实例

用实例来说明xpath的简单使用

简单的HTML页面代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Title</title>
    </head>
    <body>
        <ul>
            <li><a href="http://www.baidu.com">百度</a></li>
            <li><a href="http://www.google.com">谷歌</a></li>
            <li><a href="http://www.sogou.com">搜狗</a></li>
        </ul>
        <ol>
            <li><a href="taobao">淘宝</a></li>
            <li><a href="jindong">京东</a></li>
        </ol>
        <div class="111">aaa</div>
        <div class="222">bbb</div>
    </body>
</html>

对该HTML进行解析的xpath代码:

from lxml import etree
tree = etree.parse("a.html")
result = tree.xpath('/html')
result = tree.xpath("/html/body/ul/li/a/text()")
result = tree.xpath("/html/body/ul/li[1]/a/text()")  # xpath的顺序是从1开始数的, []表示索引
result = tree.xpath("/html/body/ol/li/a[@href='taobao']/text()")  # [@xxx=xxx] 属性的筛选
print(result)
ol_li_list = tree.xpath("/html/body/ol/li")
for li in ol_li_list:
    # 从每一个li中提取到文字信息
    result = li.xpath("./a/text()")  # 在li中继续去寻找. 相对查找
    print(result)
    result2 = li.xpath("./a/@href")  # 拿到属性值: @属性
    print(result2)
print(tree.xpath("/html/body/ul/li/a/@href"))

解析输出结果:

 五、总结

本次学习让我理解了如何对爬出的一堆数据进行提取,从而获得我们想要的有价值的数据。因为爬取的数据中无用的信息太多了,而使用这几种解析方法就可以很容易的拿到理想结果,数据解析技术大大方便了爬虫结果的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值