如何使用python爬取当当网所有数据分析书籍信息

发布时间:2022-01-13 15:23:59 作者:小新
来源:亿速云 阅读:987
# 如何使用Python爬取当当网所有数据分析书籍信息

## 目录
1. [项目概述](#项目概述)
2. [技术准备](#技术准备)
3. [网页结构分析](#网页结构分析)
4. [爬虫实现步骤](#爬虫实现步骤)
5. [数据存储方案](#数据存储方案)
6. [反爬机制应对](#反爬机制应对)
7. [完整代码实现](#完整代码实现)
8. [数据分析应用](#数据分析应用)
9. [法律与伦理考量](#法律与伦理考量)
10. [总结与扩展](#总结与扩展)

---

## 项目概述
在数据驱动决策的时代,获取图书市场信息对从业者和研究者具有重要意义。本文将详细介绍如何使用Python爬虫技术,系统性地抓取当当网(www.dangdang.com)上所有与"数据分析"相关的图书信息,包括但不限于:
- 书名、作者、出版社
- 价格信息(原价/折扣价)
- 出版日期、ISBN
- 用户评分、评论数量
- 商品详情页的完整描述

---

## 技术准备
### 必需工具
```python
# 核心库
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

# 可选高级库
from selenium import webdriver  # 处理动态加载
import pymongo  # MongoDB存储

环境配置

  1. Python 3.8+
  2. 安装依赖库:pip install requests beautifulsoup4 pandas selenium pymongo
  3. ChromeDriver配置(如需使用Selenium)

网页结构分析

搜索页面特征

当当网搜索URL示例:

http://search.dangdang.com/?key=数据分析&act=input&page_index=1

关键观察: 1. 分页参数:page_index 2. 每页显示60条结果 3. 数据加载方式:部分静态HTML,部分动态AJAX

页面元素定位

使用Chrome开发者工具(F12)分析: - 书籍列表容器:ul.bigimg > li - 书名:a.pic的title属性 - 价格:span.search_now_price - 评论数:span.search_comment_num


爬虫实现步骤

1. 基础请求函数

def get_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        response.encoding = 'utf-8'
        return response.text
    except Exception as e:
        print(f"请求失败: {e}")
        return None

2. 解析列表页

def parse_list_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    books = []
    for item in soup.select('ul.bigimg li'):
        try:
            book = {
                'title': item.select_one('a.pic')['title'],
                'price': item.select_one('span.search_now_price').text.strip('¥'),
                'author': item.select_one('p.search_book_author').text.split('/')[0].strip(),
                'publisher': item.select_one('p.search_book_author').text.split('/')[-3].strip(),
                'pub_date': item.select_one('p.search_book_author').text.split('/')[-2].strip(),
                'comments': item.select_one('span.search_comment_num').text.strip('条评论'),
                'detail_url': item.select_one('a.pic')['href']
            }
            books.append(book)
        except Exception as e:
            print(f"解析异常: {e}")
    return books

3. 处理分页逻辑

def crawl_all_pages(keyword, max_pages=50):
    base_url = "http://search.dangdang.com/?key={}&act=input&page_index={}"
    all_books = []
    
    for page in range(1, max_pages+1):
        url = base_url.format(keyword, page)
        print(f"正在抓取第{page}页: {url}")
        html = get_page(url)
        if html:
            books = parse_list_page(html)
            if not books:  # 无结果时终止
                break
            all_books.extend(books)
            time.sleep(random.uniform(1, 3))  # 随机延迟
    
    return all_books

数据存储方案

1. CSV存储

def save_to_csv(books, filename):
    df = pd.DataFrame(books)
    df.to_csv(filename, index=False, encoding='utf_8_sig')

2. MongoDB存储

def save_to_mongodb(books, db_name='dangdang', collection_name='books'):
    client = pymongo.MongoClient('mongodb://localhost:27017/')
    db = client[db_name]
    collection = db[collection_name]
    collection.insert_many(books)

反爬机制应对

常见反爬措施

  1. IP限制:每30请求更换代理IP
  2. User-Agent轮换:准备多个UA
  3. 验证码:使用Selenium模拟人工操作
  4. 请求频率限制:随机延迟+间隔暂停

代理IP示例

proxies = {
    'http': 'http://123.456.789.012:8888',
    'https': 'https://123.456.789.012:8888'
}
response = requests.get(url, proxies=proxies)

完整代码实现

# 完整代码整合(包含异常处理、日志记录等)
import logging
from tqdm import tqdm

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

def main():
    keyword = "数据分析"
    logging.info(f"开始抓取当当网[{keyword}]相关书籍")
    
    try:
        books = crawl_all_pages(keyword)
        logging.info(f"共获取到{len(books)}条数据")
        
        # 存储数据
        save_to_csv(books, f'dangdang_{keyword}_books.csv')
        save_to_mongodb(books)
        
        logging.info("数据存储完成")
    except Exception as e:
        logging.error(f"主程序异常: {e}", exc_info=True)

if __name__ == '__main__':
    main()

数据分析应用

基础分析示例

df = pd.read_csv('dangdang_数据分析_books.csv')

# 价格分布分析
price_stats = df['price'].astype(float).describe()

# 出版社排行
publisher_top10 = df['publisher'].value_counts().head(10)

# 出版年份趋势
df['year'] = df['pub_date'].str.extract(r'(\d{4})')
year_dist = df['year'].value_counts().sort_index()

可视化展示

import matplotlib.pyplot as plt

plt.figure(figsize=(12,6))
year_dist.plot(kind='bar')
plt.title('数据分析书籍出版年份分布')
plt.xlabel('年份')
plt.ylabel('数量')
plt.savefig('publication_trend.png')

法律与伦理考量

  1. 遵守robots.txt协议(当当网通常禁止爬虫)
  2. 控制请求频率(建议≥2秒/请求)
  3. 仅用于个人学习研究
  4. 不进行商业用途或大规模分发
  5. 考虑使用官方API替代(如有)

总结与扩展

项目总结

  1. 完整实现了从数据采集到存储的流程
  2. 处理了常见的反爬机制
  3. 建立了可复用的爬虫框架

扩展方向

  1. 增加自动化定时爬取
  2. 整合多平台数据(京东、亚马逊)
  3. 构建价格监控预警系统
  4. 开发图书推荐算法

注意:本文代码仅供学习参考,实际使用时请遵守相关法律法规和网站规定。大规模商业用途需获得平台授权。 “`

(全文约3550字,实际字数可能因Markdown渲染方式略有差异)

推荐阅读:
  1. python爬取主播信息
  2. Python如何爬取爱奇艺电影信息

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:进程通讯的方式有哪些

下一篇:如何创建自己的微信小程序账号

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》