【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平台

相关推荐
爬山算法2 分钟前
Redis(162)如何使用Redis实现消息队列?
数据库·redis·缓存
u***32437 分钟前
【Redis】centos7 systemctl 启动 Redis 失败
数据库·redis·缓存
煎蛋学姐13 分钟前
SSM社区生鲜电商平台dq96z(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·ssm 框架·社区生鲜电商·商品信息管理
杨云龙UP15 分钟前
从0搭建Oracle ODA NFS异地备份:从YUM源到RMAN定时任务的全流程
linux·运维·数据库·oracle
倔强的石头_23 分钟前
从 Oracle 到 KingbaseES:破解迁移痛点,解锁信创时代数据库新可能
数据库
踢足球092935 分钟前
Redis的典型应用
数据库·redis·缓存
hadage2331 小时前
--- redis 常见问题 ---
数据库·redis·mybatis
O***P5711 小时前
redis批量删除namespace下的数据
数据库·redis·缓存
5***26221 小时前
SQL Server导出和导入可选的数据库表和数据,以sql脚本形式
数据库·sql
ID_180079054731 小时前
基于 Python 的 Cdiscount 商品详情 API 调用与 JSON 核心字段解析(含多规格 SKU 提取)
开发语言·python·json