您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 如何使用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存储
pip install requests beautifulsoup4 pandas selenium pymongo当当网搜索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
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
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
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
def save_to_csv(books, filename):
    df = pd.DataFrame(books)
    df.to_csv(filename, index=False, encoding='utf_8_sig')
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)
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')
注意:本文代码仅供学习参考,实际使用时请遵守相关法律法规和网站规定。大规模商业用途需获得平台授权。 “`
(全文约3550字,实际字数可能因Markdown渲染方式略有差异)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。