您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何使用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。