Python爬虫(一)——豆瓣下图书信息
2018-06-23 15:09
513 查看
爬虫目的:
随着近年互联网的发展,网络上的信息飞速数量增长。在庞大的数据面前想要获得
期望的信息往往如同大海捞针。通过合理的筛选,在百万甚至数亿计的数据中找到所需
信息,无疑有着非常大的意义。
在豆瓣网下,有很多与日常生活相关的模块网站
内置的评分评价功能可以为用户提供很大选择空间,以豆瓣读书为例:
其中包含六个大型模块(文学,流行,文化,生活,经管,科技),内部细分了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爬虫实现获取豆瓣图书的top250的信息-beautifulsoup实现
- Python爬虫爬取豆瓣图书的信息和封面,放入MySQL数据库中。
- python爬虫抓取豆瓣所有恐怖片信息(利用多线程和构建免费ip代理池)
- python爬虫实战 | 爬取豆瓣TOP250排名信息
- Python爬虫之抓取豆瓣信息 全部网页显示
- 【Python爬虫第二弹】基于爬虫爬取豆瓣书籍的书籍信息查询
- Python3.6爬虫爬取豆瓣电影Top250信息
- python 实现用ISBN从豆瓣获取图书信息
- 爬虫实战【11】Python获取豆瓣热门电影信息
- 一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
- Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129
- 简单的python爬虫爬豆瓣图书TOP250
- Python爬取豆瓣图书信息学习记录
- python 爬虫学习三(Scrapy 实战,豆瓣爬取电影信息)
- Python爬虫(二)——豆瓣图书决策树构建
- [置顶] python爬虫实践——零基础快速入门(三)爬取豆瓣图书
- Python-利用beautifulsoup写个豆瓣热门图书爬虫
- Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析
- 爬虫入门:python+pycharm,豆瓣电影信息,短评,分页爬取,mysql数据库连接