#1 爬虫:豆瓣图书TOP250 「requests、BeautifulSoup」
一、项目背景
随着时代的发展,国人对于阅读的需求也是日益增长,既然要阅读,就要读好书,什么是好书呢?本项目选择以豆瓣图书网站为对象,统计其排行榜的前250本书籍。
二、项目介绍
本项目使用Python爬虫技术统计豆瓣图书网站上排名前250的书籍信息,包括书名、作者、出版社、出版日期、价格、评星、简述信息
将获取到的信息存储在Mysql数据库中
三、项目流程
3.1 分析第一页
第一页地址为:https://book.douban.com/top250,打开后页面呈现为如下:
我们需要获得的信息为每一本书的所有信息:
所以思路为:
解析这一页--->得到这一页所有图书的信息
3.2 解析第一页
使用开发者模式查看网页源代码(Chrome浏览器按F12),选择network后,刷新网页,效果如下图:
之后点击top250--->Response,如下图:
此时就会在右下方看到网页的源代码,分析源代码可知:
每一本书都是被「table标签,class=item」扩起来的,比如《追风筝的人》源代码在253-307行。
使用requests模块获取源代码,Python代码如下:
import requests def parse_index(url):
'''
解析索引页面
返回图书所有信息
'''
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except Exception as e:
print('error:', e)
『防抄袭:读者请忽略这段文字,文章作者是博客园的MinuteSheep』
3.3 解析图书详细信息
获取到页面源代码后,接下来要做的工作就是解析每一本图书的详细信息了。所以思路继续深入:
解析这一页--->得到这一页所有图书的信息--->解析一本图书--->将图书详细信息保存为字典格式
书名都是被「a标签」扩起来的,比如《追风筝的人》书名源代码在268-274行;
作者、出版社、出版日期、价格都是被「p标签,class=pl」扩起来的,比如《追风筝的人》这些信息源代码在285行;
评星都是被「span标签,class=rating_nums」扩起来的,比如《追风筝的人》评星源代码在292行;
简述信息都是被「span标签,class=inq」扩起来的,比如《追风筝的人》简述信息源代码在301行。
Python源代码如下:
from bs4 import BeautifulSoup def parse(text):
'''
解析图书详细信息
'''
soup = BeautifulSoup(text.strip(), 'lxml')
books = soup.select('.item')
info = {}
for book in books:
info.clear()
info['title'] = book.select('.pl2 a')[0].get_text(
).strip().replace(' ', '').replace('\n', '')
info['author'] = book.select(
'.pl')[0].get_text().strip().split('/')[0].strip()
info['publishers'] = book.select(
'.pl')[0].get_text().strip().split('/')[-3].strip()
info['date'] = book.select(
'.pl')[0].get_text().strip().split('/')[-2].strip()
info['price'] = book.select(
'.pl')[0].get_text().strip().split('/')[-1].strip()
info['star'] = float(book.select('.rating_nums')[0].get_text())
info['summary'] = book.select('.inq')[0].get_text(
).strip() if book.select('.inq') else ''
yield info
3.4 将信息保存在Mysql数据库
进入Mysql的交互环境,依次建立数据库、创建数据表:
create database douban;
use douban;
create table book_top250(
-> id int not null primary key auto_increment,
-> title char(100) not null unique key,
-> author char(100) not null,
-> publisher char(100),
-> date char(100),
-> price char(100)
-> star float,
-> summary char(100)
->);
之后使用Mysql官方推荐的连接库:mysql.connector
Python代码如下:
import mysql.connector def open_mysql():
'''
连接mysql
'''
cnx = mysql.connector.connect(user='minutesheep', database='douban')
cursor = cnx.cursor()
return cnx, cursor def save_to_mysql(cnx, cursor, info):
'''
将数据写入mysql
'''
add_book_top250 = ("INSERT IGNORE INTO book_top250 "
"(title,author,publishers,date,price,star,summary) "
"VALUES (%(title)s, %(author)s, %(publishers)s, %(date)s, %(price)s, %(star)s, %(summary)s)") cursor.execute(add_book_top250, info)
cnx.commit() def close_mysql(cnx, cursor):
'''
关闭mysql
'''
cursor.close()
cnx.close()
到此为止,一本图书的信息就已经保存完毕了
3.5 遍历本页面所有图书
现在只需要将本页面的所有图书遍历一遍,就完成了一个页面的抓取
『防抄袭:读者请忽略这段文字,文章作者是博客园的MinuteSheep』
3.6 遍历所有页面
最后只需要将所有页面遍历就可以抓取到250本图书了。现在观察每一页的URL变化:
第一页:https://book.douban.com/top250 或 https://book.douban.com/top250?start=0
第二页:https://book.douban.com/top250?start=25
第三页:https://book.douban.com/top250?start=50
第十页(最后一页):https://book.douban.com/top250?start=225
通过观察可知,后一页的URL只需要将前一页的URL最后的数字加25
基于此,Python代码为:
def main():
base_url = 'https://book.douban.com/top250?start='
cnx, cursor = open_mysql()
for page in range(0, 250, 25):
index_url = base_url + str(page)
text = parse_index(index_url)
info = parse(text)
for result in info:
save_to_mysql(cnx, cursor, result)
close_mysql(cnx, cursor)
四、项目流程图
五、项目源代码
import requests
from bs4 import BeautifulSoup
import mysql.connector def parse_index(url):
'''
解析索引页面
返回图书所有信息
'''
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
except Exception as e:
print('error:', e) def parse(text):
'''
解析图书详细信息
'''
soup = BeautifulSoup(text.strip(), 'lxml')
books = soup.select('.item')
info = {}
for book in books:
info.clear()
info['title'] = book.select('.pl2 a')[0].get_text(
).strip().replace(' ', '').replace('\n', '')
info['author'] = book.select(
'.pl')[0].get_text().strip().split('/')[0].strip()
info['publishers'] = book.select(
'.pl')[0].get_text().strip().split('/')[-3].strip()
info['date'] = book.select(
'.pl')[0].get_text().strip().split('/')[-2].strip()
info['price'] = book.select(
'.pl')[0].get_text().strip().split('/')[-1].strip()
info['star'] = float(book.select('.rating_nums')[0].get_text())
info['summary'] = book.select('.inq')[0].get_text(
).strip() if book.select('.inq') else ''
yield info def open_mysql():
'''
连接mysql
'''
cnx = mysql.connector.connect(user='minutesheep', database='douban')
cursor = cnx.cursor()
return cnx, cursor def save_to_mysql(cnx, cursor, info):
'''
将数据写入mysql
'''
add_book_top250 = ("INSERT IGNORE INTO book_top250 "
"(title,author,publishers,date,price,star,summary) "
"VALUES (%(title)s, %(author)s, %(publishers)s, %(date)s, %(price)s, %(star)s, %(summary)s)") cursor.execute(add_book_top250, info)
cnx.commit() def close_mysql(cnx, cursor):
'''
关闭mysql
'''
cursor.close()
cnx.close() def main():
base_url = 'https://book.douban.com/top250?start='
cnx, cursor = open_mysql()
for page in range(0, 250, 25):
index_url = base_url + str(page)
text = parse_index(index_url)
info = parse(text)
for result in info:
save_to_mysql(cnx, cursor, result)
close_mysql(cnx, cursor) if __name__ == '__main__':
main()
源代码
整个项目地址:https://github.com/MinuteSheep/DoubanBookTop250
六、项目结果展示
Mysql部分数据如下图:
提醒:仅供学习使用,商用后果自负
#1 爬虫:豆瓣图书TOP250 「requests、BeautifulSoup」的更多相关文章
- 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例
基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...
- Python爬虫-爬取豆瓣图书Top250
豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP.但也不要太频繁爬取. 涉及知识点:requests.html.xpath.csv 一.准备工作 需要安装reques ...
- python爬虫1——获取网站源代码(豆瓣图书top250信息)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- 【Python数据分析】Python3操作Excel-以豆瓣图书Top250为例
本文利用Python3爬虫抓取豆瓣图书Top250,并利用xlwt模块将其存储至excel文件,图片下载到相应目录.旨在进行更多的爬虫实践练习以及模块学习. 工具 1.Python 3.5 2.Bea ...
- Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129
大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...
- 豆瓣图书Top250
从豆瓣图书Top250抓取数据,并通过词云图展示 导入库 from lxml import etree #解析库 import time #时间 import random #随机函数 import ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- 爬虫初体验:Python+Requests+BeautifulSoup抓取广播剧
可以看到一个DIV下放一个广播剧的信息,包括名称和地址,第一步我们先收集所有广播剧的收听地址: # 用requests的get方法访问novel_list_resp = requests.get(&q ...
- 爬去豆瓣图书top250数据存储到csv中
from lxml import etree import requests import csv fp=open('C://Users/Administrator/Desktop/lianxi/do ...
随机推荐
- 学习之路-->大小文件读取并分页展示
1.读取小文件,并进行分页 商品|价格 飞机|1000 大炮|2000 迫击炮|1000 手枪|123 ..... lis = [] n = 10 #每页显示10条信息 with open('小文件' ...
- js与es6中获取时间戳
在项目中经常会用到求时间戳的问题,下面是已经封装好的函数,直接使用就可以.1.js常用获取时间戳的方法 // 获取时间戳 var start = new Date().getTime(); conso ...
- redux 与 react-redux
Redux 一.Redux 三大原则: 1.一个应用永远只有一个数据源(整个应用状态都保存在一个对象中,Redux提供的工具函数combineReducers可以解决庞大的数据对象的问题) 2.状态是 ...
- Chrome_高亮显示当前改变的区域
- vs2010 sp1 安装Silverlight5 语言版本不匹配的问题
好久之前用silverlight写了个程序,今天心血来潮想给朋友看一下,朋友更新了sl5,但是运行不起来. 所以有点郁闷,于是打算更新项目到silverlight5. 装sp1后,下载silverli ...
- RAID部署
添加硬盘 1.创建一个RAID阵列卡 2.格式化刚刚做好的md0 3.创建挂载目录 4.自动挂载,永久生效 5.使用 创建RAID 1.创建一个RAID阵列卡 2.格式化 3.创建挂载目录 4.自动挂 ...
- 带parent指针的successor求解
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点(不存在重复数据).树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 如果当前节点有右孩子,则下一个节点是右孩子中 ...
- #Java学习之路——基础阶段(第五篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- [Swift]LeetCode20. 有效的括号 | Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- [Swift]LeetCode829. 连续整数求和 | Consecutive Numbers Sum
Given a positive integer N, how many ways can we write it as a sum of consecutive positive integers? ...