Python爬虫(一)——豆瓣下图书信息

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

爬虫目的:
  随着近年互联网的发展,网络上的信息飞速数量增长。在庞大的数据面前想要获得
期望的信息往往如同大海捞针。通过合理的筛选,在百万甚至数亿计的数据中找到所需
信息,无疑有着非常大的意义。
  在豆瓣网下,有很多与日常生活相关的模块网站
  
  内置的评分评价功能可以为用户提供很大选择空间,以豆瓣读书为例:

  
  

  其中包含六个大型模块(文学,流行,文化,生活,经管,科技),内部细分了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 # 爬取指定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 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 # 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 # -*- 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 
21 # 初始化csv文件
22 def info(name):
23     csvinfo = open(name + '.csv', 'ab')
24     begcsv = csv.writer(csvinfo)
25     begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
26     csvinfo.close()
27 
28 
29 # 爬取指定name模块的url,并存储至name.csv文件
30 def web(url, name):
31     db_data = requests.get(url, headers=header)
32     soup = BeautifulSoup(db_data.text, 'lxml')
33     titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
34     authors = soup.select('#subject_list > ul > li > div.info > div.pub')
35     nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
36     peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')
37 
38     for title, author, num, people in zip(titles, authors, nums, peoples):
39         data = [
40             (
41                 title.get('title'),
42                 author.get_text().replace(' ', '').replace("\n", ""),
43                 num.get_text().replace(' ', '').replace("\n", ""),
44                 people.get_text().replace(' ', '').replace("\n", "")
45             )
46         ]
47         csvfile = open(name + '.csv', 'ab')
48         writer = csv.writer(csvfile)
49         print(data)
50         writer.writerows(data)
51         csvfile.close()
52 
53 
54 # name模块标签分页  指定为前50页
55 def setCsv(name):
56     url = 'https://book.douban.com/tag/' + name
57     urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
58     info(name=name)
59     web(url, name)
60     for single_url in urls:
61         print(single_url)
62         web(single_url, name=name)
63 
64 
65 if __name__ == '__main__':
66     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

 

 

 

 
目录
相关文章
|
10天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
8天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
12天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
15天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
13天前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
89 6
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
209 4
|
4月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
5月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
87 4
|
2月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
202 66