初学者快速入门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内置的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 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文件中已经有内容了。
请添加图片描述

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

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

相关文章

Day05 实例:正向反向连接内外网环境防火墙出入站

一、正反向连接 0、先将防火墙关闭 Linux&#xff1a; sudo systemctl stop firewalld Windows&#xff1a;netsh advfirewall set allprofiles state off 1、正向连接 1.1 Linux连接Windows 00x1 开启两台服务器 并且给Windows拖入nc.exe 00x2 Windows绑定自己5566端…

电力系统中各参数的详细解释【智能电表】

一、核心电力参数 电压 (Voltage) 单位&#xff1a;伏特&#xff08;V&#xff09; 含义&#xff1a;电势差&#xff0c;推动电流流动的动力 类型&#xff1a;线电压&#xff08;三相系统&#xff09;、相电压&#xff0c;如220V&#xff08;家用&#xff09;或380V&#xff…

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules

声明在 src/core/ngx_module.h ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);实现在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modul…

Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)

目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) &#xff08;0&#xff09;Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 &#xff08;1&#xff09;首先找到已建Vue3工程的目录。 &#xff08;2&#xff09;无需再下载依赖包&#xff0c;直接执行npm ru…

使用websocket,注入依赖service的bean为null

问题&#xff1a;依赖注入失败&#xff0c;service获取不到&#xff0c;提示null 这是参考代码 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品&#xff0c;以前都是扫二维码开箱&#xff0c;有些图书馆升级了使用指纹识别。 “是否新方法比以前好&#xff1f;”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

作者&#xff1a;Hello,Panda 各位FPGAer周末愉快&#xff0c;今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。 一、方案背景 先说方案的应用背景&#xff1a;众所周知&#xff0c;较为上层的如基于AI的机器视觉应用&#xff0c;大多基于高端的专用SoC、AI专…

Redis|Springboot集成Redis

文章目录 总体概述本地Java连接Redis常见问题集成Jedis集成lettuce集成RedisTemplate——推荐使用连接单机连接集群 总体概述 jedis-lettuce-RedisTemplate三者的联系 jedis第一代lettuce承上启下redistemplate着重使用 本地Java连接Redis常见问题 bind配置请注释掉保护模式…

机器学习(六)

一&#xff0c;决策树&#xff1a; 简介&#xff1a; 决策树是一种通过构建类似树状的结构&#xff08;颠倒的树&#xff09;&#xff0c;从根节点开始逐步对数据进行划分&#xff0c;最终在叶子节点做出预测结果的模型。 结构组成&#xff1a; 根节点&#xff1a;初始的数据集…

恢复IDEA的Load Maven Changes按钮

写代码的时候不知道点到什么东西了&#xff0c;pom文件上的这个弹窗就是不出来了&#xff0c;重启IDEA&#xff0c;reset windos都没用&#xff0c;网上搜也没收到解决方案 然后开打开其他项目窗口时&#xff0c;看到那个的功能名叫 Hide This Notification 于是跑到Setting里…

怎么使用Sam Helper修改手机屏幕分辨率,使得游戏视野变广?

1.准备Shizuku 和Sam Helper软件 2.打开设置&#xff0c;找到关于本机&#xff0c;连续点击版本号五次打开开发者选项 3.找到开发者选项&#xff0c;打开USB调试和无线调试 4.返回桌面&#xff0c;我们接着打开shizuku,点击配对&#xff0c;这里打开开发者选项&#xff0c;找…

【招聘精英】

我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…

大模型信息整理

1. Benchmarks Reasoning, conversation, Q&A benchmarks HellaSwagBIG-Bench HardSQuADIFEvalMuSRMMLU-PROMT-BenchDomain-specific benchmarks GPQAMedQAPubMedQAMath benchmarks GSM8KMATHMathEvalSecurity-related benchmarks PyRITPurple Llama CyberSecEval2. 国内外…

Redis-限流方案

在实际业务中&#xff0c;可能会遇到瞬时流量剧增的情况&#xff0c;大量的请求可能会导致服务器过载和宕机。为了保护系统自身和上下游服务&#xff0c;需要采用限流的方式&#xff0c;拒绝部分请求。 限流就是对请求的频率进行控制&#xff0c;迅速拒绝超过请求阈值的请求。 …

无感方波开环强拖总结

一、强拖阶段的核心原理与设计要点 开环换相逻辑 固定频率斜坡&#xff1a;以预设斜率逐步提升换相频率&#xff08;如0.5-5Hz/ms&#xff09;&#xff0c;强制电机跟随磁场旋转。电压-频率协调控制&#xff1a;初始阶段施加高电压&#xff08;80%-100%额定&#xff09;克服静摩…

Java虚拟机之垃圾收集(一)

目录 一、如何判定对象“生死”&#xff1f; 1. 引用计数算法&#xff08;理论参考&#xff09; 2. 可达性分析算法&#xff08;JVM 实际使用&#xff09; 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收&#xff1f; 1. 分代回收策略 2. 手动触发…

代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合

77. 组合 77. 组合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …

#UVM# 关于field automation机制中的标志位及if的使用

通过前面文章的复习,我们知道了 uvm_field 机制带来的好处,确实方便了我们很多代码的coding 时间,但是会不会有一种情况呢? 比如,我们不想将实例中的某一些成员进行打包、复制、比较操作,怎么办呢? 如果只执行 比较但不进行打包操作呢?是不是很复杂呢 ? 一 标志位…

RK3588 安装ffmpeg6.1.2

在安装 ffmpeg 在 RK3588 开发板上时,你需要确保你的开发环境(例如 Ubuntu、Debian 或其他 Linux 发行版)已经设置好了交叉编译工具链,以便能够针对 RK3588 架构编译软件。以下是一些步骤和指导,帮助你安装 FFmpeg: 1. 安装依赖项 首先,确保你的系统上安装了所有必要的…