1. 爬虫目的:
      随着近年互联网的发展,网络上的信息飞速数量增长。在庞大的数据面前想要获得
    期望的信息往往如同大海捞针。通过合理的筛选,在百万甚至数亿计的数据中找到所需
    信息,无疑有着非常大的意义。
      在豆瓣网下,有很多与日常生活相关的模块网站
      
      内置的评分评价功能可以为用户提供很大选择空间,以豆瓣读书为例:
  2.  
  3.   
  1.   
  2.  
  3.   其中包含六个大型模块(文学,流行,文化,生活,经管,科技),内部细分了145个小型模块。
      在以数十万计的图书信息中,找到各模块中热门好评图书,对于读者或是书商都是很重要的。

    爬虫代码概述

一.数据存储

  csv文件存储,为方便后继使用pandas进行分析,对于爬取的html文件使用BeautifulSoup进行解析
  字段选择为 : 书名(titles) 作者/出版社(authors) 评分(nums) 评论数(peoples)

  1. csvinfo = open(name + '.csv', 'ab')
  2. begcsv = csv.writer(csvinfo)
  3. begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
  4. 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

  1. 解析代码如下   
  1. # 爬取指定name模块的url,并存储至name.csv文件
  2. def web(url, name):
  3. db_data = requests.get(url, headers=header)
  4. soup = BeautifulSoup(db_data.text, 'lxml')
  5. titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
  6. authors = soup.select('#subject_list > ul > li > div.info > div.pub')
  7. nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
  8. peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')
  9.  
  10. for title, author, num, people in zip(titles, authors, nums, peoples):
  11. data = [
  12. (
  13. title.get('title'),
  14. author.get_text().replace(' ', '').replace("\n", ""),
  15. num.get_text().replace(' ', '').replace("\n", ""),
  16. people.get_text().replace(' ', '').replace("\n", "")
  17. )
  18. ]
  19. csvfile = open(name + '.csv', 'ab')
  20. writer = csv.writer(csvfile)
  21. print(data)
  22. writer.writerows(data)
  23. csvfile.close()
  1.  
  1.  

三.请求头设置

  1. header = {
  2. 'Accept': '*/*;',
  3. 'Connection': 'keep-alive',
  4. 'Accept-Language': 'zh-CN,zh;q=0.9',
  5. 'Accept-Encoding': 'gzip, deflate, br',
  6. 'Host': 'book.douban.com',
  7. 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
  8. }

四.图书分页

  

    在豆瓣的反爬虫机制中,正常人浏览习惯只会查看靠前的页码,而位于后面的一般不会查看,

所以豆瓣将50页之后的书籍信息设置为只能通过搜索查询,在分页中无法查看。url规则为每页加20,get请求,所以在确定标签后,可以修改start值来换页。

  1.  
  2.  
  3. 代码:
  1. # name模块标签分页 指定为前50页
  2. def setCsv(name):
  3. url = 'https://book.douban.com/tag/' + name
  4. urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
  5. info(name=name)
  6. web(url, name)
  7. for single_url in urls:
  8. print(single_url)
  9. web(single_url, name=name)
  1.  
  1.  

