您的位置:首页 > 编程语言 > Python开发

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

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: