Python 爬虫开发

文章目录

  • [1. 常用库安装](#1. 常用库安装)
  • [2. 基础爬虫开发](#2. 基础爬虫开发)
    • [2.1. 使用 requests 获取网页内容](#2.1. 使用 requests 获取网页内容)
    • [2.2. 使用 BeautifulSoup 解析 HTML](#2.2. 使用 BeautifulSoup 解析 HTML)
    • [2.3. 处理登录与会话](#2.3. 处理登录与会话)
  • [3. 进阶爬虫开发](#3. 进阶爬虫开发)
    • [3.1. 处理动态加载内容(Selenium)](#3.1. 处理动态加载内容(Selenium))
    • [3.2. 使用Scrapy框架](#3.2. 使用Scrapy框架)
    • [3.3. 分布式爬虫(Scrapy-Redis)](#3.3. 分布式爬虫(Scrapy-Redis))
  • [4. 爬虫优化与反反爬策略](#4. 爬虫优化与反反爬策略)
    • [4.1. 常见反爬机制及应对](#4.1. 常见反爬机制及应对)
    • [4.2. 代理IP使用示例](#4.2. 代理IP使用示例)
    • [4.3. 随机延迟与请求头](#4.3. 随机延迟与请求头)

BeautifulSoup 官方文档
https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/
https://cloud.tencent.com/developer/article/1193258
https://blog.csdn.net/zcs2312852665/article/details/144804553

参考:

https://blog.51cto.com/haiyongblog/13806452

1. 常用库安装

bash 复制代码
pip install requests beautifulsoup4 scrapy selenium pandas

2. 基础爬虫开发

2.1. 使用 requests 获取网页内容

python 复制代码
import requests

url = 'https://top.baidu.com/board?tab=realtime'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

response = requests.get(url, headers=headers)
print(response.status_code)     # 200表示成功
print(response.text[:500])      # 打印前500个字符

2.2. 使用 BeautifulSoup 解析 HTML

python 复制代码
from bs4 import BeautifulSoup

html_doc = """
            <html><head><title>测试页面</title></head>
            <body>
            <p class="title"><b>示例网站</b></p>
            <p class="story">这是一个示例页面
            <a href="http://example.com/1" class="link" id="link1">链接1</a>
            <a href="http://example.com/2" class="link" id="link2">链接2</a>
            </p>
            """

soup = BeautifulSoup(html_doc, 'html.parser')

# 获取标题
print(soup.title.string)

# 获取所有链接
for link in soup.find_all('a'):
    print(link.get('href'), link.string)

# 通过CSS类查找
print(soup.find('p', class_='title').text)

2.3. 处理登录与会话

python 复制代码
import requests

login_url = 'https://example.com/login'
target_url = 'https://example.com/dashboard'

session = requests.Session()

# 登录请求
login_data = {
    'username': 'your_username',
    'password': 'your_password'
}

response = session.post(login_url, data=login_data)

if response.status_code == 200:
    # 访问需要登录的页面
    dashboard = session.get(target_url)
    print(dashboard.text)
else:
    print('登录失败')

3. 进阶爬虫开发

3.1. 处理动态加载内容(Selenium)

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 设置无头浏览器
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无界面模式
options.add_argument('--disable-gpu')

# 自动下载chromedriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

url = 'https://dynamic-website.com'
driver.get(url)

# 等待元素加载(隐式等待)
driver.implicitly_wait(10)

# 获取动态内容
dynamic_content = driver.find_element(By.CLASS_NAME, 'dynamic-content')
print(dynamic_content.text)

driver.quit()

3.2. 使用Scrapy框架

python 复制代码
# 创建Scrapy项目
# scrapy startproject example_project
# cd example_project
# scrapy genspider example example.com

# 示例spider代码
import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/']

    def parse(self, response):
        # 提取数据
        title = response.css('title::text').get()
        links = response.css('a::attr(href)').getall()
        
        yield {
            'title': title,
            'links': links
        }

# 运行爬虫
# scrapy crawl example -o output.json

3.3. 分布式爬虫(Scrapy-Redis)

python 复制代码
# settings.py配置
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://localhost:6379'

# spider代码
from scrapy_redis.spiders import RedisSpider

class MyDistributedSpider(RedisSpider):
    name = 'distributed_spider'
    redis_key = 'spider:start_urls'

    def parse(self, response):
        # 解析逻辑
        pass

4. 爬虫优化与反反爬策略

4.1. 常见反爬机制及应对

User-Agent检测 :随机切换User-Agent

IP限制:使用代理IP池

验证码:OCR识别或打码平台

行为分析:模拟人类操作间隔

JavaScript渲染:使用Selenium或Pyppeteer

4.2. 代理IP使用示例

python 复制代码
import requests

proxies = {
    'http': 'http://proxy_ip:port',
    'https': 'https://proxy_ip:port'
}

try:
    response = requests.get('https://example.com', proxies=proxies, timeout=5)
    print(response.text)
except Exception as e:
    print(f'请求失败: {e}')

4.3. 随机延迟与请求头

python 复制代码
import random
import time
import requests
from fake_useragent import UserAgent

ua = UserAgent()

def random_delay():
    time.sleep(random.uniform(0.5, 2.5))

def get_with_random_headers(url):
    headers = {
        'User-Agent': ua.random,
        'Accept-Language': 'en-US,en;q=0.5',
        'Referer': 'https://www.google.com/'
    }
    random_delay()
    return requests.get(url, headers=headers)
相关推荐
心软且酷丶30 分钟前
leetcode:263. 丑数(python3解法,数学相关算法题)
python·算法·leetcode
Cyrus_柯41 分钟前
C++(面向对象编程——关键字)
开发语言·c++·算法·面向对象
大龄Python青年44 分钟前
C语言 函数怎样通过数组来返回多个值
c语言·开发语言
LQYYDSY1 小时前
【C语言极简自学笔记】重讲运算符
c语言·开发语言·笔记
2013编程爱好者1 小时前
C++二分查找
开发语言·c++·算法·二分查找
电商数据girl1 小时前
【经验分享】浅谈京东商品SKU接口的技术实现原理
java·开发语言·前端·数据库·经验分享·eclipse·json
烛阴2 小时前
提升Web爬虫效率的秘密武器:Puppeteer选择器全攻略
前端·javascript·爬虫
十五年专注C++开发2 小时前
QSimpleUpdater:解锁 Qt 应用自动更新的全新姿势
开发语言·c++·qt
小猫咪怎么会有坏心思呢2 小时前
华为OD机考-货币单位换算-字符串(JAVA 2025B卷)
java·开发语言·华为od