【1】python爬虫入门,利用bs4以及requests获取静态网页

2023-11-16

注:本文仅适用于爬虫初级入门者,并不涉及太多技术本质

感谢您阅读此文。最近放假在家,闲时无聊,开始入门了python爬虫,可以完成一些基本的数据爬取(对于一些反爬取例如JS渲染,接口加密等页面仍然处于学习之中),本文就是简单总结最近已熟练掌握的爬取静态网页的方法。

若是从未接触过相关知识的朋友,在开始之前,需至少掌握python入门知识,详见廖雪峰的官方网站,另外若要深入探究爬虫的本质以及希望更好地爬取所需数据的朋友,那么就需要熟悉web前端知识(HTML,JS,CSS,jQ,Ajax等),在此文中并不会过深涉及,故不加阐述。

接下来简单介绍一下BeautifulSoup库和requests库(另外还需安装lxml库):

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下: Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档本身就没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。详见BeautifulSoup4.2.0官方文档

Requests 是用Python语言编写,基于 urllib 的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,可以满足 HTTP 测试需求。可参照Python第三方库request详解这篇文章。

接下来我们就开始从爬取网易云课堂上计算机专业所需课程以简单示范:

1.首先,导入我们所需的库:

from bs4 import BeautifulSoup
import requests
2.接着我们用url确定我们的目标网址:
url='http://study.163.com/curricula/cs.htm'
URL是统一资源定位符,基本URL包含协议、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”

而我们加载网页的过程基本就是客户端向服务器以某一方式发送request,而服务器处理后,会给我们response

而请求方式有多种:get,post,head,put,options等等,而一般常用的只有get和post两种,对于一般的网页,我们通常只使用get方式即可。get和post的区别-知乎
3.接下来,我们开始利用requests.get()来获取网页并利用bs4解析网页:

response=requests.get(url)
soup=BeautifulSoup(response.text,'lxml')

