前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫系列:连接网站与解析 HTML

爬虫系列:连接网站与解析 HTML

原创
作者头像
太后
修改2021-10-12 18:01:50
2.3K0
修改2021-10-12 18:01:50
举报
文章被收录于专栏:短信接收服务短信接收服务

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

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

代码语言:txt
复制
pip install beautifulsoup4
代码语言:txt
复制
pip install requests

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

代码语言:txt
复制
from urllib.error import HTTPError, URLError
代码语言:txt
复制
import requests
代码语言:txt
复制
from bs4 import BeautifulSoup
代码语言:txt
复制
from config import logger_config
代码语言:txt
复制
class ProcessConnection:
代码语言:txt
复制
    def __init__(self):
代码语言:txt
复制
        logger_name = ‘web_scraping'
代码语言:txt
复制
        self._logger_write_file = logger_config.LoggingConfig().init_logging(logger_name)
代码语言:txt
复制
    def init_connection(self, uri):
代码语言:txt
复制
        # 连接网站
代码语言:txt
复制
        try:
代码语言:txt
复制
            session = requests.session()
代码语言:txt
复制
            headers = {
代码语言:txt
复制
                "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",
代码语言:txt
复制
                "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"}
代码语言:txt
复制
            html = session.get(uri, headers=headers)
代码语言:txt
复制
        except (HTTPError, URLError) as e:
代码语言:txt
复制
            self._logger_write_file.error('执行 get_sms_data 函数出错,具体错误内容:{message}'.format(message=e))
代码语言:txt
复制
            return False
代码语言:txt
复制
        try:
代码语言:txt
复制
            bsObj = BeautifulSoup(html.text, features='html.parser')
代码语言:txt
复制
            return bsObj
代码语言:txt
复制
        except AttributeError as e:
代码语言:txt
复制
            self._logger_write_file.error('执行 get_sms_data 函数出错,具体错误内容:{message}'.format(message=e))
代码语言:txt
复制
            return False

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

代码语言:txt
复制
session = requests.session()
代码语言:txt
复制
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",
代码语言:txt
复制
     "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"}

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

代码语言:txt
复制
except (HTTPError, URLError) as e:

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

代码语言:txt
复制
except AttributeError as e:

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

解析 HTML

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

代码语言:txt
复制
bsObj.findAll("table")[4].findAll("tr")[2].find("td").findAll("section")[1].find("a")

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

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

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

我们使用 BeautifulSoup 经行解析:

代码语言:txt
复制
result = bsObj.findAll("div", {"class": "right-result"})
代码语言:txt
复制
for child in result:
代码语言:txt
复制
    get_ip = child.get_text()
代码语言:txt
复制
    print(get_ip)

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解析 HTML
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档