本文主要是介绍躲在被窝里偷偷学爬虫(3)---bs4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
bs4使用
注:bs4是python里面独有的数据解析!
首先要安装两个第三方库bs4和lxml,在dos窗口分别输入pip install bs4和pip install lxml回车片刻即完成!
一, 基本使用讲解
小编在本地写好一个简短的html练习文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>bs4</title>
</head>
<body>
<div id="aa"><span>哈士奇1</span><span>哈士奇2</span><span>哈士奇3</span>
</div>
<div class="bb"><a href="https://www.baidu.com">百度</a><a href="https://www.sogou.com">搜狗</a><a href="https://www.bing.com">必应</a><a href="https://www.google.com">谷歌</a>
</div>
<div class="cc" id="ee"><p>萨摩耶</p><p>阿拉斯加</p><p>金毛</p><p>泰迪</p><div id="dd"><ul><h2>你不是真正的快乐</h2><li>人群中哭著, 你只想变成透明的颜色</li><li>你再也不会梦或痛或心动了</li><li>你已经决定了 ,你已经决定了</li><li>你静静忍著, 紧紧把昨天在拳心握著</li><li>而回忆越是甜就是越伤人了</li><li>越是在手心留下密密麻麻深深浅浅的刀割</li><li>你不是真正的快乐, 你的笑只是你穿的保护色</li></ul></div>
</div>
</body>
</html>
下面开始练习一些基本用法
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-24# 导入库
from bs4 import BeautifulSoup# 打开本地要解析的文件
file = open('./test.html', 'r', encoding='utf-8')
# 实例化一个BeautifulSoup对象
soup = BeautifulSoup(file, 'lxml')
获取标签👇
1,
# soup.span拿到页面中第一个span标签
print(soup.span)<span>哈士奇1</span>
2,
# 拿到第一个div标签
print(soup.div)<div id="aa">
<span>哈士奇1</span>
<span>哈士奇2</span>
<span>哈士奇3</span>
</div>
3,
# 和soup.div基本一样
print(soup.find('div'))<div id="aa">
<span>哈士奇1</span>
<span>哈士奇2</span>
<span>哈士奇3</span>
</div>
4,
# 拿到class值为bb的对应的div标签
print(soup.find('div', class_='bb'))<div class="bb">
<a href="https://www.baidu.com">百度</a>
<a href="https://www.sogou.com">搜狗</a>
<a href="https://www.bing.com">必应</a>
<a href="https://www.google.com">谷歌</a>
</div>
5,
# 拿到id值为dd的对应的div标签
print(soup.find('div', id='dd'))<div id="dd">
<ul>
<h2>你不是真正的快乐</h2>
<li>人群中哭著, 你只想变成透明的颜色</li>
<li>你再也不会梦或痛或心动了</li>
<li>你已经决定了 ,你已经决定了</li>
<li>你静静忍著, 紧紧把昨天在拳心握著</li>
<li>而回忆越是甜就是越伤人了</li>
<li>越是在手心留下密密麻麻深深浅浅的刀割</li>
<li>你不是真正的快乐, 你的笑只是你穿的保护色</li>
</ul>
</div>Process finished with exit code 0
6,
# 拿到所有li标签,是个列表
print(soup.find_all('li'))[<li>人群中哭著, 你只想变成透明的颜色</li>, <li>你再也不会梦或痛或心动了</li>, <li>你已经决定了 ,你已经决定了</li>, <li>你静静忍著, 紧紧把昨天在拳心握著</li>, <li>而回忆越是甜就是越伤人了</li>, <li>越是在手心留下密密麻麻深深浅浅的刀割</li>, <li>你不是真正的快乐, 你的笑只是你穿的保护色</li>]
7,
# #aa就是id='aa'的标签,.bb就是class='bb'的标签
print(soup.select('#aa'))[<div id="aa">
<span>哈士奇1</span>
<span>哈士奇2</span>
<span>哈士奇3</span>
</div>]
8,
# 拿到id='dd'标签下的ul下的第一个li标签,其中>表示一级级向下
print(soup.select('#dd > ul > li')[0])<li>人群中哭著, 你只想变成透明的颜色</li>
9,
# 拿到id='dd'标签下的第三个li标签,其中空格表示能跳过多级
print(soup.select('#dd li')[2])<li>你已经决定了 ,你已经决定了</li>
获取标签中内容👇
10,
# string表示提取出对应标签中的内容
print(soup.select('#dd li')[2].string)你已经决定了 ,你已经决定了
11,
# get_text()表示提取出对应标签中的内容
print(soup.select('#dd li')[1].get_text())你再也不会梦或痛或心动了
12,
# text表示提取出对应标签中的内容
print(soup.select('#dd li')[1].text)你再也不会梦或痛或心动了
那么这三种获取内容的方式有何不同之处?
text和get_text():可以获取某个标签中的所有文本内容
string只能获取某标签下直系的文本内容
获取标签中属性值👇
13,
# href表示提取出对应标签中的属性值
print(soup.select('.bb > a')[1]['href'])https://www.sogou.com
二, bs4牛刀小试
今天准备安排笔趣阁《萌娘西游记》中的所有章节名及其里面对应的内容!(url:https://www.biquge.info/17_17840/)
复制对应页面的url
打开开发者工具,简单分析一下页面
也就是说,只要解析出所有dd标签下a标签中的文本内容和属性,就能拿到所有的章节名及对应章节里具体内容的url地址,再遍历访问所有具体内容的url地址,即可拿到所有小说内容!
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-24import requests
from bs4 import BeautifulSoup# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
chapter = requests.get(url=url, headers=headers).text
# 实例化一个BeautifulSoup对象,并将源码加载到该对象中
soup = BeautifulSoup(chapter, 'lxml')
# 解析数据 拿到所有的a标签
a_list = soup.select('#list > dl > dd > a')
print(a_list)
跑一下,发现部分乱码了
指定utf-8编码格式
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-24import requests
from bs4 import BeautifulSoup# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
chapter = requests.get(url=url, headers=headers)
chapter.encoding = 'utf-8'
chapter = chapter.text
# 实例化一个BeautifulSoup对象,并将源码加载到该对象中
soup = BeautifulSoup(chapter, 'lxml')
# 解析数据 拿到所有的a标签
a_list = soup.select('#list > dl > dd > a')
print(a_list)
乱码解决
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-24import requests
from bs4 import BeautifulSoup# 要爬取页面的url地址
url = 'http://www.xbiquge.la/3/3687/'
# 添加表头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
chapter = requests.get(url=url, headers=headers)
chapter.encoding = 'utf-8'
chapter = chapter.text
# 实例化一个BeautifulSoup对象,并将源码加载到该对象中
soup = BeautifulSoup(chapter, 'lxml')
# 解析数据 拿到所有的a标签
a_list = soup.select('#list > dl > dd > a')
print(a_list)
# 遍历所有a标签
for a in a_list:# 获取所有的章节名title = a.text# 获取所有的章节对应的url,仔细发现拿到的url并不完整,所以需要拼接一下chapter_url = 'http://www.xbiquge.la' + a['href']print(title, chapter_url)
成功拿取所有章节名及其对应内容的url地址
打开任意一个标题对应的详情页,打开开发者工具,简单分析下页面
拿到这个div标签中的所有文本内容,并持久化存储到本地
from bs4 import BeautifulSoup
import requests
import os# 判断假如没有'萌娘西游记'的文件夹,就创建一个
if not os.path.exists('萌娘西游记'):os.mkdir('萌娘西游记')
url = "https://www.biquge.info/17_17840/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54"
}
# 以get方式访问并返回字符串形式的响应数据
chapter = requests.get(url=url, headers=headers)
chapter.encoding = "utf-8"
chapter = chapter.text
# 实例化BeautifulSoup对象,将页面的源代码加载到该对象中
soup = BeautifulSoup(chapter, "lxml")
# 解析数据 拿到所有的a标签
a_list = soup.select("#list>dl>dd>a")
# print(a_list)
# 遍历所有a标签
for a in a_list:# 获取标题title = a.string# 拼接详情页urlchapter_url = "https://www.biquge.info/17_17840/" + a["href"]# print(title, chapter_url)# 对详情也发起请求chapter_content = requests.get(url=chapter_url, headers=headers)chapter_content.encoding = "utf-8"chapter_content = chapter_content.text# 实例化BeautifulSoup对象page_soup = BeautifulSoup(chapter_content, "lxml")# 解析出详情页内容content = page_soup.find("div", id="content").text# print(content)# 持久化存储with open('萌娘西游记/%s.txt' % chapter_url, 'a+', encoding='utf-8') as f:f.write(content)print(chapter_url, '\033[31;1m爬取完成!!!\033[0m')
运行后,就会爬下所有内容,只是单线程串行比较慢一些,后期涉及到多线程或协程就快多了!
bs4就此告一段落,下一篇开始xpath解析!
这篇关于躲在被窝里偷偷学爬虫(3)---bs4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!