【爬虫】爬虫基础

news2024/9/20 22:28:29

目录

  • 一、Http响应与请求
    • 1、Http请求
    • 2、Http响应
    • 3、状态码
  • 二、Requests库
    • 1、发起GET请求
    • 2、发起POST请求
    • 3、处理请求头
  • 三、BeautifulSoup库
    • 1、解析HTML文档
    • 2、查找和提取数据
      • Ⅰ、查找单个元素
      • Ⅱ、查找所有元素
      • Ⅲ、使用CSS选择器
      • Ⅳ、获取元素属性
  • 四、爬取豆瓣电影榜


一、Http响应与请求

HTTP是一种客户端-服务器协议,通信的双方分别是客户端和服务器。客户端发送HTTP请求,服务器接收并处理请求后返回HTTP响应。

1、Http请求

HTTP请求由请求行、请求头部、空行和请求数据(如POST请求时的表单数据)组成。

  • 请求行包含请求方法、请求的URL和协议版本。常见的请求方法包括GET、POST、PUT、DELETE等。
  • 请求头部包含关于客户端和请求的其他信息,如User-Agent、Accept、Content-Type等。
  • 空行用于分隔请求头部和请求数据。
  • 请求数据通常用于POST请求,包含提交的数据。

请求示例:

POST /api/users HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: application/json
Content-Type: application/json
Content-Length: 27

{
  "name": "John",
  "age": 30
}

请求行:POST /api/users HTTP/1.1

请求头:包含Host、User-Agent、Accept、Content-Type、Content-Length等

空行:请求头和请求体之间的空行

请求体:JSON数据

2、Http响应

HTTP响应由状态行、响应头部、空行和响应数据组成。

  • 状态行包含协议版本、状态码和状态消息。状态码指示了请求的处理结果,如200表示成功,404表示未找到资源,500表示服务器内部错误等。
  • 响应头部包含服务器和响应的其他信息,如Server、Content-Type、Content-Length等。
  • 空行用于分隔响应头部和响应数据。
  • 响应数据包含服务器返回的数据,如HTML、JSON等。

假设服务器返回一个简单的HTML页面,响应可能如下:

HTTP/1.1 200 OK
Date: Sun, 02 Jun 2024 10:20:30 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 137
Connection: keep-alive

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample HTML page.</p>
</body>
</html>

状态行:HTTP/1.1 200 OK

响应头:包含Date、Server、Content-Type、Content-Length、Connection等

空行:响应头和响应体之间的空行

响应体:包含HTML代码

3、状态码

HTTP状态码指示了服务器对请求的处理结果。常见的状态码包括:

  • 1xx:信息响应,表示请求已接收,继续处理。
  • 2xx:成功,表示请求已成功被服务器接收、理解、并接受。
  • 3xx:重定向,表示需要进一步操作以完成请求。
  • 4xx:客户端错误,表示服务器无法处理请求。
  • 5xx:服务器错误,表示服务器在处理请求时发生了错误。

状态码

二、Requests库

Python的Requests库是一个非常强大且易于使用的HTTP库。

在使用之前,需要先安装Requests库:pip install requests

1、发起GET请求

GET请求用于从服务器请求数据。使用Requests库发起GET请求非常简单:

import requests
# 发起GET请求
response = requests.get('https://news.baidu.com')
# 检查响应状态码
if response.status_code == 200:
    # 打印响应内容
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")

2、发起POST请求

POST请求用于向服务器提交数据。例如,需要登录的网站通常使用POST请求提交用户名和密码。使用Requests库发起POST请求的方法如下:

import requests

# 定义要发送的数据
data = {
    'username': '123123123',
    'password': '1231231312'
}

# 发起POST请求
response = requests.post('https://passport.bilibili.com/x/passport-login/web/login', data=data)

# 检查响应状态码
if response.status_code == 200:
    # 打印响应内容
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")

3、处理请求头

在有些网站(例如豆瓣),不让爬虫有反爬取机制,需要设置HTTP请求头和参数,来伪装成浏览器通过身份验证。

import requests

response = requests.get("https://movie.douban.com/top250")
if response.ok:
    print(response.text)
else:
    print("请求失败:" + str(response.status_code))

请求失败

例如,上面的代码,没有设置请求头,豆瓣就拒绝让我们访问。

image-20240607014319894

我们可用随便进入网站,随便找个现成的User-Agent,放到我们的请求头里。

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

response = requests.get("https://movie.douban.com/top250", headers=headers)
print(response.text)

image-20240607014435738

这样,就能访问豆瓣,并且获取该网页的内容了。

三、BeautifulSoup库

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库,尤其适用于从网页中提取数据。

