python爬虫原理及源码解析(入门)

news2025/2/26 21:21:01

目录

    • 一、爬虫是什么?
    • 二、爬虫的基本原理
    • 三、HTTP协议与响应
    • 4、爬虫实现源码

一、爬虫是什么?

​ 如果将互联网比作一张大的蜘蛛网,数据便是存放在蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序。

爬虫能通过网址获得网络中的数据、然后根据目标解析数据、存储目标信息,可以节省大量的人力物力,简单地说,网络爬虫就是获取互联网公开数据的自动化工具,像百度、google本质上就是超级爬虫,百度搜索引擎的爬虫叫作百度蜘蛛(Baiduspider)。百度蜘蛛每天会在海量的互联网信息中进行爬取,爬取优质信息并收录,当用户在百度搜索引擎上检索对应关键词时,百度将对关键词进行分析处理,从收录的网页中找出相关网页,按照一定的排名规则进行排序并将结果展现给用户。

二、爬虫的基本原理

在这里插入图片描述

网络爬虫,基本原理就是在爬虫程序得到URL(链接),向目标服务器发起HTTP请求访问,然后目标服务器返回响应结果,爬虫客户端收到响应并从中提取数据,再进行数据清洗、数据存储工作。

  • 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用;

三、HTTP协议与响应

爬虫要向URL发送请求,那么就要依赖于HTTP/HTTPS协议,HTTPS比HTTO更安全,但性能更低

HTTP(Hypertext Transfer Protocol)协议又称超文本传输协议,它是一种客户端与服务器之间的请求-响应协议,比如 浏览器就是可以被看作客户端,在浏览器地址栏输入想访问的网址,浏览器就会向该链接的服务器发送访问请求,然后等待服务返回给浏览器响应

在这里插入图片描述

HTTP有不同的请求方法,最常见的两种是GET和POST

  • GET方法用于获取数据,如向网页发送get请求得到网页类容
  • POST方法用于创建数据,如在浏览器中提交表单信息时,浏览器会发送POST请求

一个完整的HTTP请求数据里面包含三部分类容:请求行、请求头、请求体

请求行

在这里插入图片描述

在以上URL请求链接中www.douban.com域名后的第一个斜杠表示资源路径的根,所以/movie/top250就是要访问的资源路径,在请求行中可以添加查询参数,可以传递给服务器额外的信息。请求行中的HTTP/1.1表示HTTP的协议版本

请求头

在这里插入图片描述

用于告知客户端的相关信息,比如请求时浏览器发出的还是其它程序发出来的,如果是浏览器的话则展示类型、版本等等信息

请求体

请求体里面可以放客户端传给服务器的其它任意数据,但get方法的请求体一般是空的

4、爬虫实现源码

以下使用的作为示范的编译器是PyCharm

引入第三方库

首先引入requests与bs4的第三方库

在这里插入图片描述

引入requests

requests是Python中可以用代码来模拟发送网络请求,并得到响应数据的一个第三方库requests

在终端(terminal)输入:pip install requests

显示此信息表示安装成功

在这里插入图片描述
引入bs4

BeautifulSoup又称bs4,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

在终端(terminal)输入:pip install bs4

显示此信息表示安装成功
在这里插入图片描述

编写简易爬虫

以下爬虫是扒取豆瓣电影Top250的信息

源码

import requests
from bs4 import BeautifulSoup

# 修改请求头中的User-Agent参数 以达到模拟用户访问的效果
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 "
                  "Safari/537.36 Edg/112.0.1722.48"
}
# 循环判断 获取分页数据 从0-250 每次分页加25值
for start_num in range(0, 250, 25):
    # get方式请求链接 并扒取html数据
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    html = response.text
    # 使用BeautifulSoup方法 获取html
    soup = BeautifulSoup(html, "html.parser")
    # 指定span标签
    all_title = soup.findAll("span", attrs={"class": "title"})
    # 循环html标签下的 span标签
    for title in all_title:
        # 声明索引值
        title_string = title.string
        # if判断 不趴取span标签中 含下滑线/
        if "/" not in title_string:
            # 打印索引值
            print(title_string)

以上爬虫代码扒的页面数据所以要观察 页面的html元素

进入https://movie.douban.com/top250链接 f12查看页面的html元素 选择到要扒的数据 可以看到

该条数据(肖申克的救赎)是在span标签里且class值为title的元素 然后用这些条件指定到该标签的值

soup.findAll(“span”, attrs={“class”: “title”})

在这里插入图片描述

分页扒取数据

在跳转下一页时观察 请求行的变化

在这里插入图片描述

可以看出多了 start=75 的请求参数,此请求参数不同则跳转的分页页面也不同

然后就是for循环遍历了,敲几遍很好理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用spring-boot-starter实现事务的统一配置

一、前言 微服务架构下,多个微服务都需要事务操作,如果在每个微服务下都从头配置事务,将非常繁锁。事务配置具有高度的一致性,可以抽取出来,制作starter,在需要配置事务的服务中引入starter依赖即可。 采用…

NFS(UOS)

appsrv 172.16.146.11 strogesrv 172.16.146.53 共享/data/share目录 用于存储app主机的web数据 仅允许stora访问该共享 安装nfs apt install nfs-common nfs-kernel-server -y mkdir /data/share /data/share 172.16.146.50(rw,sync,no_root_squash,insecure) 重启服…

志特转债上市价格预测

志特转债 基本信息 转债名称:志特转债,评级:A,发行规模:6.14033亿元。 正股名称:志特新材,今日收盘价:35.6元,转股价格:41.08元。 当前转股价值 转债面值 / …

