躲在被窝里偷偷学爬虫(3)---bs4

2024-03-24 04:40
文章标签 爬虫 偷偷 bs4 被窝

本文主要是介绍躲在被窝里偷偷学爬虫(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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840480

相关文章

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

Python 爬虫入门 - 基础数据采集

Python网络爬虫是一种强大且灵活的工具,用于从互联网上自动化地获取和处理数据。无论你是数据科学家、市场分析师,还是一个想要深入了解互联网数据的开发者,掌握网络爬虫技术都将为你打开一扇通向丰富数据资源的大门。 在本教程中,我们将从基本概念入手,逐步深入了解如何构建和优化网络爬虫,涵盖从发送请求、解析网页结构到保存数据的全过程,并讨论如何应对常见的反爬虫机制。通过本教程,你将能够构建有效的网络爬

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码,打包独立部署或运营。 2. 环境准备 1)通义千问 :https://tongyi.aliyun.com/qianwen 2)0基础学习爬虫系列–网页内容爬取:https://blog.csdn.net/qq_36918149/article/details/141998185?spm=1001.2014.3001.5502 3. 步骤 1)不知道