躲在被窝里偷偷学爬虫(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

相关文章

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93aC5mYW5nLmtlLmNvbS9sb3VwYW4v 目标:采集对应城市的

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框架爬取。 我对此图的理解就是: 从spiders中获得一个请求(REQUEST),通过引擎传递给调度器,之后再返回给引擎,引擎把url封装好后传递给下载器,下载器将资源下载好后

简单的php爬虫程序

<?php /** * 爬虫程序 -- 原型 * * BookMoth 2009-02-21 */ /** * 从给定的url获取html内容 * * @param string $url * @return string */ function _getUrlContent($url){ $handle = fopen($url, "r"); if($handle){ $content =

Python爬虫基础-两个实用库

用Python学爬虫最大的好处就是python有很多实用库,免去了我们自己造轮子的环节,那么找哪些轮子呢?Python爬虫有两个比较实用的库,Requests和Beautiful Soup。我认为学好这两个库,Python爬虫也就学的差不多了。 是什么? Requests is the only Non-GMO HTTP library for Python, safe for human

当我们写爬虫的时候,我们实际在做什么?

当我开始学习爬虫的时候,我在网上也开始找相关教程,大多数都是xx分钟学会爬虫一类的文章。并不是否定这些文章的价值,因为他们的确“教会”我如何爬取网页。但我不想停留只会使用工具这一层面上,这就是我想谈谈自己对爬虫的理解。 思考一下我们是怎么样上网的呢? 打开浏览器,习惯性输入百度看看网络连接有没有问题或者输入谷歌看看能不能科学上网。然后我现在的习惯是打开简书首页,看看有没有新的技术类文章或者是鸡汤

技术性屏蔽百度爬虫已经一周了!

很久前明月就发现百度爬虫只抓取、只收录就是不给流量了,加上百度搜索体验越来越差,反正明月已经很久没有用过百度搜索,目前使用的浏览器几乎默认搜索都已经修改成其他搜索引擎了,真要搜索什么,一般都是必应+谷歌结合着使用。所以就一直在纠结要不好屏蔽百度爬虫,上周借助 CloudFlare 的【随机加密】先技术性的屏蔽百度爬虫了。 说起来比较好笑都 2024 年了,早就号称支持 HTTPS 的百度爬虫

13.爬虫---PyMongo安装与使用

13.PyMongo安装与使用 1.安装 PyMongo2.使用PyMongo2.1连接数据库和集合2.2增加数据2.3修改数据2.4查询数据2.5删除数据 3.总结 MongoDB 安装可以看这篇文章MongoDB安装配置教程(详细版) 1.安装 PyMongo PyMongo 是Python中用于连接MongoDB数据库的库,安装起来非常简单。通常情况下,只需要在命

Python中的爬虫实战:豆瓣图书爬虫

Python是当今最热门的编程语言之一,在不同的领域都得到了广泛的应用,如数据科学、人工智能、网络安全等。其中,python在网络爬虫领域表现出色,许多企业和个人利用python进行数据采集和分析。本篇文章将介绍如何使用python爬取豆瓣图书信息,帮助读者初步了解python网络爬虫的实现方法和技术。 首先,对于豆瓣图书信息爬虫,我们需要用到Python中的两个重要的库:urllib和beau

python爬虫学习笔记一(基本概念urllib基础)

学习资料:尚硅谷_爬虫 学习环境:  pycharm 一.爬虫基本概念 爬虫定义 > 解释1:通过程序,根据URL进行爬取网页,获取有用信息 > 解释2:使用程序模拟浏览器,向服务器发送请求,获取相应信息 爬虫核心 > 1.爬取整个网页 > 2.解析数据,获取关心的数据 > 3.难点:爬虫VS非爬虫 爬虫设计思路 > 1.确定爬取的url  > 2.模拟浏览器通过http协议访问url