微服务学习高级篇【5】之服务异步通信(rabbitmq的高级特性)

文章目录 环境准备:MQ部署【docker环境】消息可靠性生产者消息确认项目配置定义Return回调和ConfirmCallback 消息持久化交换机持久化队列持久化消息持久化 消费者消息确认none模式演示 消费失败重试机制本地重试失败策略 总结 死信交换机初识死信交换机死信交换机接…

【DHCP原理与配置】

目录 一、了解DHCP服务使用DHCP的好处DHCP的分配方式 二、DHCP的租约过程传输协议端口DHCP的IP地址自动获取工作原理 三、配置DHCP服务器安装dhcp查看配置文件根据配置文件提示查看相关文档 四、模拟外网和内网互通进入主机1的设置进入主机2的设置复制dhcp文件,修改…

Nginx 优化与防盗链

Ngnix优化主要有两种,一种是配置上的优化,一种是内核上的优化 实验准备:安装好一台Nginx服务器,IP:192.168.126.22,域名:www.accp.com 浏览器访问nginx服务器此时F12查看网页信息,可…

MySQL之表的约束

目录 一 空属性 定义 如何设置 示例 影响: 二 默认值 定义 示例 影响: 三 列描述 定义 示例 影响: 四 zerofill 定义: 示例: 影响: 五 主键 定义 主键的性质是什么: 为什么要…

C++——一种特殊的二叉搜索树之红黑树

目录 1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的插入操作情况一: cur为红,p为红,g为黑,u存在且为红。情况二: cur为红,p为红,g为黑(不存在连续的红结点),u不存在/u存…

设计模式 -- 适配器模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

第五篇 Spring 集合注入、作用域

《Spring》篇章整体栏目 ————————————————————————————— 【第一章】spring 概念与体系结构 【第二章】spring IoC 的工作原理 【第三章】spring IOC与Bean环境搭建与应用 【第四章】spring bean定义 【第五章】Spring 集合注入、作用域 【第六章】…

时间序列分析卫星重力梯度观测值

阚昊宇 1 时间序列图 导入数据,共2880历元(86370 s)数据,取前2400历元(72000 s)数据作为训练集,后480历元作为测试集。将训练集绘制时间序列图如下图 1红色线所示,可见明显的自相关…

elementUI-el-table组件使用总结

一、背景 vue2项目中用到el-table这个组件&#xff0c;但基础的功能不够用&#xff0c;所以需要自定义 二、表头自定义 比如要让表头展现出下面的形式&#xff1a; 只需使用 slot"header" slot-scope"scope" 对插槽进行定义&#xff0c;并绑定变量 <…

快手视频艾特实操教学分享,什么是艾特脚本,评论区艾特引流脚本讲解!

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下快手艾特脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们…

Windows系统开启防火墙,Ubuntu与Windows互通

1.启用Windows系统防火墙&#xff0c;&#xff0c;单击"高级设置" 2.单击“入站2规则” 3.单击 “新建规则“ 4.选择“端口” 端口号设置hanwin NFS中包括的端口号。 5.选择 TCP 填写 hanewin中的端口号&#xff0c;然后单击“确认” 6.单击“入站规则” 7.右击 nf…

JAVAWeb06-动态WEB开发核心Servlet-03

1. HttpServletRequest 1.1 HttpServletRequest 介绍 HttpServletRequest 对象代表客户端的请求当客户端/浏览器通过 HTTP 协议访问服务器时&#xff0c;HTTP 请求头中的所有信息都封装在这 个对象中通过这个对象的方法&#xff0c;可以获得客户端这些信息。 1.2 HttpServle…

HTTP请求知识

一次完整的HTTP请求所经历的步骤 1&#xff1a;首先进行DNS域名解析(本地浏览器缓存&#xff0c;操作系统缓存或者DNS服务器)&#xff0c;首先会搜索浏览器自身的DNS缓存(缓存时间比较短&#xff0c;大概只有1分钟&#xff0c;且只能容纳1000条缓存) 如果浏览器自身的缓存里面…

什么是 MySQL 监控

MySQL是一个开源的关系数据库管理系统&#xff0c;它基于客户端-服务器模型运行&#xff0c;使用SQL作为其通信模式。它是世界上第二受欢迎的数据库&#xff0c;因为它具有灵活性和可扩展性、高安全性、易用性以及无缝处理大型数据集的能力。由于其广泛的功能&#xff0c;MySQL…

ThinkPHP5.1框架通过Composer下载安装

5.1版本开始&#xff0c;官网不再提供下载版本&#xff0c;请使用Composer或者git方式安装和更新。所以想安装Tp51需要通过Composer或者git方式安装 通过Composer方式安装&#xff1a; 一、 先下载Composer Wondows 平台上&#xff0c;我们只需要下载 [Composer-Setup.exe] (h…

4个Python库来美化你的Matplotlib图表

Matplotlib是一个被广泛使用的Python数据可视化库&#xff0c;相信很多人都使用过。 但是有时候总会觉得&#xff0c;Matplotlib做出来的图表不是很好看、不美观。 今天就给大家分享四个美化Matplotlib图表的Python库&#xff0c;它们可以轻松让你的Matplotlib图表变得好看&…

移远通信笔试题

限时60分钟 1.下列关于栈叙述正确的是 A A) 栈顶元素最先能被删除 B&#xff09;栈顶元素最后才能被删除 C&#xff09;栈底元素永远不能被删除 D&#xff09;以上三种都不对 在栈中&#xff0c;最后被压入的元素总是在栈顶上方&#xff0c;而栈顶元素总是最先被弹出的元…