【爬虫】爬虫基础

目录

  • 一、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 requestsresponse = requests.get("https://movie.douban.com/top250")
if response.ok:print(response.text)
else:print("请求失败:" + str(response.status_code))

请求失败

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

image-20240607014319894

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

import requestsheaders = {"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 BeautifulSoupheaders = {"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 BeautifulSoupheaders = {"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.textsoup = 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 BeautifulSoupheaders = {"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.textsoup = 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.mzph.cn/pingmian/45266.shtml

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

相关文章

谷粒商城实战笔记-27-分布式组件-SpringCloud-Gateway-创建测试API网关

本节的主要内容是创建网关模块&#xff0c;将网关注册到Nacos&#xff0c;并配置路由进行测试。 一&#xff0c;创建网关模块 右键工程New->Module&#xff0c;创建新模块&#xff0c;模块名称 gulimall-gateway。 填充各种信息。 选中Gateway依赖。 点击Create创建模块。…

为什么使用代理IP无法访问网站

代理IP可以为用户在访问网站时提供更多的便利性和匿名性&#xff0c;但有时用户使用代理IP后可能会遇到无法访问目标网站的问题。这可能会导致用户无法完成所需的业务要求&#xff0c;给用户带来麻烦。使用代理IP时&#xff0c;您可能会因为各种原因而无法访问您的网站。以下是…

电脑录音如何操作?电脑麦克风声音一起录制,分享7款录音软件

电脑录音已经成为我们日常生活和工作中不可或缺的一部分。无论是录制会议、教学、音乐、网络直播、音源采集还是其他声音&#xff0c;电脑录音软件都为我们提供了极大的便利。本文将为大家介绍如何操作电脑录音&#xff0c;并分享七款录音软件&#xff0c;包括是否收费、具体操…

关于 Qt在国产麒麟系统上设置的setFixedSize、setMinimumFixed、setMaxmumFixed设置无效 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140242881 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

OpenCV中的浅拷贝和深拷贝

文章目录 前言一、浅拷贝二、深拷贝三、比较总结 前言 在数字图像处理中&#xff0c;针对读取到的一张图像&#xff0c;需要反复利用这张图像做各种的变换&#xff0c;以满足我们项目的需求。在这之前&#xff0c;最容易忽略的一点就是图像之间的拷贝问题&#xff0c;其中的浅…

解决在window资源管理器的地址栏中输入\\192.168.x.x\sambashare之后显示无法访问,错误代码 0x80070035,找不到网络路径。

一、错误重现 二、解决方法 1、在cmd中输入gpedit.msc gpedit.msc确定 -> 打开本地组策略编辑器 2、启用不安全的来宾登录 计算机配置 -> 管理模板 -> 网络 -> Lanman工作站 -> 右侧双击编辑"启用不安全的来宾登录"&#xff0c;把状态改为 “已启…

数据结构——查找算法

文章目录 1. 查找算法 2. 顺序查找 2. 二分查找 1. 查找算法 查找算法是用于在数据集中定位特定元素的位置的算法。查找是计算机科学中一项基本操作&#xff0c;几乎在所有应用程序中都需要使用。例如&#xff0c;数据库查询、信息检索、字典查找等都涉及到查找操作。查找算…

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…

[C++初阶]list类的初步理解

一、标准库的list类 list的底层是一个带哨兵位的双向循环链表结构 对比forward_list的单链表结构&#xff0c;list的迭代器是一个双向迭代器 与vector等顺序结构的容器相比&#xff0c;list在任意位置进行插入删除的效率更好&#xff0c;但是不支持任意位置的随机访问 list是一…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前&#xff0c;医疗健康直接关系到国计民生&#xff0c;然而&#xff0c;由于医疗水平和资源分布不均&#xff0c;以及信息系统老化等问题&#xff0c;整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量&#xff0c;在医疗领域的广泛…

Docker部署gitlab私有仓库后查看root默认密码以及修改external_url路径和端口的方法

文章目录 1、docker部署最新版gitlab2、进入gitlab容器3、修改路径地址ip和端口4、检验效果 1、docker部署最新版gitlab #docker安装命令 docker run --detach \--name gitlab \--restart always \-p 1080:80 \-p 10443:443 \-p 1022:22 \-v /gitlab/config:/etc/gitlab \-v …

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 &#xff1a; 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统&#xff0c;发现Packages的演示选项卡无法显示&#xff0c;我尝试从新安转了Packages 也是没作用&#xff0c;…

夏令营入门组day1

一. 题目 二. 初步思路 因为是解决区间上的问题&#xff0c;很容易想到用前缀和来解决。前缀和是o ( n ) 的时间复杂度&#xff0c;但后续枚举两个端点要 o ( n^2 )&#xff0c;对于2e10的数据&#xff0c;超时。 for (int i 1; i < n; i )for (int j i; j <n; j ){if…

转录组和基因芯片GSE数据RAW.tar压缩包下载和多样本整合处理教程

转录组和基因芯片GSE数据集的RAW.tar压缩包下载和多样本整合处理教程 GSEXXX_RAW.tar压缩包手动下载解压 前情回顾 关于OmicsTools根据GSE编号自动下载和提取GEO表达数据 根据GSE编号自动下载和提取GEO表达数据的窗口截图 自动下载和提取整理到结果文件 该模块的分析教程 …

天环公益首发原创开发进度网站 带后台

天环公益计划首发原创开发进度网站 带后台 后台地址是&#xff1a;admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520358 更多资源下载&#xff1a;关注我。

区分modbus tcp和tcp/ip

Modbus 对某些人来说&#xff0c;这听起来可能很复杂&#xff0c;也很令人费解&#xff0c;但是一旦你了解了它的工作原理&#xff0c;那就是一个特别简单的过程。MODBUS 这是一种请求和响应协议。MODBUS 主站将发起请求&#xff0c;从站将响应错误或请求信息。这就是 modbus 简…

通俗易懂,幽默诙谐,《IP 核芯志》让逻辑设计思想摆脱枯燥的标签(可下载)

在科技的广袤星空中&#xff0c;数字逻辑设计宛如一颗璀璨的明星&#xff0c;闪耀着智慧与创造的光芒。而在这光芒的深处&#xff0c;IP 核芯则是那关键的能量源泉&#xff0c;驱动着无数创新的浪潮。 《IP 核芯志——数字逻辑设计思想》犹如一座灯塔&#xff0c;照亮了我们在…

Java | Leetcode Java题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (cnt.containsKey(nums[i])) {cnt.…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …