社团课Day2-数据解析:Xpath、BeautifulSoup、re正则表达
发布日期:2021-06-29 11:32:18
浏览次数:2
分类:技术文章
本文共 6481 字,大约阅读时间需要 21 分钟。
数据解析-Xpath、BeautifulSoup4、re正则表达式
一、Xpath数据解析
- XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
- 最初是用来搜寻XML文档的,但同样适用于HTML文档的搜索。所以在做爬虫时完全可以使用 XPath做相应的信息抽取
1.Xpath概览
- XPath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过100个内建函数,用于字符串串、数值、时间的匹配以及节点、序列列的处理等,几乎所有想要定位的节点都可以用XPath 来选择。
- 官方文档:
https://www.w3.org/TR/xpath/
2.XPath常用规则
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选区直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
这里列出了XPath的常用匹配规则,示例如下:
- //title[@lang=‘eng’]
这是一个XPath规则,代表的是选择所有名称为title,同时属性lang的值为eng的节点。
3.安装Xpath
windows->python3环境下:pip install lxml
linux环境下:pip3 install lxml
- 可以在
https://www.w3school.com.cn/xpath/index.asp
进行学习
二、BeautifulSoup数据解析
- BeautifulSoup4(简称bs4)翻译成中文就是“美丽的汤”这个奇特的名字来源于《爱丽丝梦游仙境》(这也是为何在其官网会配上奇怪的插图,以及用《爱丽丝》的片段作为测试文本)。
官方文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
bs4安装
pip install Beautifulsoup4
bs4使用
安装后需要在bs4中导入使用
rom bs4 import BeautifulSoup
使用tip:在使用时需要指定一个“解析器”:
html.parse-python自带,但容错性不够高,对于一些写得不太规范的网页会丢失部分内容 lxml-解析速度快,需额外安装 (推荐使用) xml-同属 lxml 库,支持 XML 文档 html5lib-最好的容错性,但速度稍慢bs4的三种使用方式
# 1. 通过tag标签对象获取文档数据# r = soup.title# r = soup.title['abc']# r = soup.p# r = soup.p['class']# r = soup.title.text# r = soup.p.parent.name# print(r)# 2. 通过搜索获取页面中的元素 find,find_all# r = soup.find('a')# r = soup.find_all('a')# r = soup.find('title')# # print(r,type(r))# print(r.text)# print(r.get_text())# print(r)# 3.css选择器# 通过标签 选择元素r = soup.select('title')# 通过class类名获取元素r = soup.select('.title')# 通过ID名获取元素r = soup.select('#link2')# 通过空格 层级关系获取元素r = soup.select('html body p')# 通过逗号,并列关系获取元素r = soup.select('a,title')# print(r)
三、正则表达式数据解析
正则表达式,就是使用字符,转义字符和特殊字符组成一个规则,
使用这个规则对文本的内容完成一个搜索或匹配或替换的功能、
正则表达式的组成
普通字符: 大小写字母,数字,符合。。。转义字符:\w \W \d \D \s \S ...特殊字符:. * ? + ^ $ [] {} ()匹配模式:I U。。。
示例:
# 使用正则表达式进行匹配的 基本语法import re# 定义字符串vars = 'iloveyou521tosimida'# 定义正则表达式reg = 'love'# 调用正则函数方法res = re.findall(reg,vars)print(res)
正则模式
# 正则模式 re.I 不区分大小写vars = 'iLOVEyou'reg = '[a-z]{5,10}'res = re.search(reg,vars,re.I)print(res)
抓取方式 | 性能 | 使用难度 |
---|---|---|
lxml | 快 | 简单 |
BeautifulSoup | 慢 | 简单 |
正则表达式 | 快 | 困难 |
实操
1.爬取一个网页
这里用了学校的官网
- F12 -Header-Request Header-Referer: https://(学校官网链接)/xyszl.htm
- referer是header的一部分,浏览器向web服务器发送请求时一般会带上Referer,用来表示从哪链接到当前的网页,服务器因此可以获得一些信息用于处理,采用的格式是URL
import requestsres=requests.get("https://www.szpt.edu.cn/xyszl.htm")res.encoding=res.apparent_encodingprint(res.text)import rere.findall('(.*?)',res.text)
2.豆瓣电影排行榜
- 网址:
https://movie.douban.com/top250?start=0&filter=
- 观察网址发现start=后面的数值每下一页+25
- F12-Elements发现电影信息在
<ol class="grid_view">
里的<li>...</li>
里有电影的排名、电影名、上映年份、国家等信息
import re#re.findall('(.*?)',res.text)from bs4 import BeautifulSoupimport requestsheaders={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKib/537.36 (KHTML, like Gecko)"}res=""names=[]years=[]countrys=[]types=[]rates=[]peoples=[]for i in range(10): res=requests.get("https://movie.douban.com/top250?start="+str(i*25)+"&filter",\ headers=headers).text soup=BeautifulSoup(res,"lxml") items=soup.find_all("div",class_="info") for item in items: names.append(item.span.string) #names.append(item.find("span",class_="title").string) #years.append(re.findall(".*?(\d+).*?",item.p.contents[2])) years.append(item.p.contents[2].split("\xa0")[0].strip()) countrys.append(item.p.contents[2].split("\xa0")[2].strip()) types.append(item.p.contents[2].split("\xa0")[4].strip()) rates.append(item.find("span",class_="rating_num").string) peoples.append(item.find("div",class_="star").find_all("span")[3].string[:-3])f=open("movies.csv","w+")f.write("电影名称,上映年份,国家,影片类型,豆瓣评分,评价人数\n")for i in range(len(names)): f.write("{},{},{},{},{},{}\n".format(names[i],years[i],countrys[i],types[i],rates[i],peoples[i]))f.close()
3.网易云音乐下载
- 这是一个可以下载专辑的爬虫
- 播放地址
http://music.163.com/playlist?id=2741819459
import requestsfrom bs4 import BeautifulSoupimport urllib.requestheaders = { 'Referer':'http://music.163.com/', 'Host':'music.163.com', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',}#url地址play_url = 'http://music.163.com/playlist?id=2741819459'#用requests.get()获取页面内容s = requests.session()response=s.get(play_url,headers=headers).content#用beatifulSoup4匹配出对应的歌曲名称和地址s = BeautifulSoup(response,'lxml')main = s.find('ul',{ 'class':'f-hide'})lists=[]for music in main.find_all('a'): list=[] #print('{}:{}'.format(music.text,music['href'])) musicUrl='https://music.163.com/song/media/outer/url'+music['href'][5:]+'.mp3' musicName=music.text #单首歌曲的名字和地址放在list列表中 list.append(musicName) list.append(musicUrl) #全部歌曲信息放在lists列表中 lists.append(list) print(lists)#下载列表中全部歌曲,并以歌曲名命名下载后的文件,文件位置为当前文件夹for i in lists: url=i[1] name=i[0] try: print('下载中',name) urllib.request.urlretrieve(url,'./%s.mp3'% name) print('下载成功') except: print('下载失败')
4.贴吧获取图片
- 这个爬虫可以获取一个帖子内的所有图片,并下载到一个名为imgtieba的文件夹中
# _*_ coding:utf-8 _*_# 安装两个包# pip install beautifulsoup4# pip install urllib3import osimport urllibimport urllib.requestfrom bs4 import BeautifulSoupimport re# 获取内容def get_content(url): html = urllib.request.urlopen(url) content = html.read().decode("utf-8", "ignore") html.close() return content# 获取帖子的页数def get_page_num(url): content = get_content(url) # < a href = "/p/2314539885?pn=31" >尾页 < / a > pattern = r'尾页' return int(re.findall(pattern, content)[0])# 保存图片def get_images(info, photo_path, npage, photo_format): if not os.path.exists(photo_path): os.makedirs(photo_path) soup = BeautifulSoup(info) # 找到所有 img 标签 然后后面跟的class = BDE_Image all_img = soup.find_all("img", class_="BDE_Image") # 设置计数器 x = 0 for img in all_img: image_name = photo_path + str(npage) + "_" + str(x) + photo_format urllib.request.urlretrieve(img["src"], image_name) x += 1 print("find photo page %d NO. %d" % (npage, x)) return len(all_img)# 主函数 可改动的参数# URL——贴吧路径# photo-path——图片保存的路径# 图片格式——'.jpg' '.png' '.gif'if __name__ == "__main__": url = "https://tieba.baidu.com/p/5997922755" photo_path = "./imgtieba/" page_num = get_page_num(url) for i in range(page_num): page_url = url + "?pn=" + str(i + 1) info = get_content(url) print(get_images(info, photo_path, i + 1, ".gif"))
转载地址:https://blog.csdn.net/ZYJ_OvO/article/details/106910139 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月27日 01时52分57秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 循环输出菱形字符串
2019-04-29
MySQL常见错误总结
2019-04-29
pymysql 的基础应用
2019-04-29
Html+Css实现 启橙装饰网 项目
2019-04-29
JavaScript 实现哥德巴赫猜想
2019-04-29
JavaScript DOM
2019-04-29
Python 管理程序改进——连接MYSQL
2019-04-29
Python 爬虫
2019-04-29
Python 爬虫-百度风云榜的电影top50
2019-04-29
Python 爬虫-豆瓣影星图片下载
2019-04-29
Excel数据基础操作
2019-04-29
网页端数据库操作界面—主题函数文件
2019-04-29
网页端数据库操作界面-Html页面(1)
2019-04-29
网页端数据库操作界面-Html页面(2)
2019-04-29
网页端数据库操作界面-Html页面(3)
2019-04-29
Excel 高级筛选
2019-04-29
Python爬虫 百度热搜热点
2019-04-29
Python 百度热搜 全页面爬取
2019-04-29
爬取小说——爬取书的地址
2019-04-29
爬取小说——爬取章节地址
2019-04-29