在使用之前,需要安装BeautifulSoup 库:pip install beautifulsoup4

1、解析HTML文档

html.parser是Python内置的解析器,适用于大多数场景。以上面的豆瓣为例。

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

response = requests.get("https://movie.douban.com/top250", headers=headers)
html = response.text
# 使用html.parser来解析HTML内容
soup = BeautifulSoup(html, "html.parser")

2、查找和提取数据

BeautifulSoup提供了多种方法来查找和提取HTML文档中的数据。

BeautifulSoup常用方法:

  • find(tag, attributes): 查找第一个符合条件的标签。
  • find_all(tag, attributes): 查找所有符合条件的标签。
  • select(css_selector): 使用CSS选择器查找符合条件的标签。
  • get_text(): 获取标签内的文本内容。
  • attrs: 获取标签的属性字典。

Ⅰ、查找单个元素

find方法用于查找第一个符合条件的元素。例如,查找页面中的第一个标题:

title = soup.find("span", class_="title")
print(title.string)

Ⅱ、查找所有元素

findAll方法用于查找所有符合条件的元素。例如,查找页面中的所有标题:

all_titles = soup.findAll("span", class_="title")
for title in all_titles:
    print(title.string)

Ⅲ、使用CSS选择器

select方法允许使用CSS选择器来查找元素。例如,查找所有标题:

all_titles = soup.select("span.title")
for title in all_titles:
    print(title.get_text())

Ⅳ、获取元素属性

可以使用attrs属性获取元素的属性字典。例如,获取所有图片的URL:

all_images = soup.findAll("img")
for img in all_images:
    print(img['src'])

四、爬取豆瓣电影榜

image-20240607021500369

电影标题:HTML的标签名是:span,指定元素的 class 属性是 title

image-20240607021403243

评分:HTML标签是:span,指定元素的class属性是rating_num

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}
    response = requests.get(f"https://movie.douban.com/top250", headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    # 获取所有电影
    all_movies = soup.find_all("div", class_="item")

    for movie in all_movies:
        # 获取电影标题
        titles = movie.find_all("span", class_="title")
        for title in titles:
            title_string = title.get_text()
            if "/" not in title_string:
                movie_title = title_string

        # 获取电影评分
        rating_num = movie.find("span", class_="rating_num").get_text()

        # 输出电影标题和评分
        print(f"电影: {movie_title}, 评分: {rating_num}")

image-20240607021144542

爬取成功了,但是爬取的内容只有第一页,后面的内容没有爬取成功。分析上面的url连接,每个页面通过URL中的start参数进行分页。

image-20240607020345475

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

for start_num in range(0, 250, 25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    # 获取所有电影条目
    all_movies = soup.find_all("div", class_="item")

    for movie in all_movies:
        # 获取电影标题
        titles = movie.find_all("span", class_="title")
        for title in titles:
            title_string = title.get_text()
            if "/" not in title_string:
                movie_title = title_string

        # 获取电影评分
        rating_num = movie.find("span", class_="rating_num").get_text()

        # 输出电影标题和评分
        print(f"电影: {movie_title}, 评分: {rating_num}")

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

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

相关文章

PBE注册/PBE汉化/美测服汉化/美测服下载/美测服注册教程

英雄联盟PBE美测服是一个可以提前参与游戏测试&#xff0c;提前享受英雄联盟或者云顶之弈新版本的服务器&#xff0c;我们可以更快的了解到游戏的更新内容&#xff0c;很多玩家都想要游玩pbe美测服&#xff0c;下面我就个idaj带来美测服汉化/美测服下载/美测服注册教程&#xf…

【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列 什么是动态规划斐波那契数组相关题目509. 斐波那契数 Easy1137. 第 N 个泰波那契数 Easy 杨辉三角118. 杨辉三角 Easy 爬楼梯相关题目70. 爬楼梯 Easy746. 使用最小花费爬楼梯 Easy 什么是动态规划 动态规划是一种通过将原问题分解为相对简单的子问题来…

【代码规范】.train(False)和.eval()的相似性和区别

【代码规范】.train(False)和.eval()的相似性和区别 文章目录 一、.train(False) 和 .eval() 的功能二、.train(False) 和 .eval() 的区别2.1 .eval()2.2 .train(False)2.3 总结 三、.eval()更加规范 一、.train(False) 和 .eval() 的功能 .train(False) 和 .eval() 在功能上非…

STM32CubeMX配置STM32G071输入捕获(HAL库开发)

1.时钟配置HSI主频配置64M 2.配置好串口&#xff0c;选择异步模式 3.配置TIM1_CH1产生1KHz的信号&#xff0c;主频64MHz&#xff0c;分频&#xff08;64-1&#xff09;&#xff0c;计数周期&#xff08;1000-1&#xff09;&#xff0c;这样即可生成1KHz信号。 4.配置TIM3_CH1和…

Linux 07:基础IO

stdin & stdout & stderr C默认会打开三个输入输出流&#xff0c;分别是stdin, stdout, stderr。仔细观察发现&#xff0c;这三个流的类型都是FILE*, fopen返回值类型&#xff0c;文件指针。 文件读取函数&#xff08;库函数&#xff09;&#xff1a; fopen、fread、…

2024 年你需要知道的免费 API-独立产品灵感周刊 DecoHack #061

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 &#x1f4bb; 产品推荐 1. Pintree 首先…

01- 收入数据集【Pytorch入门实战】

目录 一、机器学习基础 二、实战例子 1.数据集分析 2.实战训练 3.总结 三、参考资料 一、机器学习基础 为了解决这个问题&#xff0c;人们想到数据驱动方法&#xff0c;也就是让计算机从现有的大量的带标签图片电学习规律&#xff0c;一旦计算机学习到了其中的规律&…

【绝命Coding助力秋招】Python实现<实习僧>海投脚本

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

异常、File

异常、File 异常 异常就是代表程序出现的问题 Error&#xff1a;代表的系统级别错误&#xff08;属于严重问题&#xff09;。系统一旦出现问题&#xff0c;sun公司会把这些错误封装成Error对象。Error是给sun公司自己用&#xff0c;不是给我们程序员用的。因此我们开发人员不…

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1&#xff08;AOMedia Video 1&#xff09;是一种开源的视频编码格式&#xff0c;旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面&#xff0c;AV1相较于其前身VP9和其他编解码标准&#xff0c;如H.264/AVC和H.265/HEVC&#xff0c;…

自建文件分享平台Pingvin Share系统

Pingvin Share可以用来代替 WeTransfer 等的分享网站&#xff0c;如果你有自己的服务器&#xff0c;可以支持通过 Docker 部署或者 Stand-alone 部署。 功能介绍 完全自建&#xff1a;轻松使用私有服务器搭建文件共享平台 完全隐私&#xff1a;你的文件只属于你&#xff01;不…

相交链表+判断环型链表+求环型链表的入口节点

链表OJ题 一.相交链表二.判断环型链表三.求环型链表的入口节点 一.相交链表 相交链表 相交&#xff1a;两个链表从头开始遍历&#xff0c;尾节点一定是同一个节点。 情况一&#xff1a;当两个链表长度相同时&#xff1a; 情况二&#xff1a;当两个链表长度不同时&#xff1…

【详解】Spring Cloud概述

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 集群和分布式…

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在&#xff0c;教程太多了 参考博客&#xff08;1 2 3&#xff09;&#xff0c;如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 &#xff08;1&#xff09; 建议下载PuTTy for windows&#xff0c;从而建立与远程服务器的SSH连接 需要确认目标服…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源&#xff1a;2.安装Vue CLI&#xff1a;3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境&#xff0c;它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言

文章目录 Beginning1&#xff09;ASCLL 码2&#xff09;大小比较2&#xff09;判断数字字符3&#xff09;字符、数字间的相互转换End Beginning 在 C 中&#xff0c;字符和整数有着密不可分的关系。原因就是在计算机中&#xff0c;字符是以一种较 ASCLL 码的整数存储的。自然&…

SpringSecurity框架【认证】

目录 一. 快速入门 二. 认证 2.1 登陆校验流程 2.2 原理初探 2.3 解决问题 2.3.1 思路分析 2.3.2 准备工作 2.3.3 实现 2.3.3.1 数据库校验用户 2.3.3.2 密码加密存储 2.3.3.3 登录接口 2.3.3.4 认证过滤器 2.3.3.5 退出登录 Spring Security是Spring家族中的一个…

C语言之qsort函数

一、qsort 1.库函数qsort qsort是库函数&#xff0c;直接可以用来排序数据&#xff0c;底层使用的是快速排序。 qsort函数可以排序任意类型的数据。 2.头文件 #include<stdlib.h> 3.参数讲解 void*类型的指针是无具体类型的指针&#xff0c;这种类型的指针的不能直接解…

Still-Moving效果惊艳!无需定制视频数据,DeepMind让文生定制视频变得简单!

文章链接&#xff1a; https://arxiv.org/pdf/2407.08674 github链接&#xff1a; https://still-moving.github.io/ Still-Moving 自定义文本生成图像&#xff08;T2I&#xff09;模型最近取得了巨大进展&#xff0c;尤其是在个性化、风格化和条件生成等领域。然而&#xff0c…