初学者快速入门Python爬虫 (无废话版)
全篇大概 5000 字(含代码),建议阅读时间 40min
一、Python爬虫简介
1.1 什么是网络爬虫?
定义:
网络爬虫(Web Crawler)是自动浏览互联网并采集数据的程序,就像电子蜘蛛在网页间"爬行"。
分类:
- 通用爬虫:Google等搜索引擎的爬虫
- 聚焦爬虫:定向采集特定领域数据(如电商价格)
- 增量式爬虫:只抓取更新内容
- 深层爬虫:抓取需要登录的页面
1.2 Python爬虫的优势
示例对比:
//Java实现HTTP请求
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://aizlian.xyz")).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
#Python实现同样功能
import requests
response = requests.get("https://aizlian.xyz")
优势对比:
- 语法简洁:代码量减少50%
- 库生态丰富:requests(网络请求)、BeautifulSoup(HTML解析)、Scrapy(框架)等
- 跨平台:Windows/MacOS/Linux通用
- 调试方便:REPL环境快速测试代码
二、环境搭建
2.1 Python环境安装
进入Python官网,下载与电脑系统匹配的版本。

下载完成后,按照提示完成环境安装。
验证安装:在终端命令行窗口输入命令
python --version
输出以下提示,说明安装成功。

三、Requests库
相比Python内置的urllib,requesets设计更简洁直观,例如发送GET请求仅需一行代码:requests.get(url)
3.1 安装与导入
安装 requests
pip install requests
导入requests
import requests
3.2 发送GET请求
通过requests.get()获取网页内容:
response = requests.get("https://aizlian.xyz")
状态码:检查请求是否成功(200表示成功):
print(response.status_code) # 输出:200
文本内容:获取网页HTML或文本:
print(response.text) # 输出网页内容
全部代码
import requestsresponse = requests.get("https://aizlian.xyz")print(response.status_code)
print(response.text)
3.3 发送POST请求
用 requests.post() 提交数据(如表单或登录):
import requests
# 提交表单数据
data = {"username": "admin", "password": "123456"}
response = requests.post("https://httpbin.org/post", data=data)# 提交JSON数据
json_data = {"key": "value"}
response = requests.post("https://httpbin.org/post", json=json_data)
3.4 处理响应内容
解析JSON:直接转为Python字典:
data = response.json()
print(data) # 输出解析后的JSON
二进制内容(如下载图片):
import requests
response = requests.get("图片网址")
with open("image.jpg", "wb") as f:f.write(response.content) # 保存二进制数据
3.5 参数
URL参数:通过params添加查询参数:
params = {"page": 1, "limit": 10}
response = requests.get("https://httpbin.org/get", params=params)
请求头:伪装浏览器标识(避免被反爬):
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
3.6 异常处理
if response.status_code == 200:print("请求成功!")
else:print("请求失败,状态码:", response.status_code)
四、BeautifulSoup库
解析复杂HTML/XML文档,将网页转化为可操作的树形结构
4.1 安装与导入
安装
pip install beautifulsoup4
pip install lxml
导入
from bs4 import BeautifulSoup
4.2 核心功能
文档对象创建
from bs4 import BeautifulSoup
# 通过字符串或requests响应创建对象[2,5](@ref)
soup = BeautifulSoup(HTML文档, 'lxml')
元素定位三剑客
| 方法 | 功能描述 | 代码示例 |
|---|---|---|
| find() | 获取第一个匹配元素 | soup.find(‘div’, id=‘header’) |
| find_all() | 返回所有匹配元素的列表 | soup.find_all(‘a’, class_=‘link’) |
| select() | CSS选择器精准定位 | soup.select(‘div.content > p’) |
| select_one() | 返回第一个匹配的 CSS 选择器元素 | soup.select_one(‘.title’) |
| find_parent() | 查找当前标签的父级标签 | tag.find_parent(‘div’) |
| find_next() | 查找后续第一个符合条件的标签 | tag.find_next(‘p’) |
数据提取技巧
- 文本内容:
tag.text(包含子标签文本)或tag.get_text() - 属性值获取:
tag['href']或tag.get('src')(避免KeyError) - 嵌套处理:通过
.parent/.children遍历文档树
4.3 动态网页数据抓取
import requests
from bs4 import BeautifulSoupurl = 'https://www.aizlian.xyz'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')cates = []
for cate in soup.select('.col-4'):cates.append(cate.a['href'])print(cates)
五、数据存储
5.1 CSV存储最佳实践
安装
pip install csv
使用DictWriter避免列错位:
import csvdata = [{'name': '商品A', 'price': 299},{'name': '商品B', 'price': 599}
]with open('products.csv', 'w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=['name', 'price'])writer.writeheader()writer.writerows(data)
5.2 MySQL数据库操作
安装
pip install pymysql
连接池管理:
import pymysql
from dbutils.pooled_db import PooledDBpool = PooledDB(creator=pymysql,host='localhost',user='root',password='pass123',database='crawler_db',maxconnections=5
)# 使用连接
conn = pool.connection()
cursor = conn.cursor()
cursor.execute("INSERT INTO movies VALUES (%s, %s)", ("泰坦尼克号", 9.4))
conn.commit()
六、实战
实战项目:豆瓣电影Top250
完整代码(含异常处理):
import requests
from bs4 import BeautifulSoup
import csv
import timedef get_movie_info(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Accept-Language': 'zh-CN,zh;q=0.9'}try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status() # 自动处理HTTP错误soup = BeautifulSoup(response.text, 'lxml')movies = []for item in soup.find_all('div', class_='item'):# 使用CSS选择器精确提取title = item.select_one('.title').text.strip()rating = item.select_one('.rating_num').text.strip()link = item.find('a')['href']movies.append([title, rating, link])return moviesexcept Exception as e:print(f"抓取失败:{e}")return []def main():base_url = "https://movie.douban.com/top250?start={}"with open('douban_top250.csv', 'w', newline='', encoding='utf-8-sig') as f:writer = csv.writer(f)writer.writerow(['排名', '电影名称', '评分', '详情链接'])for page in range(0, 250, 25):url = base_url.format(page)movies = get_movie_info(url)for idx, movie in enumerate(movies, start=page+1):writer.writerow([idx] + movie)print(f"已抓取第{page//25+1}页数据")time.sleep(2)if __name__ == '__main__':main()
执行完程序之后我们可以看到csv文件中已经有内容了。

相关文章:
初学者快速入门Python爬虫 (无废话版)
全篇大概 5000 字(含代码),建议阅读时间 40min 一、Python爬虫简介 1.1 什么是网络爬虫? 定义: 网络爬虫(Web Crawler)是自动浏览互联网并采集数据的程序,就像电子蜘蛛在网页间"爬行"。 分类&…...
【git】ssh配置提交 gitcode-ssh提交
【git】ssh配置提交 gitcode-ssh提交 之前一直用的是gitee和阿里云的仓库,前两天想在gitcode上面备份一下我的打洞代码和一些资料 就直接使用http克隆了下来 。 在提交的时候他一直会让我输入账号和密码,但是我之前根本没有设置过这个,根本没…...
【二】JavaScript能力提升---this对象
目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章,对于this的对象可以有一个很大的提升! this的理解 对于this指针,可以先记住以下两点: this永远指向一个…...
C++————类和对象(一)
1.类定义格式 在C中,类(class)是封装数据和操作这些数据的函数的构造。类的定义包含成员变量和成员函数。 类的基本定义格式如下: class ClassName {// 访问修饰符public:// 公有成员DataType memberVariable; // 成员变量voi…...
SpringBoot参数校验:@Valid 与 @Validated 详解
SpringBoot参数校验:Valid 与 Validated 详解 一、案例(参数校验的必要性) 传统方式(无注解)的缺点: // 需要手动校验每个字段,代码冗余且易出错 public String register(User user) {// 手动…...
<论文>MiniCPM:利用可扩展训练策略揭示小型语言模型的潜力
一、摘要 本文跟大家一起阅读的是清华大学的论文《MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies》 摘要: 对具有高达万亿参数的大型语言模型(LLMs)的兴趣日益增长,但同时也引发…...
SpringCloud系列教程(十三):Sentinel流量控制
SpringCloud中的注册、发现、网关、服务调用都已经完成了,现在就剩下最后一部分,就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好,把平时常用的功能都集成进来了,而且非常简单高效。我们下一步就完成最后一块拼图Se…...
Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp
题目链接 题目大意 平面上给定两个点集,判定两个点集分别形成的凸多边形能否通过旋转、平移重合。 点集大小 ≤ \leq ≤ 1 0 5 10^{5} 105,坐标范围 [0, 1 0 8 10^{8} 108 ]. 思路 题意很明显,先求出凸包再判断两凸包是否同构。这里用…...
论文阅读方法
文章目录 步骤一:对论文进行自我判断阅读题目和关键词。阅读摘要阅读总结要点 步骤二:阅读文章阅读图表和图表的注释阅读引言阅读实验部分阅读结果和作者对结果的讨论(创新点)要点 步骤三:精度论文回答问题1回答问题2回…...
ArcGIS操作:15 计算点的经纬度,并添加到属性表
注意:需要转化为地理坐标系 1、打开属性表,添加字段 2、计算字段(以计算纬度为例 !Shape!.centroid.Y ) 3、效果...
蓝桥杯历年真题题解
1.轨道炮(数学模拟) #include <iostream> #include <map> using namespace std; const int N1010; int x[N],y[N],v[N]; char d[N]; int main() {int n;int ans-100;cin>>n;for(int i1;i<n;i)cin>>x[i]>>y[i]>>v…...
IP-地址
主机号(Host ID) IP地址简介:IP地址是每台接入互联网的设备所拥有的唯一标识符,类似于电话号码的分层结构,由网络号和主机号组成。为了便于记忆,32位二进制的IP地址通常以点分十进制表示。 网络号…...
MoonSharp 文档一
目录 1.Getting Started 步骤1:在 IDE 中引入 MoonSharp 步骤2:引入命名空间 步骤3:调用脚本 步骤4:运行代码 2.Keeping a Script around 步骤1:复现前教程所有操作 步骤2:改为创建Script对象 步骤…...
2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h> #include <math.h>int search( int n );int…...
三星首款三折叠手机被曝外屏6.49英寸:折叠屏领域的新突破
在智能手机的发展历程中,折叠屏手机的出现无疑是一次具有里程碑意义的创新。它打破了传统手机屏幕尺寸的限制,为用户带来了更加多元和便捷的使用体验。而三星,作为手机行业的巨头,一直以来都在折叠屏技术领域积极探索和创新。近日,三星首款三折叠手机的诸多细节被曝光,其…...
大白话Vue Router 中路由守卫(全局守卫、路由独享守卫、组件内守卫)的种类及应用场景
大白话Vue Router 中路由守卫(全局守卫、路由独享守卫、组件内守卫)的种类及应用场景 答题思路 明确要介绍的内容:需要分别介绍 Vue Router 中全局守卫、路由独享守卫和组件内守卫这三种路由守卫的种类,详细说明它们的定义、使用…...
CUDA编程之OpenCV与CUDA结合使用
OpenCV与CUDA的结合使用可显著提升图像处理性能。 一、版本匹配与环境配置 CUDA与OpenCV版本兼容性 OpenCV各版本对CUDA的支持存在差异,例如OpenCV 4.5.4需搭配CUDA 10.02,而较新的OpenCV 4.8.0需使用更高版本CUDA。 需注意部分模块(…...
Educational Codeforces Round 7 F. The Sum of the k-th Powers 多项式、拉格朗日插值
题目链接 题目大意 求 ( ∑ i 1 n i k ) (\sum_{i1}^{n} i^k) (∑i1nik) m o d ( 1 0 9 7 ) mod(10^97) mod(1097) . 数据范围 : 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109 , 0 ≤ k ≤ 1 0 6 0 \leq k \leq 10^6 0≤k≤106 . 思路 令 f ( n ) ∑ …...
LINUX网络基础 [五] - HTTP协议
目录 HTTP协议 预备知识 认识 URL 认识 urlencode 和 urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式 HTTP的方法 HTTP的状态码 编辑HTTP常见Header HTTP实现代码 HttpServer.hpp HttpServer.cpp Socket.hpp log.hpp Makefile Web根目录 H…...
WPS Word中英文混杂空格和行间距不一致调整方案
文章目录 问题1:在两端对齐的情况下,如何删除参考文献(英文)的空格问题2:中英文混杂行间距不一致问题问题3:设置中文为固定字体,设置西文为固定字体参考 问题1:在两端对齐的情况下&a…...
C++ Qt创建计时器
在Qt中,可以使用QTimer来创建一个简单的计时器。QTimer是一个用于定时触发事件的类,通常与QObject的子类(如QWidget)一起使用。以下是一个完整的示例,展示如何使用Qt创建一个带有计时器的窗口应用程序。 示例ÿ…...
CSDN博客:Markdown编辑语法教程总结教程(中)
❤个人主页:折枝寄北的博客 Markdown编辑语法教程总结 前言1. 列表1.1 无序列表1.2 有序列表1.3 待办事项列表1.4 自定义列表 2. 图片2.1 直接插入图片2.2 插入带尺寸的图片2.3 插入宽度确定,高度等比例的图片2.4 插入高度确定宽度等比例的图片2.5 插入居…...
nlp培训重点-5
1. LoRA微调 loader: # -*- coding: utf-8 -*-import json import re import os import torch import numpy as np from torch.utils.data import Dataset, DataLoader from transformers import BertTokenizer """ 数据加载 """cl…...
电子学会—2024年月6青少年软件编程(图形化)四级等级考试真题——水仙花数
水仙花数 如果一个三位数等于它各个数位上的数字的立方和,那么这个数就是水仙花数,例如:153 111 555 333,153就是一个水仙花数。 1.准备工作 (1)保留默认角色小猫; (2)白色背景。 2.功能实现 (1)使用循环遍历所有三位数,把所…...
若依分页的逻辑分析
看了一些网上的感觉都是 听君一席话, 如听一席话. 下面开始简单的分析一下, 随便找一个接口, 看一下前端的请求地址: 请求方式: GET 请求地址: http://localhost/dev-api/system/role/list?pageNum1&pageSize10 后端接口: PreAuthorize("ss.hasPermi(system:role:li…...
JetBrains学生申请
目录 JetBrains学生免费授权申请 IDEA安装与使用 第一个JAVA代码 1.利用txt文件和cmd命令运行 2.使用IDEA新建项目 JetBrains学生免费授权申请 本教程采用学生校园邮箱申请,所以要先去自己的学校申请校园邮箱。 进入JetBrains官网 点击立即申请,然…...
【算法方法总结·五】链表操作的一些技巧和注意事项
【算法方法总结五】链表操作的一些技巧和注意事项 【算法方法总结一】二分法的一些技巧和注意事项【算法方法总结二】双指针的一些技巧和注意事项【算法方法总结三】滑动窗口的一些技巧和注意事项【算法方法总结四】字符串操作的一些技巧和注意事项【算法方法总结五】链表操作…...
langchain系列(终)- LangGraph 多智能体详解
目录 一、导读 二、概念原理 1、智能体 2、多智能体 3、智能体弊端 4、多智能体优点 5、多智能体架构 6、交接(Handoffs) 7、架构说明 (1)网络 (2)监督者 (3)监督者&…...
侯捷 C++ 课程学习笔记:深入理解智能指针
文章目录 每日一句正能量一、引言二、智能指针的核心概念(一)std::unique_ptr(二)std::shared_ptr(三)std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论ÿ…...
访问不了 https://raw.githubusercontent.com 怎么办?
修改 Hosts 文件(推荐) 原理:通过手动指定域名对应的 IP 地址,绕过 DNS 污染。 步骤: 1、访问 IPAddress.com,搜索 raw.githubusercontent.com,获取当前最新的 IPv4 地址(例如 1…...
