初学者快速入门Python爬虫 (无废话版)

news2025/3/10 11:14:01

全篇大概 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内置的urllibrequesets设计更简洁直观,例如发送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 requests

response = 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 BeautifulSoup

url = '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 csv

data = [
    {'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 PooledDB

pool = 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 time

def 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 movies
        
    except 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文件中已经有内容了。
请添加图片描述

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

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

相关文章

【git】ssh配置提交 gitcode-ssh提交

【git】ssh配置提交 gitcode-ssh提交 之前一直用的是gitee和阿里云的仓库&#xff0c;前两天想在gitcode上面备份一下我的打洞代码和一些资料 就直接使用http克隆了下来 。 在提交的时候他一直会让我输入账号和密码&#xff0c;但是我之前根本没有设置过这个&#xff0c;根本没…

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…

<论文>MiniCPM:利用可扩展训练策略揭示小型语言模型的潜力

一、摘要 本文跟大家一起阅读的是清华大学的论文《MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies》 摘要&#xff1a; 对具有高达万亿参数的大型语言模型&#xff08;LLMs&#xff09;的兴趣日益增长&#xff0c;但同时也引发…

SpringCloud系列教程(十三):Sentinel流量控制

SpringCloud中的注册、发现、网关、服务调用都已经完成了&#xff0c;现在就剩下最后一部分&#xff0c;就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好&#xff0c;把平时常用的功能都集成进来了&#xff0c;而且非常简单高效。我们下一步就完成最后一块拼图Se…

ArcGIS操作:15 计算点的经纬度,并添加到属性表

注意&#xff1a;需要转化为地理坐标系 1、打开属性表&#xff0c;添加字段 2、计算字段&#xff08;以计算纬度为例 !Shape!.centroid.Y ) 3、效果

蓝桥杯历年真题题解

1.轨道炮&#xff08;数学模拟&#xff09; #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-地址

主机号&#xff08;Host ID&#xff09; IP地址简介&#xff1a;IP地址是每台接入互联网的设备所拥有的唯一标识符&#xff0c;类似于电话号码的分层结构&#xff0c;由网络号和主机号组成。为了便于记忆&#xff0c;32位二进制的IP地址通常以点分十进制表示。 网络号&#xf…

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…

三星首款三折叠手机被曝外屏6.49英寸:折叠屏领域的新突破

在智能手机的发展历程中,折叠屏手机的出现无疑是一次具有里程碑意义的创新。它打破了传统手机屏幕尺寸的限制,为用户带来了更加多元和便捷的使用体验。而三星,作为手机行业的巨头,一直以来都在折叠屏技术领域积极探索和创新。近日,三星首款三折叠手机的诸多细节被曝光,其…

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&#xff1a;在两端对齐的情况下&#xff0c;如何删除参考文献&#xff08;英文&#xff09;的空格问题2&#xff1a;中英文混杂行间距不一致问题问题3&#xff1a;设置中文为固定字体&#xff0c;设置西文为固定字体参考 问题1&#xff1a;在两端对齐的情况下&a…

CSDN博客:Markdown编辑语法教程总结教程(中)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. 列表1.1 无序列表1.2 有序列表1.3 待办事项列表1.4 自定义列表 2. 图片2.1 直接插入图片2.2 插入带尺寸的图片2.3 插入宽度确定&#xff0c;高度等比例的图片2.4 插入高度确定宽度等比例的图片2.5 插入居…

电子学会—2024年月6青少年软件编程(图形化)四级等级考试真题——水仙花数

水仙花数 如果一个三位数等于它各个数位上的数字的立方和&#xff0c;那么这个数就是水仙花数&#xff0c;例如:153 111 555 333&#xff0c;153就是一个水仙花数。 1.准备工作 (1)保留默认角色小猫; (2)白色背景。 2.功能实现 (1)使用循环遍历所有三位数&#xff0c;把所…

JetBrains学生申请

目录 JetBrains学生免费授权申请 IDEA安装与使用 第一个JAVA代码 1.利用txt文件和cmd命令运行 2.使用IDEA新建项目 JetBrains学生免费授权申请 本教程采用学生校园邮箱申请&#xff0c;所以要先去自己的学校申请校园邮箱。 进入JetBrains官网 点击立即申请&#xff0c;然…

langchain系列(终)- LangGraph 多智能体详解

目录 一、导读 二、概念原理 1、智能体 2、多智能体 3、智能体弊端 4、多智能体优点 5、多智能体架构 6、交接&#xff08;Handoffs&#xff09; 7、架构说明 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;监督者 &#xff08;3&#xff09;监督者&…

侯捷 C++ 课程学习笔记:深入理解智能指针

文章目录 每日一句正能量一、引言二、智能指针的核心概念&#xff08;一&#xff09;std::unique_ptr&#xff08;二&#xff09;std::shared_ptr&#xff08;三&#xff09;std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论&#xff…

访问不了 https://raw.githubusercontent.com 怎么办?

修改 Hosts 文件&#xff08;推荐&#xff09;​ 原理&#xff1a;通过手动指定域名对应的 IP 地址&#xff0c;绕过 DNS 污染。 步骤&#xff1a; 1、访问 IPAddress.com&#xff0c;搜索 raw.githubusercontent.com&#xff0c;获取当前最新的 IPv4 地址&#xff08;例如 1…

大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)

1. datasets 库核心方法 1.1. 列出数据集 使用 d atasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets# 列出所有数据集 all_datasets list_datasets()print(all_datasets)1.2. 加载数据集 你可以通过 l…

子数组、子串系列(典型算法思想)—— OJ例题算法解析思路

一、53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; class Solution { public:int maxSubArray(vector<int>& nums) {// 1. 创建 dp 表// dp[i] 表示以第 i 个元素结尾的子数组的最大和int n nums.size();vector<int> dp(n…

Windows编程----进程的当前目录

进程的当前目录 Windows Api中有大量的函数在调用的时候&#xff0c;需要传递路径。比如创建文件&#xff0c;创建目录&#xff0c;删除目录&#xff0c;删除文件等等。拿创建文件的CreateFile函数做比喻&#xff0c;如果我们要创建的文件路径不是全路径&#xff0c;那么wind…