当前位置: 首页 > article >正文

初学者快速入门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 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.kler.cn/a/582987.html

相关文章:

  • 从零开始的python学习(五)P75+P76+P77+P78+P79+P80
  • Linux ALSA 驱动核心知识点解析
  • OpenHarmony-分布式硬件关键技术
  • redis增加ip白名单
  • 【day11】智慧导览:AR内容加载性能指标
  • 电力行业中 对输电和配电的所有数据实现实时监测与控制
  • 四种 API 架构风格及对比
  • 监控推特信息并发送到微信
  • Qt常用控件之标签页控件QTabWidget
  • CTFHub-上传文件
  • HPC超算系列4——官方指南文档
  • 计算机网络:Socket编程 Tcp协议 第二弹
  • Gateway:网关路由与登录鉴权
  • PHP 在 if 判断时由于运算符优先级导致 false 的问题
  • 《YOLOE: Real-Time Seeing Anything》论文速览翻译,支持文本提示,视觉提示等开放世界检测算法!
  • 深入浅出 Elasticsearch 的 dense_vector 字段类型
  • 数据结构完全指南:C语言实现与核心原理剖析
  • 每日学习之一万个为什么
  • java中小型公司面试预习资料(四):微服务架构
  • 网络编程——http