这篇文章是爬虫系列第三期,讲解使用 Python 连接到网站,并使用 BeautifulSoup 解析 HTML 页面。

在 Python 中我们使用 requests 库来访问目标网站,使用 BeautifulSoup 对获取的内容进行解析。由于这两个库并不是 Python 标准库,因此需要单独安装这两个库:

pip install beautifulsoup4

pip install requests

下面是获取网站内容的示例代码:

from urllib.error import HTTPError, URLError
import requests
from bs4 import BeautifulSoup from config import logger_config class ProcessConnection:
def __init__(self):
logger_name = ‘web_scraping'
self._logger_write_file = logger_config.LoggingConfig().init_logging(logger_name) def init_connection(self, uri):
# 连接网站
try:
session = requests.session()
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}
html = session.get(uri, headers=headers)
except (HTTPError, URLError) as e:
self._logger_write_file.error('执行 get_sms_data 函数出错,具体错误内容:{message}'.format(message=e))
return False
try:
bsObj = BeautifulSoup(html.text, features='html.parser')
return bsObj
except AttributeError as e:
self._logger_write_file.error('执行 get_sms_data 函数出错,具体错误内容:{message}'.format(message=e))
return False

首先使用了 requests 会话对象发送请求,并且设置了 User-agent,这里 User-agent 可以自定,这就为伪造 User-agent 提供了便利,同时也告诉了服务器客户端接受那些内容类型:

session = requests.session()
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}

网络如果连接出现了错误,对错误进行异常处理:

except (HTTPError, URLError) as e:

BeautifulSoup 解析 HTML 文档出现错误,抛出 AttributeError:

except AttributeError as e:

以上就完成了一个使用 Python 连接网站的过程。这个时候如果没有异常我们就会拿到网站的 HTML 代码,之后根据需要进一步对 HTML 进行内容解析,获取自己需要的内容。

解析 HTML

如果你已经确定了目标内容,可能是采集一个名字,一组统计数据,或者一段文字。你的目标内容可能隐藏在一个 HTML “烂泥堆”的第20层标签里,带有许多没用的标签或 HTML 属性,你按照目标网站的代码层级你有可能写出如下的一行代码抽取内容:

bsObj.findAll("table")[4].findAll("tr")[2].find("td").findAll("section")[1].find("a")

虽然以上写法可以达到目标,但是这样的写法看起来并不是很好。除了代码欠缺美感之外,还有一个问题就是:当网站管理员对网站稍作修改之后,这行代码便会失效。

例如,我们需要获得自己的公网 IP 地址,我们可以通过查询这个网站获得:https://www.pdflibr.com,之后查看网页源代码,找到自己的 IP 地址,又如下源代码:

<div class="ip-wrap ip-item right-item">
<div class="item-text-title">IP信息</div>
<div class="user-agent-content">
<div class="layout layout-flex-direction item-result">
<div class="left-name">当前IP地址:</div>
<div class="right-result">106.125.148.85</div>
</div>
<div class="layout layout-flex-direction item-result">
<div class="left-name">归属地:</div>
<div class="right-result">中国 广东 广州</div>
</div>
</div>
</div>

我们使用 BeautifulSoup 经行解析:

result = bsObj.findAll("div", {"class": "right-result"})
for child in result:
get_ip = child.get_text()
print(get_ip)

这样就可以获取自己的 IP 以及 IP 归属地。

爬虫系列:连接网站与解析 HTML的更多相关文章

  1. 爬虫系列二(数据清洗--->bs4解析数据)

    一 BeautifulSoup解析 1 环境安装 - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %ap ...

  2. 爬虫系列二(数据清洗--->xpath解析数据)

    一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...

  3. 爬虫系列2:Requests+Xpath 爬取租房网站信息

    Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...

  4. 爬虫系列3:Requests+Xpath 爬取租房网站信息并保存本地

    数据保存本地 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 爬虫系列2:https://www ...

  5. Java爬虫系列三:使用Jsoup解析HTML

    在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...

  6. Python爬虫系列(七):提高解析效率

    如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文 ...

  7. python 全栈开发,Day134(爬虫系列之第1章-requests模块)

    一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...

  8. Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)

    在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...

  9. 爬虫系列:存储 CSV 文件

    上一期:爬虫系列:存储媒体文件,讲解了如果通过爬虫下载媒体文件,以及下载媒体文件相关代码讲解. 本期将讲解如果将数据保存到 CSV 文件. 逗号分隔值(Comma-Separated Values,C ...

随机推荐

  1. Vue3学习(十)之 页面、菜单、路由的使用

    一.前言 好几天没更文了,周末真的太冷了,在家躺了一天不爱动.今天给暖气了,相对不那么冷了,就可以继续更文了. 由文章标题不难看出,就是实现点击菜单跳转的意思,我写的很直白了,哈哈. 二.实现点击菜单 ...

  2. 用STM32定时器中断产生PWM控制步进电机

    控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...

  3. ReplacingMergeTree:实现Clickhouse数据更新

    摘要:Clickhouse作为一个OLAP数据库,它对事务的支持非常有限.本文主要介绍通过ReplacingMergeTree来实现Clickhouse数据的更新.删除. 本文分享自华为云社区< ...

  4. 数据代理Object.defineProperty()

    数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写) 数据代理 Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个 ...

  5. 大爽Python入门教程 1-4 习题

    大爽Python入门公开课教案 点击查看教程总目录 1 [思考]方向变换 小明同学站在平原上,面朝北方,向左转51次之后(每次只转90度), 小明面朝哪里?小明转过了多少圈? (360度为一圈,圈数向 ...

  6. [luogu5180]支配树

    对于有向图$G$和起点$s$,有以下定义和性质-- 为了方便,不妨假设$s$能到达$G$中所有点,并任意建立一棵以$s$为根的dfs树,以下节点比较默认均按照两点在这棵dfs树上的dfs序 支配点:$ ...

  7. java配置方法

    1.新建一个Config文件夹 2.代码 package com.shao.config; import com.shao.pojo.User; import org.springframework. ...

  8. ROS机器人开发实践1->SSH远程登录要点记录

    1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...

  9. Codeforces 1175G - Yet Another Partiton Problem(李超线段树)

    Codeforces 题面传送门 & 洛谷题面传送门 这是一道李超线段树的毒瘤题. 首先我们可以想到一个非常 trivial 的 DP:\(dp_{i,j}\)​ 表示前 \(i\)​ 个数划 ...

  10. P4569 [BJWC2011]禁忌

    题目传送门. 题意简述:给出大小为 \(n\) 的字典 \(s\).设函数 \(g(t)\) 表示 \(t\) 最多能被分割成的单词个数.等概率随机生成长度为 \(len\) 的字符串 \(T\),求 ...