Python爬虫(一)——豆瓣下图书信息
爬虫目的:
随着近年互联网的发展,网络上的信息飞速数量增长。在庞大的数据面前想要获得
期望的信息往往如同大海捞针。通过合理的筛选,在百万甚至数亿计的数据中找到所需
信息,无疑有着非常大的意义。
在豆瓣网下,有很多与日常生活相关的模块网站
内置的评分评价功能可以为用户提供很大选择空间,以豆瓣读书为例:
- 其中包含六个大型模块(文学,流行,文化,生活,经管,科技),内部细分了145个小型模块。
在以数十万计的图书信息中,找到各模块中热门好评图书,对于读者或是书商都是很重要的。
爬虫代码概述
一.数据存储
csv文件存储,为方便后继使用pandas进行分析,对于爬取的html文件使用BeautifulSoup进行解析
字段选择为 : 书名(titles) 作者/出版社(authors) 评分(nums) 评论数(peoples)
- csvinfo = open(name + '.csv', 'ab')
- begcsv = csv.writer(csvinfo)
- begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
- csvinfo.close()
二.网页解析
html中书名(titles) 作者/出版社(authors) 评分(nums) 评论数(peoples)等字段对应selector分别为:
#subject_list > ul > li > div.info > h2 > a
#subject_list > ul > li > div.info > div.pub
#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums
#subject_list > ul > li > div.info > div.star.clearfix > span.pl
- 解析代码如下 :
- # 爬取指定name模块的url,并存储至name.csv文件
- def web(url, name):
- db_data = requests.get(url, headers=header)
- soup = BeautifulSoup(db_data.text, 'lxml')
- titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
- authors = soup.select('#subject_list > ul > li > div.info > div.pub')
- nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
- peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')
- for title, author, num, people in zip(titles, authors, nums, peoples):
- data = [
- (
- title.get('title'),
- author.get_text().replace(' ', '').replace("\n", ""),
- num.get_text().replace(' ', '').replace("\n", ""),
- people.get_text().replace(' ', '').replace("\n", "")
- )
- ]
- csvfile = open(name + '.csv', 'ab')
- writer = csv.writer(csvfile)
- print(data)
- writer.writerows(data)
- csvfile.close()
三.请求头设置
- header = {
- 'Accept': '*/*;',
- 'Connection': 'keep-alive',
- 'Accept-Language': 'zh-CN,zh;q=0.9',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Host': 'book.douban.com',
- 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
- }
四.图书分页
在豆瓣的反爬虫机制中,正常人浏览习惯只会查看靠前的页码,而位于后面的一般不会查看,
所以豆瓣将50页之后的书籍信息设置为只能通过搜索查询,在分页中无法查看。url规则为每页加20,get请求,所以在确定标签后,可以修改start值来换页。
- 代码:
- # name模块标签分页 指定为前50页
- def setCsv(name):
- url = 'https://book.douban.com/tag/' + name
- urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
- info(name=name)
- web(url, name)
- for single_url in urls:
- print(single_url)
- web(single_url, name=name)
五.完整代码
- # -*- coding: utf-8 -*-
- from bs4 import BeautifulSoup
- import requests
- import csv
- import sys
- reload(sys)
- sys.setdefaultencoding('utf-8')
- # 请求头设置
- header = {
- 'Accept': '*/*;',
- 'Connection': 'keep-alive',
- 'Accept-Language': 'zh-CN,zh;q=0.9',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Host': 'book.douban.com',
- 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
- }
- # 初始化csv文件
- def info(name):
- csvinfo = open(name + '.csv', 'ab')
- begcsv = csv.writer(csvinfo)
- begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
- csvinfo.close()
- # 爬取指定name模块的url,并存储至name.csv文件
- def web(url, name):
- db_data = requests.get(url, headers=header)
- soup = BeautifulSoup(db_data.text, 'lxml')
- titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
- authors = soup.select('#subject_list > ul > li > div.info > div.pub')
- nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
- peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')
- for title, author, num, people in zip(titles, authors, nums, peoples):
- data = [
- (
- title.get('title'),
- author.get_text().replace(' ', '').replace("\n", ""),
- num.get_text().replace(' ', '').replace("\n", ""),
- people.get_text().replace(' ', '').replace("\n", "")
- )
- ]
- csvfile = open(name + '.csv', 'ab')
- writer = csv.writer(csvfile)
- print(data)
- writer.writerows(data)
- csvfile.close()
- # name模块标签分页 指定为前50页
- def setCsv(name):
- url = 'https://book.douban.com/tag/' + name
- urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
- info(name=name)
- web(url, name)
- for single_url in urls:
- print(single_url)
- web(single_url, name=name)
- if __name__ == '__main__':
- setCsv(str) #str为标签名
六.数据结果
- wber@wber:~/桌面$ tree -h 数据
- 数据
- ├── [4.0K] 经管
- │ ├── [ 41K] 策划.csv
- │ ├── [ 79K] 创业.csv
- │ ├── [ 70K] 股票.csv
- │ ├── [ 98K] 管理.csv
- │ ├── [ 67K] 广告.csv
- │ ├── [ 90K] 金融.csv
- │ ├── [ 95K] 经济学.csv
- │ ├── [ 79K] 理财.csv
- │ ├── [ 43K] 企业史.csv
- │ ├── [ 94K] 商业.csv
- │ ├── [ 89K] 投资.csv
- │ └── [ 86K] 营销.csv
- ├── [4.0K] 科技
- │ ├── [ 19K] UCD.csv
- │ ├── [ 21K] UE.csv
- │ ├── [ 64K] web.csv
- │ ├── [ 92K] 编程.csv
- │ ├── [ 43K] 程序.csv
- │ ├── [ 89K] 互联网.csv
- │ ├── [ 33K] 交互.csv
- │ ├── [ 64K] 交互设计.csv
- │ ├── [ 66K] 科技.csv
- │ ├── [100K] 科普.csv
- │ ├── [ 99K] 科学.csv
- │ ├── [5.8K] 神经网络.csv
- │ ├── [ 48K] 算法.csv
- │ ├── [ 20K] 通信.csv
- │ └── [ 65K] 用户体验.csv
- ├── [4.0K] 流行
- │ ├── [ 23K] J.K.罗琳.csv
- │ ├── [ 67K] 阿加莎·克里斯蒂.csv
- │ ├── [ 37K] 安妮宝贝.csv
- │ ├── [ 18K] 沧月.csv
- │ ├── [ 81K] 穿越.csv
- │ ├── [ 75K] 耽美.csv
- │ ├── [ 76K] 东野圭吾.csv
- │ ├── [ 21K] 高木直子.csv
- │ ├── [ 37K] 古龙.csv
- │ ├── [ 22K] 郭敬明.csv
- │ ├── [ 50K] 韩寒.csv
- │ ├── [106K] 绘本.csv
- │ ├── [ 40K] 几米.csv
- │ ├── [ 49K] 金庸.csv
- │ ├── [ 99K] 科幻.csv
- │ ├── [ 97K] 科幻小说.csv
- │ ├── [ 19K] 落落.csv
- │ ├── [ 98K] 漫画.csv
- │ ├── [ 91K] 魔幻.csv
- │ ├── [ 98K] 奇幻.csv
- │ ├── [ 90K] 青春.csv
- │ ├── [ 85K] 青春文学.csv
- │ ├── [ 86K] 日本漫画.csv
- │ ├── [ 65K] 三毛.csv
- │ ├── [ 96K] 推理.csv
- │ ├── [ 97K] 推理小说.csv
- │ ├── [ 83K] 网络小说.csv
- │ ├── [ 76K] 武侠.csv
- │ ├── [ 46K] 校园.csv
- │ ├── [ 94K] 悬疑.csv
- │ ├── [ 84K] 言情.csv
- │ ├── [ 62K] 亦舒.csv
- │ ├── [ 80K] 张小娴.csv
- │ └── [ 14K] 张悦然.csv
- ├── [4.0K] 生活
- │ ├── [ 82K] 爱情.csv
- │ ├── [ 93K] 成长.csv
- │ ├── [ 49K] 家居.csv
- │ ├── [ 80K] 健康.csv
- │ ├── [ 93K] 教育.csv
- │ ├── [ 88K] 励志.csv
- │ ├── [ 70K] 两性.csv
- │ ├── [ 89K] 灵修.csv
- │ ├── [ 85K] 旅行.csv
- │ ├── [ 82K] 美食.csv
- │ ├── [ 85K] 女性.csv
- │ ├── [ 83K] 情感.csv
- │ ├── [ 58K] 人际关系.csv
- │ ├── [ 85K] 摄影.csv
- │ ├── [ 89K] 生活.csv
- │ ├── [ 67K] 手工.csv
- │ ├── [100K] 心理.csv
- │ ├── [ 64K] 养生.csv
- │ ├── [ 80K] 游记.csv
- │ ├── [ 86K] 职场.csv
- │ └── [ 21K] 自助游.csv
- ├── [4.0K] 文化
- │ ├── [ 93K] 传记.csv
- │ ├── [ 94K] 电影.csv
- │ ├── [ 77K] 二战.csv
- │ ├── [ 69K] 佛教.csv
- │ ├── [ 76K] 国学.csv
- │ ├── [ 78K] 回忆录.csv
- │ ├── [ 88K] 绘画.csv
- │ ├── [ 86K] 建筑.csv
- │ ├── [ 75K] 近代史.csv
- │ ├── [ 76K] 军事.csv
- │ ├── [ 61K] 考古.csv
- │ ├── [ 91K] 历史.csv
- │ ├── [ 82K] 美术.csv
- │ ├── [ 89K] 人文.csv
- │ ├── [ 85K] 人物传记.csv
- │ ├── [ 91K] 社会.csv
- │ ├── [ 93K] 社会学.csv
- │ ├── [ 90K] 设计.csv
- │ ├── [ 84K] 数学.csv
- │ ├── [ 90K] 思想.csv
- │ ├── [ 89K] 文化.csv
- │ ├── [ 90K] 西方哲学.csv
- │ ├── [ 79K] 戏剧.csv
- │ ├── [102K] 心理学.csv
- │ ├── [ 96K] 艺术.csv
- │ ├── [ 82K] 艺术史.csv
- │ ├── [ 82K] 音乐.csv
- │ ├── [ 95K] 哲学.csv
- │ ├── [ 90K] 政治.csv
- │ ├── [ 89K] 政治学.csv
- │ ├── [ 80K] 中国历史.csv
- │ ├── [ 67K] 自由主义.csv
- │ └── [ 86K] 宗教.csv
- └── [4.0K] 文学
- ├── [ 32K] 茨威格.csv
- ├── [ 66K] 村上春树.csv
- ├── [ 67K] 当代文学.csv
- ├── [ 19K] 杜拉斯.csv
- ├── [ 89K] 儿童文学.csv
- ├── [ 24K] 港台.csv
- ├── [ 76K] 古典文学.csv
- ├── [ 92K] 经典.csv
- ├── [ 40K] 鲁迅.csv
- ├── [ 16K] 米兰·昆德拉.csv
- ├── [ 84K] 名著.csv
- ├── [ 23K] 钱钟书.csv
- ├── [ 87K] 日本文学.csv
- ├── [ 75K] 散文.csv
- ├── [ 76K] 诗词.csv
- ├── [ 87K] 诗歌.csv
- ├── [ 79K] 随笔.csv
- ├── [ 91K] 童话.csv
- ├── [ 79K] 外国名著.csv
- ├── [ 99K] 外国文学.csv
- ├── [ 61K] 王小波.csv
- ├── [ 89K] 文学.csv
- ├── [ 88K] 小说.csv
- ├── [ 31K] 余华.csv
- ├── [ 73K] 杂文.csv
- ├── [ 60K] 张爱玲.csv
- └── [ 71K] 中国文学.csv
- 6 directories, 142 files
Python爬虫(一)——豆瓣下图书信息的更多相关文章
- Python爬虫(四)——豆瓣数据模型训练与检测
前文参考: Python爬虫(一)——豆瓣下图书信息 Python爬虫(二)——豆瓣图书决策树构建 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 在这张表中我们可以发现 ...
- Python爬虫之豆瓣-新书速递-图书解析
1- 问题描述 抓取豆瓣“新书速递”[1]页面下图书信息(包括书名,作者,简介,url),将结果重定向到txt文本文件下. 2- 思路分析[2] Step1 读取HTML Step2 Xpath遍历元 ...
- python爬虫抓取哈尔滨天气信息(静态爬虫)
python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...
- python爬虫之12306网站--火车票信息查询
python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...
- [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium
最近准备深入学习Python相关的爬虫知识了,如果说在使用Python爬取相对正规的网页使用"urllib2 + BeautifulSoup + 正则表达式"就能搞定的话:那么动态 ...
- python爬虫之12306网站--车站信息查询
python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...
- 简单的python爬虫--爬取Taobao淘女郎信息
最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好! 爬虫的入口:https://mm.taobao.com/json/r ...
- 用Python爬虫对豆瓣《敦刻尔克》影评进行词云展示
最近很想看的一个电影,去知乎上看一下评论,刚好在学Python爬虫,就做个小实例. 代码基于第三方修改 原文链接 http://python.jobbole.com/88325/#comment-9 ...
- Python爬虫(二)——豆瓣图书决策树构建
前文参考: https://www.cnblogs.com/LexMoon/p/douban1.html Matplotlib绘制决策树代码: # coding=utf-8 import matpl ...
随机推荐
- MongoDB--搭建mongodb服务器
此为手动搭建: 可以看到初始化data时所有的数据,和log里已经有日志文件
- 自定义Http请求头并且获取
在一些开发需求中.我们需要把一些信息放到Http请求头中.比如我需要把签名信息 signature 放到Http请求头 所以就需要自定义请求头 signature ,用webClient发起请求 我这 ...
- 工厂模式&策略模式。
抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...
- LeetCode155.最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- Javascript-全局函数和局部函数作用域的理解
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- EL的隐含对象(一)【页面上下文对象】
页面上下文对象为pageContext,用于访问JSP内置对象(例如:request.response.out.session.exception.page等)和ServletContext.在获取到 ...
- c# 确定dynamic类型的数据对象是否存在某个属性
public static bool IsPropertyExist(dynamic data, string propertyname) { if (data is ExpandoObj ...
- 混合型log,info按大小分,error按日期
1.配置文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <!- ...
- SVN windows内修改日志内容(错误解决)
在我的电脑是windows 7,使用TortoiseSVN客户端,选中代码目录,点击右键,选择<显示日志> 显示日志信息 修改原来的日志信息(在需要修改的版本的日志中点击鼠标右键,显示如下 ...
- kali linux 基本命令(第一批)
pwd , rm ,locate ,cat ,head , clear ,ls ,cd ,mkdir ,touch ,ec ...