爬虫系列:连接网站与解析 HTML
这篇文章是爬虫系列第三期,讲解使用 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的更多相关文章
- 爬虫系列二(数据清洗--->bs4解析数据)
一 BeautifulSoup解析 1 环境安装 - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %ap ...
- 爬虫系列二(数据清洗--->xpath解析数据)
一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...
- 爬虫系列2:Requests+Xpath 爬取租房网站信息
Requests+Xpath 爬取租房网站信息 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 ...
- 爬虫系列3:Requests+Xpath 爬取租房网站信息并保存本地
数据保存本地 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参考前文 爬虫系列2:https://www ...
- Java爬虫系列三:使用Jsoup解析HTML
在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...
- Python爬虫系列(七):提高解析效率
如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文 ...
- python 全栈开发,Day134(爬虫系列之第1章-requests模块)
一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...
- Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)
在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...
- 爬虫系列:存储 CSV 文件
上一期:爬虫系列:存储媒体文件,讲解了如果通过爬虫下载媒体文件,以及下载媒体文件相关代码讲解. 本期将讲解如果将数据保存到 CSV 文件. 逗号分隔值(Comma-Separated Values,C ...
随机推荐
- Openeuler安装完整man手册
Openeuler安装完整man手册 在 Debian 和 Ubuntu 中安装了Shell 前端软件包管理器apt(Advanced Packaging Tool),可以通过如下方式安装. ...
- 解决mac主机无法与 Docker容器互通问题
方法很多,这里我说一下使用 docker-connector解决这个问题 这是一个github开源项目docker-connector 1. Mac 通过 brew 安装 docker-connec ...
- yum设置取消代理
unset http_proxy unset https_proxy 暂时取消代理,若永久取消代理,需要修改/etc/yum.conf 去掉 proxy=http://proxyhost:8080
- 【JAVA】笔记(1)---JVM内存图;方法重载条件;输入方法;转义字符;强制类型转换;变量分类及区别;Java命名规范;
Java命名规范: 1.包:全部字母小写: 2.类+接口:所有单词的首字母大写: 3.变量+方法:第一个单词的首字母小写,其余单词首字母大写: 3.常量名:所有字母均大写,且用下划线" _ ...
- Django笔记&教程 总目录
本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...
- Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)
Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...
- Spark SQL知识点大全与实战
Spark SQL概述 1.什么是Spark SQL Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块. 与基本的Spark RDD API不同,Sp ...
- [cf1458C]Latin Square
维护$n^{2}$个三元组$(x,y,z)$,每一个三元组描述$a_{x,y}=z$ 对于RLDU这四个操作,即将所有三元组的$x$或$y$执行$\pm 1$(模$n$意义下) 对于IC这两个操作,即 ...
- [nowcoder5667K]Keyboard Free
不妨设$r1\le r2\le r3$,令$f(\alpha)=E(S_{\Delta}ABC)$,其中AB坐标分别为$(r_{1},0)$和$(r_{2}\cos \alpha,r_{2}\sin ...
- Ubuntu 软件安装
apt 使用apt安装,需要sudo 一些命令: sudo apt-get install git deb deb软件安装方法: sudo dpkg -I xxxx.deb 我们在Windows下安装 ...