五.完整代码

  1. # -*- coding: utf-8 -*-
  2. from bs4 import BeautifulSoup
  3. import requests
  4. import csv
  5. import sys
  6.  
  7. reload(sys)
  8. sys.setdefaultencoding('utf-8')
  9.  
  10. # 请求头设置
  11. header = {
  12. 'Accept': '*/*;',
  13. 'Connection': 'keep-alive',
  14. 'Accept-Language': 'zh-CN,zh;q=0.9',
  15. 'Accept-Encoding': 'gzip, deflate, br',
  16. 'Host': 'book.douban.com',
  17. 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
  18. }
  19.  
  20. # 初始化csv文件
  21. def info(name):
  22. csvinfo = open(name + '.csv', 'ab')
  23. begcsv = csv.writer(csvinfo)
  24. begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
  25. csvinfo.close()
  26.  
  27. # 爬取指定name模块的url,并存储至name.csv文件
  28. def web(url, name):
  29. db_data = requests.get(url, headers=header)
  30. soup = BeautifulSoup(db_data.text, 'lxml')
  31. titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
  32. authors = soup.select('#subject_list > ul > li > div.info > div.pub')
  33. nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
  34. peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')
  35.  
  36. for title, author, num, people in zip(titles, authors, nums, peoples):
  37. data = [
  38. (
  39. title.get('title'),
  40. author.get_text().replace(' ', '').replace("\n", ""),
  41. num.get_text().replace(' ', '').replace("\n", ""),
  42. people.get_text().replace(' ', '').replace("\n", "")
  43. )
  44. ]
  45. csvfile = open(name + '.csv', 'ab')
  46. writer = csv.writer(csvfile)
  47. print(data)
  48. writer.writerows(data)
  49. csvfile.close()
  50.  
  51. # name模块标签分页 指定为前50页
  52. def setCsv(name):
  53. url = 'https://book.douban.com/tag/' + name
  54. urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
  55. info(name=name)
  56. web(url, name)
  57. for single_url in urls:
  58. print(single_url)
  59. web(single_url, name=name)
  60.  
  61. if __name__ == '__main__':
  62. setCsv(str) #str为标签名

