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 ...
随机推荐
- CentOS6.5安装python3.7
1.下载python3 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 2.解压 [root@mycentos ~]# ta ...
- .NET拾忆:EventLog(Windows事件日志监控)
操作Windows日志:EventLog 1:事件日志名(logName):“事件查看器”中的每一项,如“应用程序”.“Internet Explorer”.“安全性”和“系统”都是日志(严格地说是日 ...
- android怎么抓取双向认证https的包
这里仅提供思路. 第一种方法: dex层面,可以直接用插日志方法,找到app使用的https库,这里以某app为例,使用okhttp, okhttp收发包相关代码: Request request = ...
- 使用mysqlbinlog从二进制日志文件中查询mysql执行过的sql语句 (原)
前提MySQL开启了binlog日志操作1. 查看MySQL是否开启binlog(进mysql操作) mysql> show variables like 'log_bin%'; 2 ...
- DoTween
dotween最原始的用法 using System.Collections; using System.Collections.Generic; using UnityEngine; using D ...
- JavaScript-switch-case-电话系统
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Android Studio -- 关联源码
1,昨天刚把SDK升级到25,然后准备开始 新的一年码代码,结果发现查看源码的时候出现了一堆的“ throw new RuntimeException("Stub!");” 网上搜 ...
- Oracle TNS-01190: The user is not authorized to execute the requested listener command
今天,在玩 lsnrctl命令,是为了了解Oracle的一些配置. 当执行 show inbound_connect_timeout 命令之后,提示了错误信息: TNS-01190: The user ...
- Beta阶段冲刺2.0
1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 成员 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难 具体贡献 郑晓丽 "我的活动详情&quo ...
- wxpython(python3.5)安装
安装步骤: http://blog.csdn.net/xiaodong193/article/details/51920283 注意:安装软件前需要阅读其中的README.txt,可快速知道安装方法, ...