【Python实战案例】爬虫项目实例(附赠源码)

文章目录

声明

请您遵守网站的robots文件规定,本文目的只是做学习交流使用,包括多个模块,例如数据存储、日志记录、错误处理、多线程或异步请求

安装必要的库

pip install requests beautifulsoup4 sqlite3

项目结构

创建以下文件和目录结构

my_crawler/

├── config.py

├── crawler.py

├── db.py

├── logger.py

└── main.py

技术细节

配置文件 config.py

配置文件用于存储常量和配置项:

python 复制代码
BASE_URL = 'https://example.com'
ARTICLES_URL = f'{BASE_URL}/articles'
DATABASE_NAME = 'articles.db'
LOG_FILE = 'crawler.log'

1.数据库操作 db.py

用于创建数据库表和插入数据:

python 复制代码
#db.py

import sqlite3
from config import DATABASE_NAME

def init_db():
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS articles (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            url TEXT NOT NULL
        )
    ''')
    conn.commit()
    conn.close()

def insert_article(title, url):
    conn = sqlite3.connect(DATABASE_NAME)
    cursor = conn.cursor()
    cursor.execute('INSERT INTO articles (title, url) VALUES (?, ?)', (title, url))
    conn.commit()
    conn.close()

2.日志记录 logger.py

用于配置日志记录:

python 复制代码
logger.py

import logging
from config import LOG_FILE

def setup_logger():
    logging.basicConfig(
        filename=LOG_FILE,
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s'
    )

logger = setup_logger()

3.爬虫逻辑 crawler.py

包含爬虫的主要逻辑:

python 复制代码
 crawler.py

import requests
from bs4 import BeautifulSoup
from config import ARTICLES_URL
from db import insert_article
from logger import logger

def fetch_page(url):
    """获取网页内容"""
    try:
        response = requests.get(url)
        response.raise_for_status()  # 检查请求是否成功
        return response.text
    except requests.RequestException as e:
        logger.error(f"请求错误: {e}")
        return None

def parse_html(html):
    """解析HTML,提取文章标题和URL"""
    soup = BeautifulSoup(html, 'html.parser')
    articles = []
    for article in soup.find_all('div', class_='article'):
        title = article.find('h1', class_='article-title').get_text(strip=True)
        url = article.find('a')['href']
        articles.append((title, url))
    return articles

def crawl_articles():
    """抓取并保存文章"""
    html = fetch_page(ARTICLES_URL)
    if html:
        articles = parse_html(html)
        for title, url in articles:
            insert_article(title, url)
            logger.info(f"已保存文章: {title} - {url}")
  1. 主程序 main.py
    启动爬虫的主程序:
python 复制代码
 main.py

from crawler import crawl_articles
from db import init_db
from logger import logger

def main():
    logger.info("开始爬虫任务")
    init_db()
    crawl_articles()
    logger.info("爬虫任务完成")

if __name__ == '__main__':
    main()

小结

请您遵守网站的robots文件规定,本文目的只是做学习交流使用,感谢csdn平台

相关推荐
i***68326 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
z***751522 分钟前
【SQL技术】不同数据库引擎 SQL 优化方案剖析
数据库·sql
麦兜*25 分钟前
Redis内存消耗异常飙升?深入排查与Big Key/Hot Key的根治方案
jvm·数据库·spring boot·redis·spring·缓存
成为你的宁宁1 小时前
【Redis 从入门到实战:详细讲解 Redis 安装配置、RDB/AOF 数据持久化方案、一主两从同步部署,深入剖析哨兵模式工作原理与哨兵模式高可用全攻略】
数据库·redis·缓存
麦麦大数据1 小时前
F047 vue3+flask微博舆情推荐可视化问答系统
python·flask·知识图谱·neo4j·推荐算法·舆情分析·舆情监测
云和数据.ChenGuang1 小时前
r=re.search(r‘data-original=“(.*?)“‘, line)指令解析
数据库·mysql·r语言
MediaTea1 小时前
Python 第三方库:Flask(轻量级 Web 框架)
开发语言·前端·后端·python·flask
java干货1 小时前
Spring Boot 为什么“抛弃”了 spring.factories?
spring boot·python·spring
v***5651 小时前
使用bitnamiredis-sentinel部署Redis 哨兵模式
数据库·redis·sentinel