2021SC@SDUSC
目录
一、摘要
本篇博客是项目代码分析的第二篇,由于整个项目都是基于python的爬虫项目,所以我需要先学习python爬虫的相关技术,掌握这方面的知识,然后再分析项目代码。
本篇主要介绍的是我学习与爬虫相关的数据解析技术(正则表达式解析、bs4解析、xpath解析),因为爬虫一般抓取的都是网页的内容,在复杂繁多的网页内容里如何找到需要的内容,这就需要用到数据提取解析技术。
二、正则表达式解析
1.介绍
Regular Expression,正则表达式,⼀种使用表达式的⽅式对字符串进行匹配的语法规则,爬虫抓取的网页内容本质上就是一个超长的字符串,正则表达式可以很容易的从中提取数据。它的优点是速度快,效率高,准确性高。
2.正则表达式元字符
元字符:具有固定含义的特殊符号 常⽤元字符:
- . 匹配除换⾏符以外的任意字符
- \w 匹配字⺟或数字或下划线
- \s 匹配任意的空⽩符
- \d 匹配数字
- \n 匹配⼀个换⾏符
- \t 匹配⼀个制表符
- ^ 匹配字符串的开始
- $ 匹配字符串的结尾
- \W 匹配⾮字⺟或数字或下划线
- \D 匹配⾮数字
- \S 匹配⾮空⽩符
- a|b 匹配字符a或字符b
- () 匹配括号内的表达式,也表示⼀个组
- [...] 匹配字符组中的字符
- [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
- * 重复零次或更多次
- + 重复⼀次或更多次
- ? 重复零次或⼀次
- {n} 重复n次
- {n,} 重复n次或更多次
- {n,m} 重复n到m次
贪婪匹配(尽可能多的匹配)与惰性匹配(尽可能少的匹配)。
- .* 贪婪匹配
- .*? 惰性匹配
3.re模块
在python中用re模块来使用正则表达式
- findall 查找所有,返回list
- search 会进⾏匹配,但是如果匹配到了第⼀个结果,就会返回这个结果,如果匹配不上search返回的则是None
- match 只能从字符串的开头进行匹配
- finditer,和findall差不多,只不过这时返回的是迭代器
- 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>.*?) .*?<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中的内容主要用两个方法实现:
- find(标签, 属性=值) (在页面中查找xxx标签,并且标签的xxx属性必须是xxx值)
- 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"))
解析输出结果:
五、总结
本次学习让我理解了如何对爬出的一堆数据进行提取,从而获得我们想要的有价值的数据。因为爬取的数据中无用的信息太多了,而使用这几种解析方法就可以很容易的拿到理想结果,数据解析技术大大方便了爬虫结果的处理。