六.数据结果

  1. wber@wber:~/桌面$ tree -h 数据
  2. 数据
  3. ├── [4.0K] 经管
  4.    ├── [ 41K] 策划.csv
  5.    ├── [ 79K] 创业.csv
  6.    ├── [ 70K] 股票.csv
  7.    ├── [ 98K] 管理.csv
  8.    ├── [ 67K] 广告.csv
  9.    ├── [ 90K] 金融.csv
  10.    ├── [ 95K] 经济学.csv
  11.    ├── [ 79K] 理财.csv
  12.    ├── [ 43K] 企业史.csv
  13.    ├── [ 94K] 商业.csv
  14.    ├── [ 89K] 投资.csv
  15.    └── [ 86K] 营销.csv
  16. ├── [4.0K] 科技
  17.    ├── [ 19K] UCD.csv
  18.    ├── [ 21K] UE.csv
  19.    ├── [ 64K] web.csv
  20.    ├── [ 92K] 编程.csv
  21.    ├── [ 43K] 程序.csv
  22.    ├── [ 89K] 互联网.csv
  23.    ├── [ 33K] 交互.csv
  24.    ├── [ 64K] 交互设计.csv
  25.    ├── [ 66K] 科技.csv
  26.    ├── [100K] 科普.csv
  27.    ├── [ 99K] 科学.csv
  28.    ├── [5.8K] 神经网络.csv
  29.    ├── [ 48K] 算法.csv
  30.    ├── [ 20K] 通信.csv
  31.    └── [ 65K] 用户体验.csv
  32. ├── [4.0K] 流行
  33.    ├── [ 23K] J.K.罗琳.csv
  34.    ├── [ 67K] 阿加莎·克里斯蒂.csv
  35.    ├── [ 37K] 安妮宝贝.csv
  36.    ├── [ 18K] 沧月.csv
  37.    ├── [ 81K] 穿越.csv
  38.    ├── [ 75K] 耽美.csv
  39.    ├── [ 76K] 东野圭吾.csv
  40.    ├── [ 21K] 高木直子.csv
  41.    ├── [ 37K] 古龙.csv
  42.    ├── [ 22K] 郭敬明.csv
  43.    ├── [ 50K] 韩寒.csv
  44.    ├── [106K] 绘本.csv
  45.    ├── [ 40K] 几米.csv
  46.    ├── [ 49K] 金庸.csv
  47.    ├── [ 99K] 科幻.csv
  48.    ├── [ 97K] 科幻小说.csv
  49.    ├── [ 19K] 落落.csv
  50.    ├── [ 98K] 漫画.csv
  51.    ├── [ 91K] 魔幻.csv
  52.    ├── [ 98K] 奇幻.csv
  53.    ├── [ 90K] 青春.csv
  54.    ├── [ 85K] 青春文学.csv
  55.    ├── [ 86K] 日本漫画.csv
  56.    ├── [ 65K] 三毛.csv
  57.    ├── [ 96K] 推理.csv
  58.    ├── [ 97K] 推理小说.csv
  59.    ├── [ 83K] 网络小说.csv
  60.    ├── [ 76K] 武侠.csv
  61.    ├── [ 46K] 校园.csv
  62.    ├── [ 94K] 悬疑.csv
  63.    ├── [ 84K] 言情.csv
  64.    ├── [ 62K] 亦舒.csv
  65.    ├── [ 80K] 张小娴.csv
  66.    └── [ 14K] 张悦然.csv
  67. ├── [4.0K] 生活
  68.    ├── [ 82K] 爱情.csv
  69.    ├── [ 93K] 成长.csv
  70.    ├── [ 49K] 家居.csv
  71.    ├── [ 80K] 健康.csv
  72.    ├── [ 93K] 教育.csv
  73.    ├── [ 88K] 励志.csv
  74.    ├── [ 70K] 两性.csv
  75.    ├── [ 89K] 灵修.csv
  76.    ├── [ 85K] 旅行.csv
  77.    ├── [ 82K] 美食.csv
  78.    ├── [ 85K] 女性.csv
  79.    ├── [ 83K] 情感.csv
  80.    ├── [ 58K] 人际关系.csv
  81.    ├── [ 85K] 摄影.csv
  82.    ├── [ 89K] 生活.csv
  83.    ├── [ 67K] 手工.csv
  84.    ├── [100K] 心理.csv
  85.    ├── [ 64K] 养生.csv
  86.    ├── [ 80K] 游记.csv
  87.    ├── [ 86K] 职场.csv
  88.    └── [ 21K] 自助游.csv
  89. ├── [4.0K] 文化
  90.    ├── [ 93K] 传记.csv
  91.    ├── [ 94K] 电影.csv
  92.    ├── [ 77K] 二战.csv
  93.    ├── [ 69K] 佛教.csv
  94.    ├── [ 76K] 国学.csv
  95.    ├── [ 78K] 回忆录.csv
  96.    ├── [ 88K] 绘画.csv
  97.    ├── [ 86K] 建筑.csv
  98.    ├── [ 75K] 近代史.csv
  99.    ├── [ 76K] 军事.csv
  100.    ├── [ 61K] 考古.csv
  101.    ├── [ 91K] 历史.csv
  102.    ├── [ 82K] 美术.csv
  103.    ├── [ 89K] 人文.csv
  104.    ├── [ 85K] 人物传记.csv
  105.    ├── [ 91K] 社会.csv
  106.    ├── [ 93K] 社会学.csv
  107.    ├── [ 90K] 设计.csv
  108.    ├── [ 84K] 数学.csv
  109.    ├── [ 90K] 思想.csv
  110.    ├── [ 89K] 文化.csv
  111.    ├── [ 90K] 西方哲学.csv
  112.    ├── [ 79K] 戏剧.csv
  113.    ├── [102K] 心理学.csv
  114.    ├── [ 96K] 艺术.csv
  115.    ├── [ 82K] 艺术史.csv
  116.    ├── [ 82K] 音乐.csv
  117.    ├── [ 95K] 哲学.csv
  118.    ├── [ 90K] 政治.csv
  119.    ├── [ 89K] 政治学.csv
  120.    ├── [ 80K] 中国历史.csv
  121.    ├── [ 67K] 自由主义.csv
  122.    └── [ 86K] 宗教.csv
  123. └── [4.0K] 文学
  124. ├── [ 32K] 茨威格.csv
  125. ├── [ 66K] 村上春树.csv
  126. ├── [ 67K] 当代文学.csv
  127. ├── [ 19K] 杜拉斯.csv
  128. ├── [ 89K] 儿童文学.csv
  129. ├── [ 24K] 港台.csv
  130. ├── [ 76K] 古典文学.csv
  131. ├── [ 92K] 经典.csv
  132. ├── [ 40K] 鲁迅.csv
  133. ├── [ 16K] 米兰·昆德拉.csv
  134. ├── [ 84K] 名著.csv
  135. ├── [ 23K] 钱钟书.csv
  136. ├── [ 87K] 日本文学.csv
  137. ├── [ 75K] 散文.csv
  138. ├── [ 76K] 诗词.csv
  139. ├── [ 87K] 诗歌.csv
  140. ├── [ 79K] 随笔.csv
  141. ├── [ 91K] 童话.csv
  142. ├── [ 79K] 外国名著.csv
  143. ├── [ 99K] 外国文学.csv
  144. ├── [ 61K] 王小波.csv
  145. ├── [ 89K] 文学.csv
  146. ├── [ 88K] 小说.csv
  147. ├── [ 31K] 余华.csv
  148. ├── [ 73K] 杂文.csv
  149. ├── [ 60K] 张爱玲.csv
  150. └── [ 71K] 中国文学.csv
  151.  
  152. 6 directories, 142 files
  1.  