soup=BeautifulSoup(html #目标网址文本内容# ,’lxml’#解析器# )

4.此时,我们就需要人工到目标网站上寻找自己想要的数据的位置:

基本步骤:进入网页后,打开开发者工具(F12),or右键点击网页检查,or直接找到需要的内容右键检查


我们希望把计算机专业在大学本科阶段的所有课程全部爬取下来,那么我们就要找到所需数据的定位位置,复制它的定位路径无论是类名还是selector路径等都可以,关键是要满足我们可以通过它来准确找到所需要的数据。

而在获取同一类数据时,我们要注意观察他们之间的标签等有没有共同点,分析出后即可利用select()统一筛选放入list。

而常用的路径描述有两种:CSS Selector和XPATH,而soup.select()不支持XPATH。select方法详解

经过分析,我们发现所有课程有两种不同的特征路径,利用这两种特征路径找到路径,我们就可以筛选出所需数据了:

data0=soup.select('span.f-thide.cataName.f-ib')
data1=soup.select('#j-package > div > div > div > a')
5.最后我们需要把数据打印出来:
for x in data0:
    print(x.get_text())
for y in data1:
    print(y.get_text())
此处由于我们仅仅筛选出单一数据,仅做范例。

若是多个有关联的数据,可以利用正则匹配等方法处理数据,整理到一个字典中再打印出来或者保存到文件以及数据库等等。


由于笔者能力有限,所以对很多地方实在不敢妄加赘述,如有不足之处,望及时指出

在此简单总结一下本文:
静态网页爬取步骤:

1.利用bs4和requests来获取网址的response以及解析网页

2.观察,寻找所需数据的位置,加以筛选

3.处理标签中文本,若数据大且有所关联则归整到字典

我们当然可以将一些基本操作封装成函数,以便操作:

def get_wb_data(url,label,headers=None):
    if(headers==None):
        response = requests.get(url)
    else:
        response=requests.get(url,headers=headers)
    soup=BeautifulSoup(response.text,'lxml')
    data=soup.select(label)
    return data
def print_data(data):
    for x in data:
        print(x.get_text())
所以,我们在针对一个或同一类网站若需要长期获取某一类信息,可以封装函数,可以更加便利。


想必看阅本文的都是希望接触python爬虫的初学者,在此建议:

多动手操作,去大胆爬取自己想要的信息,在这个过程中,会发现有许多东西爬不下来,这时,我们可以进一步去探索异步加载的处理,即如何应对动态网页的知识。

并且我们可能会遇到仅仅get是不足以获取数据的情况,那么就需要我们了解Headers,让爬虫去模仿人访问等知识。

再进一步,我们发现有的网站很多东西不断更新,专门进行反爬取,那么我们可能会接触破解验证码,如何避免封IP等问题。

…………(假装分界线)


笔者实在能力有限,对之后的种种还无法熟练操控,若笔者自认可以继续进一步讲解时,或许会有后续文章。

希望此文可以帮助一些初级入门的朋友,再次感谢。









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

【1】python爬虫入门,利用bs4以及requests获取静态网页 的相关文章

  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di

随机推荐

  • 剑指offer试题编程练习11(java) 位运算符的运用

    11 输入一个整数 输出该数二进制表示中1的个数 其中负数用补码表示 首先回顾原码 反码 补码的知识 来自https www jianshu com p 36ec7a047f29 在计算机底层均是以二进制表示的 数字也不例外 下面以8位bi
  • 14-数组与指针

    寻址运算符 指针运算符 寻址运算符与 指针运算符 具有相同的优先级 自右向左结合 int a Int p a a gt a p gt p int p a 指针的赋值 声明的时候 赋值int p a 先声明再赋值 int a int p p
  • Mac配置item2高亮颜色

    item2颜色生效配置 1 bash设置 在导入并应用完颜色方案之后 通过命令vim bash profile 或open bash profile编辑文件 添加以下内容 之后source bash profile来应用文件修改 CLICO
  • 数据技术之数据挖掘

    第7章 数据挖掘 1 什么是数据挖掘 数据挖掘 Data Mining 就是从大量的数据中 提取隐藏在其中的 事先不知道的 但潜在有用的信息的过程 数据挖掘的目标是建立一个决策模型 根据过去的行动数据来预测未来的行为 2 阿里数据挖掘平台
  • TypeScript笔记

    数据基础类型定义 let username string 管理员 username 系统管理员 模板字符串 使用反引号 let describe string 今天天气 weather sencence方式 let info string
  • Spring Cloud微服务项目实战笔记(二)是什么推动了单体应用到微服务架构的演进?

    首先对比的是单体应用 一个有问题 大家都完蛋 重新回滚到上一版本 开发测试沟通成本也大 微服务架构的优势 每个微服务是一个小的完整单位 独立的代码库数据库 自己去快速迭代功能 快速迭代 快速回滚 资源利用大大提高 大幅降低协作成本 高可用
  • 链表 -- 算法 -- leetcode

    翻转链表前n个节点 虚拟头结点的使用情况 链表的首节点可能发生改变 虚拟头结点 ret gt next head 力扣 力扣 力扣 力扣 力扣 力扣 力扣 力扣 力扣
  • 期望/方差/协方差/相关系数

    期望 在概率论和统计学中 数学期望 mean 或均值 亦简称期望 是试验中每次可能结果的概率乘以其结果的总和 是最基本的数学特征之一 它反映随机变量平均取值的大小 离散型随机变量的一切可能的取值Xi与对应的概率p xi 乘积之和称为该离散型
  • 会员ID查询测试用例设计

    检查点 默认值检查 异常输入 查询结果检查 正常输入 查询结果检查 测试用例设计 1 前提 存在会员ID abc abcd 1abc 会员id输入为字母abc 其它默认 点击 搜索 显示完全匹配该条件的数据 即只显示会员ID abc的记录
  • linux 线程

    1 线程概述 与进程的区别及线程的优势 什么是线程 在一个程序里的一个执行路线就叫做线程 thread 更准确的定义是 线程是 一个进程内部的控制序列 一切进程至少都有一个执行线程 线程是进程内部的一条执行序列或执行路径 即一个可调度的实体
  • 读书小记--<态度>

    前言 前段时间再读了吴军老师的 态度 分享的是和女儿的日常书信 觉得收获很多 同事推荐他的 浪潮之巅 数学之美 系列书籍 下面是个人的觉得认同或值得深入学习的一些点 特此记录一下 态度决定命运 文中写道撒切尔夫人的一句话 注意你的想法 因为
  • 前端调用高德地图的接口

  • 如何查看linux内核

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 如何查看linux内核版本 第一种 登录linux 在终端输入 cat proc
  • 【机器学习】几种常见的概率分布

    之前你已经了解概率的基础知识 如果还不知道概率能干啥 在生活中有哪些应用的例子 可以看我这个 人工智能时代 用概率思维发现人生机会 www zhihu com 今天我们来聊聊几种特殊的概率分布 这个知识目前来看 还没有人令我满意的答案 因为
  • 常用的shell脚本

    1 脚本之间传递参数 1 sh 的脚本 接受参数 如下 如果有一个参数则赋值个sourceFile这个变量 否则用默认值 Shell代码 bin bash LANG en US UTF 8 get parameters sourceFile
  • 关于SSM 项目 tomcat无休止启动的问题记录

    起初很懵逼 然后一想就知道了 可能是刚写的sql除了问题 原sql SELECT FROM A WHERE DATEDIFF add time NOW lt 0 改后sql SELECT FROM tb order WHERE DATEDI
  • SpringCloud Gateway + Nacos 多模块下整合swagger2

    前言 我们经常在springboot单体项目中 集成swagger来整合接口文档 但是在微服务springcloud项目下 业务模块众多 如果再像之前一样单独访问每个模块的 swagger ui html 则非常麻烦 怎么解决呢 既然我们已
  • 本周新出计算机视觉开源代码汇总(语义分割、目标检测、超分辨率、网络结构设计、训练策略等)

    CV君汇总了过去一周计算机视觉领域新出的开源代码 涉及到图像增广 医学图像分割 图像恢复 目标检测 语义分割 超分辨率 显著目标检测 轻量级网络结构设计 网络规范化 标注工具等 其中有多篇来自CVPR 2019与ICML 2019的论文代码
  • COBOL

    一 COBOL简介 COBOL Common Business Oriented Language 面向过程的高级程序设计语言 二 COBOL语法格式 COBOL程序的每行代码通常分为80列 有非标准的80列可以超过80列 写多少列都可以
  • 【1】python爬虫入门,利用bs4以及requests获取静态网页

    注 本文仅适用于爬虫初级入门者 并不涉及太多技术本质 感谢您阅读此文 最近放假在家 闲时无聊 开始入门了python爬虫 可以完成一些基本的数据爬取 对于一些反爬取例如JS渲染 接口加密等页面仍然处于学习之中 本文就是简单总结最近已熟练掌握