【Python网络爬虫与信息提取】Request+BeautifulSoup

2023-11-12

1 Request库

import requests
r = requests.get("https://www.baidu.com/")
print(r.status_code)
print(type(r))
print(r.headers)
print(r.encoding)
print(r.apparent_encoding)
print(r.text)
print(r.content)
r.encoding = "utf-8"
print(r.text)

1.1 练习1

尽管Requests库功能很友好、开发简单(其实除了import外只需一行主要代码),但其性能与专业爬虫相比还是有一定差距的。请编写一个小程序,“任意”找个url,测试一下成功爬取100次网页的时间。(某些网站对于连续爬取页面将采取屏蔽IP的策略,所以,要避开这类网站)。

import requests
import time

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    url = "http://www.baidu.com/"
    # print(getHTMLText(url))
    begin = time.perf_counter()  # 开始计时
    for i in range(100):
        text = (getHTMLText(url))
        # print(text)
    stop = time.perf_counter()  # 停止计时
    runtime = stop - begin
    print("爬取100次网页" + url + "共耗时:" + str(runtime)[0:4] + "s")
  • 仅仅是requests库的入门知识,距离真实数据爬取还有好远;
  • 考虑与计算机网络、网络安全中数据抓包等相关知识的关系;
  • 与其他数据采集方法之间的关系.

1.2 练习2

京东商品页面的爬取(京东有对request对象hearder信息的识别):