Python爬虫(一)——豆瓣下图书信息的更多相关文章

  1. Python爬虫(四)——豆瓣数据模型训练与检测

    前文参考: Python爬虫(一)——豆瓣下图书信息 Python爬虫(二)——豆瓣图书决策树构建 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 在这张表中我们可以发现 ...

  2. Python爬虫之豆瓣-新书速递-图书解析

    1- 问题描述 抓取豆瓣“新书速递”[1]页面下图书信息(包括书名,作者,简介,url),将结果重定向到txt文本文件下. 2- 思路分析[2] Step1 读取HTML Step2 Xpath遍历元 ...

  3. python爬虫抓取哈尔滨天气信息(静态爬虫)

    python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...

  4. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...

  5. [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium

    最近准备深入学习Python相关的爬虫知识了,如果说在使用Python爬取相对正规的网页使用"urllib2 + BeautifulSoup + 正则表达式"就能搞定的话:那么动态 ...

  6. python爬虫之12306网站--车站信息查询

    python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...

  7. 简单的python爬虫--爬取Taobao淘女郎信息

    最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好! 爬虫的入口:https://mm.taobao.com/json/r ...

  8. 用Python爬虫对豆瓣《敦刻尔克》影评进行词云展示

    最近很想看的一个电影,去知乎上看一下评论,刚好在学Python爬虫,就做个小实例. 代码基于第三方修改 原文链接  http://python.jobbole.com/88325/#comment-9 ...

  9. Python爬虫(二)——豆瓣图书决策树构建

    前文参考:  https://www.cnblogs.com/LexMoon/p/douban1.html Matplotlib绘制决策树代码: # coding=utf-8 import matpl ...

随机推荐

  1. MongoDB--搭建mongodb服务器

    此为手动搭建: 可以看到初始化data时所有的数据,和log里已经有日志文件

  2. 自定义Http请求头并且获取

    在一些开发需求中.我们需要把一些信息放到Http请求头中.比如我需要把签名信息 signature 放到Http请求头 所以就需要自定义请求头 signature ,用webClient发起请求 我这 ...

  3. 工厂模式&策略模式。

    抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...

  4. LeetCode155.最小栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

  5. Javascript-全局函数和局部函数作用域的理解

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. EL的隐含对象(一)【页面上下文对象】

    页面上下文对象为pageContext,用于访问JSP内置对象(例如:request.response.out.session.exception.page等)和ServletContext.在获取到 ...

  7. c# 确定dynamic类型的数据对象是否存在某个属性

    public static bool IsPropertyExist(dynamic data, string propertyname)   {     if (data is ExpandoObj ...

  8. 混合型log,info按大小分,error按日期

    1.配置文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <!- ...

  9. SVN windows内修改日志内容(错误解决)

    在我的电脑是windows 7,使用TortoiseSVN客户端,选中代码目录,点击右键,选择<显示日志> 显示日志信息 修改原来的日志信息(在需要修改的版本的日志中点击鼠标右键,显示如下 ...

  10. kali linux 基本命令(第一批)

    pwd  ,  rm    ,locate    ,cat    ,head     ,  clear    ,ls      ,cd     ,mkdir      ,touch       ,ec ...