import requests
# Full code
url = "https://item.jd.com/100039135656.html"
kv = {'user-agent': 'Mozilla/5.0'}
try:
    r = requests.get(url, headers=kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print("爬取失败")

练习2实验结果

1.3 练习3

网络图片的爬取和存储:

import requests
# # Simple Code:打开path,作为文件标识符f;请求图片,返回对象r,然后把r.content写入文件标识符f;关闭文件标识符;
# path = "D://abc.jpg"
# url = "https://img.bugela.com/uploads/2021/04/26/TX9474_01.jpg"
# r = requests.get(url)
# print(r.status_code)
# with open(path, 'wb') as f:
#     f.write(r.content)
#     f.close()

# Full code
import os
url = "https://img.bugela.com/uploads/2021/04/26/TX9474_01.jpg"
root = "D://pics//"
path = root + url.split('/')[-1]  # 自动读取最后一个反斜杠后面的内容,完成文件命名
try:
    if not os.path.exists(root):  # 根目录是否存在
        os.mkdir(root)
    if not os.path.exists(path):  # 文件是否存在
        r = requests.get(url)
        print(r.status_code)
        with open(path, 'wb') as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

控制台输出
文件下载及命名

1.4 练习4

IP地址归属地的自动查询:http://m.ip138.com/ip.asp?ip=ipaddress

import requests
kv = {'user-agent': 'Mozilla/5.0'}
url = "https://m.ip138.com/ip.asp?ip="
# url = "https://user.ip138.com/ip/"
r = requests.get(url+'202.204.80.112', headers=kv)
print(r.status_code)
print(r.text[-500:])

控制台输出

2 网络爬虫之提取

2.1 Beautiful Soup库的安装

2.1.1 代码实现

import requests
from bs4 import BeautifulSoup
url = "https://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
print(r.status_code)
print(demo)
print('--------------------------------------------------')
soup = BeautifulSoup(demo, 'html.parser') 
print(soup.prettify())

2.1.2 控制台输出

控制台输出

2.2 Beautiful Soup 库的基本元素

基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<></>表明开头和结尾
Name 标签的名字, < p > . . . < / p > <p>...</p> <p>...</p>的名字是‘p’,格式是.name
Attributes 标签的属性,字典形式组织,格式是.attrs
NavigableString 标签内非属性字符串, < > . . . < / > <>...</> <>...</>中字符串,格式是.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

2.2.1 代码实现

import requests
from bs4 import BeautifulSoup
url = "https://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
print(r.status_code)
# print(demo)  # 输出返回对象
print('--------------------------------------------------')
soup = BeautifulSoup(demo, 'html.parser')  # 解析返回对象
# print(soup.prettify())

# 查看BeautifulSoup类的基本元素(Tag, name, attrs, NavigableString, Comment)
# Name: .name
print(soup.title)
print(soup.a)
print(soup.a.name)
print(soup.a.parent.name)
print(soup.a.parent.parent.name)

# Attributes: .attrs
print(soup.a.attrs)  # {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
print(soup.a.attrs['class'])  # ['py1']
print(type(soup.a))  # bs4.element.Tag
print(type(soup.a.attrs))  # dict

# NavigableString: .string
print(soup.title.string)  # This is a python demo page
print(soup.a.string)  # Basic Python
print(soup.p.string)  # The demo python introduces several python courses
print(type(soup.p.string))

# Comment: .string
new_soup = BeautifulSoup("<b><!--This is a comment--></b><p>This is not a comment</p>", "html.parser")
print(new_soup.b.name)
print(new_soup.b.string)  # This is a comment
print(type(new_soup.b.string))  # <class 'bs4.element.Comment'>
print(new_soup.p.string)  # This is not a comment
print(type(new_soup.p.string))  # <class 'bs4.element.NavigableString'>

2.2.2 控制台输出

控制台输出

2.3 基于bs4库的HTML内容遍历方法

  • HTML其实是树形结构的文本信息:标签标明了信息结构的逻辑关系
  • 根据HTML基本格式,按照从根节点到叶子结点或从叶子节点到根节点或平行节点之间的遍历方式,分为下行遍历、上行遍历和平行遍历三种。

2.3.1 标签树的下行遍历

(1)基本原理

属性 说明
.contents 子节点列表,将 < t a g > <tag> <tag>所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

(2)代码实现

import requests
from bs4 import BeautifulSoup
url = "https://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
# print(demo)

# 利用美味汤解析所返回的html文件
soup = BeautifulSoup(demo, 'html.parser')

# 下行遍历:1).contents <tag>的儿子节点;2).children <tag>的儿子节点的迭代类型,用于循环遍历儿子节点;
# 3)descendants <tag>的所有子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
# BeautifulSoup 类是标签树的根节点
print(soup.head)  # <head><title>This is a python demo page</title></head>
print(soup.head.contents)  # [<title>This is a python demo page</title>]

print(soup.body.contents)
print(soup.body.contents[1])  # <p class="title"><b>The demo python introduces several python courses.</b></p>
print(len(soup.body.contents))  # 5

for child in soup.body.children:
    print(child)  # 遍历儿子节点
for child in soup.body.descendants:
    print(child)  # 遍历子孙节点

(3)控制台输出
下行遍历

2.3.2 标签数的上行遍历

(1)基本原理

属性 说明
.parents 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

(2)具体实现

# 上行遍历:1) .parent 节点的父亲标签;2).parents节点先辈标签的迭代标签,用于循环遍历先辈节点
print(soup.title)  # <title>This is a python demo page</title>
print(soup.title.parent)  # <head><title>This is a python demo page</title></head>

# print(soup.html)
# print("--------------------------")
# print(soup.html.parent)  # 不理解:按理来说没有父亲节点应该返回none啊

# print(soup)
# print(soup.parent)  # none
print('a:', soup.a)
print(soup.a.parents)  # <generator object PageElement.parents at 0x000002ADEE6509E0>
print(type(soup.a.parents))  # <class 'generator'>
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

(3)控制台输出
控制台输出

2.3.3 标签树的平行遍历

(1)基本原理

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

(2)代码实现

# 平行遍历:发生在同一个父节点的各个子节点间
print(soup.a.next_sibling)
print(soup.a.next_sibling.next_sibling)
print(soup.a.previous_sibling)
print(soup.a.previous_sibling.previous_sibling)

print(soup.a.parent)

for sibling in soup.a.next_sibling:
    print(sibling)

for sibling in soup.a.previous_sibling:
    print(sibling)

2.4 信息标记与提取方法

2.4.1 信息标记

  • XML: <> …</>
  • JSON: 有类型key:value
  • YAML: 无类型key:value

2.4.2 信息提取

import requests
from bs4 import BeautifulSoup
import re
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text

# BeautifulSoup:从HTML或XML文件中提取数据的python库,通过转换器实现文档导航、查找和修改文档的方式
# 查找标签:soup.find_all('tag')
# 查找文本:soup.find_all(text='text')
# 根据id查找:soup.find_all(id='tag id')
# 使用正则:soup.find_all(text=re.compile('you re')), soup.find_all(id=re.compile('your re'))
# 指定属性查找标签:soup.find_all('tag',{'id':'tag id', 'class':'tag class'})
soup = BeautifulSoup(demo, 'html.parser')
for link in soup.find_all('a'):   # 查找soup中的所有a标签
    print(link.get('href'))


print(soup.find_all('a'))
print(soup.find_all(['a', 'b']))

for tag in soup.find_all(True):
    print(tag.name)

for tag in soup.find_all(re.compile('b')):  # 不是很理解这个正则表达式这句
    print(tag.name)

print(soup.find_all('p', 'course'))
print(soup.find_all(id='link1'))
print(soup.find_all(id='link'))
print(soup.find_all(id=re.compile('link')))
print(soup.find_all('a', recursive=False))

print(soup.find_all(string='Basic Python'))
print(soup.find_all(string=re.compile('python')))

# 扩展方法
# <>.find() 搜索且只返回一个结果
# <>.find_parents() 在先辈节点中搜索返回列表类型,同.find_all()参数
# <>.find_parent() 在先辈节点中返回一个结果


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python网络爬虫与信息提取】Request+BeautifulSoup 的相关文章

  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp

随机推荐

  • 华为机试题80-整型数组合并

    描述 题目标题 将两个整型数组按照升序合并 并且过滤掉重复数组元素 输出时相邻两数之间没有空格 输入描述 输入说明 按下列顺序输入 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数值 输出
  • 静态储存,堆,栈的理解

    数据结构中的堆与栈 栈 可以理解为为一个瓶子 他遵循着先进后出的原则 堆 是一种经过排序的树状结构 每一个节点都有一个值 我们通常说的堆是二叉堆 堆的特点是跟节点最大或者最小 且子节点也是一个堆 所以我们在使用的堆的时候 都是随便取一个节点
  • java ssh连接远程服务器_Ubuntu开启远程连接-开启ssh服务

    ssh分为openssh client与openssh server 如果要连接某个远程就需要装openssh client 反之如果要被其他远程连接本机就需要安装openssh server 我们安装完ubuntu之后会发现无法通过外部使
  • 【软路由】旁路由使用配置教程

    软路由 旁路由使用配置教程 简介 旁路由好处 旁路由配置步骤 1 修改管理地址网段 2 关闭IPV6和DHCP服务 3 防火墙设置 关于IP动态伪装 4 终端设置 简介 我们都知道 软路由一般有两种使用方式 一种是作为承担DHCP分配的主路
  • 【JavaScript高级程序设计】重点-第五章笔记:Date、RegExp、原始值包装类、单例内置对象

    文章目录 基本引用类型 1 Date 1 1 继承的方法 1 2 日期格式化方法 1 3 日期 时间组件方法 2 RegExp正则表达式 2 1 RegExp 实例属性 2 2 RegExp 实例方法 2 3 RegExp 构造函数属性 3
  • 【Dev-C++】的dos控制台窗口大小设置

    可以使用system 接口直接修改 例 include
  • Spring 集成OpenOffice

    第一步 openoffice jar包依赖
  • 安卓scale动画fromDegrees toDegrees解释

    注意以下实验都是相对于自己 0 0f 上 1 0f 下 如果想了解安卓scale动画pivotX 请点击这里 在安卓中 fromDegrees是开始的角度 toDegrees是介绍的角度 其中X轴右面是0度 如果toDegrees比from
  • 【JS组件篇】使用拖拽组件 react-beautiful-dnd 实现工作台自定义布局功能

    项目要求 制作工作台页面 模块可根据后端配置动态展示 各模块可根据个人喜好进行拖拽布局 并保存 大致效果如下 大致实现步骤 整体布局 首先需要对设计稿进行分析 大致分为左右两部分 可根据后端配置动态展示左右两模块的展示内容 各模块相对独立
  • C++内存管理(2)new、delete详解

    目录 new operator new操作 new类对象时加不加括号的差别 new工作任务 delete工作任务 new和delete 堆区空间操作 对比malloc和free new和delete操作基本类型的空间 new和delete操
  • Direct3D纹理映射

    借助纹理映射技术 我们可将图像数据映射到三角形单元中 这种功能可以显著地增加所绘制场景的细节和真实感 例如创建一个立方体然后为其每个面映射一个板条纹理 从而将该立方体变为一个板条箱 在Direct3D中纹理用接口IDirect3DTextu
  • python判断工作日,节假日

    python判断工作日 节假日 模块 chinesecalendar 爬虫式的方法 模块 pandas 实例 模块 chinesecalendar 针对中国的节假日 强烈推荐 https pypi org project chineseca
  • 王道考研计算机网络第二章--物理层

    目录 2 1通信基础 2 1 1物理层基本概念 1物理层基本概念 2 1 2数据通信基础知识 1典型的数据通信模型 2数据通信相关术语 3三种通信方式 4两种数据传输方式 2 1 3码元 波特 速率 带宽 1码元 2速率 波特 带宽 2 1
  • 被入侵了怎么办?暴力破解被篡改了数据,该怎么处理?主机安全不容忽视

    主机安全关系着整个服务器数据的一个安全性 那么主机安全具体指什么呢 指保证主机在数据存储和处理的保密性 完整性 可用性 它包括硬件 固件 系统软件的自身安全 以及一系列附加的安全技术和安全管理措施 从而建立一个完整的主机安全保护环境 我们进
  • Kubernetes: K8S 容器集群管理系统

    虚拟机 gt 容器技术 传统部署 直接将应用程序部署在物理机上 虚拟机 vmware openstack 可以在操作系统中模拟出多台子电脑 Linux 子电脑之间是相互隔离的 独立 但是虚拟机存在启动慢 占用空间大 不易迁移的缺点 容器化技
  • openCV与freetype解决图片叠OSD的问题

    一 移植OPENCV3 4 1库 opencv 3 4 1 tar gz 功能 实现对图片的处理 移植文档见 正点原子 I MX6U 移植 OpenCV V1 3 注意版本 注意 安装交叉编译工具 注意 这里不能使用 NXP yocto 所
  • Oracle 12 创建数据库

    安装完oracle数据库软件后 就可以创建oracle数据库了 具体步骤如下 1 打开命令行 输入命令 dbca 通过它 我们可以对数据库进行管理 2 之后便会显示如下图所示的界面 点击下一步 3 进入配置数据库的界面 需要注意的是 a 全
  • ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统

    资产灯塔 不仅仅是域名收集 https github com TophantTechnology ARL 简介 旨在快速侦察与目标关联的互联网资产 构建基础资产信息库 协助甲方安全团队或者渗透测试人员有效侦察和检索资产 发现存在的薄弱点和攻
  • Notepad++查看hex文件

    一 打开插件 插件管理 二 找一下有没有一个hex开头的插件 有的话就安装它 然后重启软件 三 装完之后 插件里面就会出现下面这个东西 下面那张图百度上找的 我的里面找不到这个插件 四 如果找不到的话上github下一个 https git
  • 【Python网络爬虫与信息提取】Request+BeautifulSoup

    1 Request库 import requests r requests get https www baidu com print r status code print type r print r headers print r e