python爬虫代码豆瓣书籍(python爬取豆瓣书评)
豆瓣读书数据分析-python
豆瓣读书数据分析-python
(思路来自课程老师绿树)刚刚学完python数据分析的课程,决定做一个有关python数据分析的小项目,思来想去,还是决定分析豆瓣的数据,因为豆瓣是python写成的。用python爬虫抓取数据较为方便,比一般网站少很多页面bug问题,而且豆瓣上的数据量大概在million这个量级,算是算太大的,但也不小。正好手里有一份跑出的大概300多万的数据,直接开始分析。
首先导入数据,将数据赋给一个dataframe,取名为douban
douban=pd.read_table("douban.dat",sep="::",names=["user","book","rate"])
看一下这个数据的描述?
总共3648104行,其他的诸如平均数,中位数的值,是豆瓣书籍的链接后缀,并无实际意义。
然后关于豆瓣读书用户
user_count=douban.groupby('user').count()
user_count=user_count.sort('book',ascending=False)
、我们发现共有38万多读者,计数最多的一位eastwolf东狼,真的很厉害,一共写了4000多的书评。不过我们不排除这是个机器人或者公众号,因为4000度书评,就算一天看一本书,也要写11年,而豆瓣创建才不过11年。有点假,不过这个问题我们暂且不谈,仅从数据来看,第一名最爱读书的书霸,就是eastwolf了,大家鼓掌。
然后我们再来看一下书籍的信息
看一下描述
最受欢迎的书有2071个书评,平均每本书大概有45个书评。
看一下具体情况
我们挑出书评最多的10本,找到图片,就是以下这10本书
可以发现由于不同出版社不同翻译的问题,10本书实际是4本,豆瓣果然是文艺青年聚集地,《小王子》《追风筝的人》《活着》几乎就是文艺青年必备了。?
? 豆瓣做为文艺青年聚集地,本身用户属于素质较高的群体。里面分很多小组,读书,电影,音乐,算是给大家找志同道合之友的好地方。关于读书这个方面,在大家都很爱读书的基础上,我们可以用户进行聚类分析。依靠的根据是对书籍的打分,这样来计算不同用户之间的距离。因为读的书目越相似,对同一本书打分结果越接近,说明价值观越相同,找出这样的相似者,就能给用户推荐一下潜在的‘同志’,算是给豆瓣增加一个社交功能了。
? 首先我们把用户信息和书本信息结合,因为考虑到大部分书籍用户之间交集为空,而且我的电脑的处理能力有限,所以截取了用户和书籍的前100进行分析,这样得到一个新的dataframe
然后我们建立邻近性矩阵
ubrcore=doubancore.pivot('user','book','rate')?
即使在取前100的条件下,依然大部分是空白,为了能够计算,我们把空白处替换成0.
ubrcore1=ubrcore.fillna(value=0)
然后对要进行距离计算,由于本身对书本的打分在1到5之间,纯粹的大小差距并不大,所以我们更多的考虑在方向上的差异,所以用余弦距离来反应不同用户之间的差异性。
?构建公式,并将计算结果给userdistdf这个dataframe
Userdistdf结果如下
最像用户的就是他自己,余弦距离都是1。其他人只能是部分相像,果然人生得一知己难啊。不过知己找不到,我们可以给用户找10个部分相像的‘同志’
构建函数
试一下
Bingo,成功!!!!
这样,我们可以为用户qdmimi19810920找到了10个志同道合的‘同志’了。
如何用python爬取豆瓣读书的数据
这两天爬了豆瓣读书的十万条左右的书目信息,用时将近一天,现在趁着这个空闲把代码总结一下,还是菜鸟,都是用的最简单最笨的方法,还请路过的大神不吝赐教。
第一步,先看一下我们需要的库:
import requests ? ? ? ? ? ? ? ? ? ? ? #用来请求网页
from bs4 import BeautifulSoup ? ? ? ? #解析网页
import time ? ? ? ? ?#设置延时时间,防止爬取过于频繁被封IP号
import re ? ? ? ? ? ?#正则表达式库
import pymysql ? ? ? #由于爬取的数据太多,我们要把他存入MySQL数据库中,这个库用于连接数据库
import random ? ? ? ?#这个库里用到了产生随机数的randint函数,和上面的time搭配,使爬取间隔时间随机
这个是豆瓣的网址:x-sorttags-all
我们要从这里获取所有分类的标签链接,进一步去爬取里面的信息,代码先贴上来:
import requests
from bs4 import BeautifulSoup ? ? ? #导入库
url="httom/tag/?icn=index-nav"
wb_data=requests.get(url) ? ? ? ? ? ? ? ?#请求网址
soup=BeautifulSoup(wb_data.text,"lxml") ?#解析网页信息
tags=soup.select("#content div div.article div div table tbody tr td a")
#根据CSS路径查找标签信息,CSS路径获取方法,右键-检查-copy selector,tags返回的是一个列表
for tag in tags:
tag=tag.get_text() ? ?#将列表中的每一个标签信息提取出来
helf="hom/tag/"
#观察一下豆瓣的网址,基本都是这部分加上标签信息,所以我们要组装网址,用于爬取标签详情页
url=helf+str(tag)
print(url) ? ?#网址组装完毕,输出
以上我们便爬取了所有标签下的网址,我们将这个文件命名为channel,并在channel中创建一个channel字符串,放上我们所有爬取的网址信息,等下爬取详情页的时候直接从这里提取链接就好了,如下:
channel='''
tag/程序
'''
现在,我们开始第二个程序。
QQ图片20160915233329.png
标签页下每一个图片的信息基本都是这样的,我们可以直接从这里提取到标题,作者,出版社,出版时间,价格,评价人数,以及评分等信息(有些外国作品还会有译者信息),提取方法与提取标签类似,也是根据CSS路径提取。
我们先用一个网址来实验爬取:
url="htt/tag/科技"
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1] ? ?#从链接里面提取标签信息,方便存储
detils=soup.select("#subject_list ul li div.info div.pub") ?#抓取作者,出版社信息,稍后我们用spite()函数再将他们分离出来
scors=soup.select("#subject_list ul li div.info div.star.clearfix span.rating_nums") ? #抓取评分信息
persons=soup.select("#subject_list ul li div.info div.star.clearfix span.pl") ? ?#评价人数
titles=soup.select("#subject_list ul li div.info h2 a") ? #书名
#以上抓取的都是我们需要的html语言标签信息,我们还需要将他们一一分离出来
for detil,scor,person,title in zip(detils,scors,persons,titles):
#用一个zip()函数实现一次遍历
#因为一些标签中有译者信息,一些标签中没有,为避免错误,所以我们要用一个try来把他们分开执行
try:
author=detil.get_text().split("/",4)[0].split()[0] ? ? #这是含有译者信息的提取办法,根据“/” ?把标签分为五部分,然后依次提取出来
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0] ? #时间我们只提取了出版年份
price=ceshi_priceone(detil) ? ? ? ?#因为价格的单位不统一,我们用一个函数把他们换算为“元”
scoe=scor.get_text() if True else "" ? ?#有些书目是没有评分的,为避免错误,我们把没有评分的信息设置为空
person=ceshi_person(person) ? ? ?#有些书目的评价人数显示少于十人,爬取过程中会出现错误,用一个函数来处理
title=title.get_text().split()[0] ?
#当没有译者信息时,会显示IndexError,我们分开处理
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe="" ? ? ? ? #将detil信息划分为4部分提取,译者信息直接设置为空,其他与上面一样
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue ?
#出现其他错误信息,忽略,继续执行(有些书目信息下会没有出版社或者出版年份,但是数量很少,不影响我们大规模爬取,所以直接忽略)
except TypeError:
continue
#提取评价人数的函数,如果评价人数少于十人,按十人处理
def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person
#分情况提取价格的函数,用正则表达式找到含有特殊字符的信息,并换算为“元”
def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("\A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("\A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
实验成功后,我们就可以爬取数据并导入到数据库中了,以下为全部源码,特殊情况会用注释一一说明。
import requests
from bs4 import BeautifulSoup
import time
import re
import pymysql
from channel import channel ? #这是我们第一个程序爬取的链接信息
import random
def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person
def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("\A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("\A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
#这是上面的那个测试函数,我们把它放在主函数中
def mains(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1]
detils=soup.select("#subject_list ul li div.info div.pub")
scors=soup.select("#subject_list ul li div.info div.star.clearfix span.rating_nums")
persons=soup.select("#subject_list ul li div.info div.star.clearfix span.pl")
titles=soup.select("#subject_list ul li div.info h2 a")
for detil,scor,person,title in zip(detils,scors,persons,titles):
l = [] ?#建一个列表,用于存放数据
try:
author=detil.get_text().split("/",4)[0].split()[0]
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]
price=ceshi_priceone(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe=""
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue ?
except TypeError:
continue
l.append([title,scoe,author,price,time,publish,person,yizhe,tag])
#将爬取的数据依次填入列表中
sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)" ?#这是一条sql插入语句
cur.executemany(sql,l) ? #执行sql语句,并用executemary()函数批量插入数据库中
conn.commit()
#主函数到此结束
# 将Python连接到MySQL中的python数据库中
conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8')
cur = conn.cursor()
cur.execute('DROP TABLE IF EXISTS allbooks') ? #如果数据库中有allbooks的数据库则删除
sql = """CREATE TABLE allbooks(
title CHAR(255) NOT NULL,
scor CHAR(255),
author CHAR(255),
price CHAR(255),
time CHAR(255),
publish CHAR(255),
person CHAR(255),
yizhe CHAR(255),
tag CHAR(255)
)"""
cur.execute(sql) ?#执行sql语句,新建一个allbooks的数据库
start = time.clock() ? #设置一个时钟,这样我们就能知道我们爬取了多长时间了
for urls in channel.split():
urlss=[urls+"?start={}type=T".format(str(i)) for i in range(0,980,20)] ? #从channel中提取url信息,并组装成每一页的链接
for url in urlss:
mains(url) ? ? ? #执行主函数,开始爬取
print(url) ? ? ? ?#输出要爬取的链接,这样我们就能知道爬到哪了,发生错误也好处理
time.sleep(int(format(random.randint(0,9)))) ? #设置一个随机数时间,每爬一个网页可以随机的停一段时间,防止IP被封
end = time.clock()
print('Time Usage:', end - start) ? ?#爬取结束,输出爬取时间
count = cur.execute('select * from allbooks')
print('has %s record' % count) ? ? ? #输出爬取的总数目条数
# 释放数据连接
if cur:
cur.close()
if conn:
conn.close()
这样,一个程序就算完成了,豆瓣的书目信息就一条条地写进了我们的数据库中,当然,在爬取的过程中,也遇到了很多问题,比如标题返回的信息拆分后中会有空格,写入数据库中会出现错误,所以只截取了标题的第一部分,因而导致数据库中的一些书名不完整,过往的大神如果有什么办法,还请指教一二。
等待爬取的过程是漫长而又欣喜的,看着电脑上一条条信息被刷出来,成就感就不知不觉涌上心头;然而如果你吃饭时它在爬,你上厕所时它在爬,你都已经爬了个山回来了它还在爬时,便会有点崩溃了,担心电脑随时都会坏掉(还是穷学生换不起啊啊啊啊~)
所以,还是要好好学学设置断点,多线程,以及正则,路漫漫其修远兮,吾将上下而求索~共勉~
从python基础到爬虫的书有什么值得推荐
《Python3爬虫入门到精通课程视频【附软件与资料】【34课时】--崔庆才》百度网盘资源免费下载
链接:
?pwd=zxcv 提取码:zxcv
Python3爬虫入门到精通课程视频【附软件与资料】【34课时】--崔庆才|章节5: 分布式篇|章节4: 框架篇|章节3: 实战篇|章节2: 基础篇|章节1: 环境配置|Python3爬虫课程资料代码.zip|2018-Python3网络爬虫开发实战-崔庆才.pdf|课时06:Python爬虫常用库的安装.zip|课时05:Python多版本共存配置.zip|课时04:MySQL的安装.zip|课时03:Redis环境配置.zip|课时02:MongoDB环境配置.zip|课时01:Python3+Pip环境配置.zip|课时13:Selenium详解.zip ?
python爬虫有哪些书
python爬虫有哪些书?下面给大家介绍6本有关爬虫的书:
更多Python书籍推荐,可以参考这篇文章:《想学python看哪些书》
1.Python网络爬虫实战
本书从Python基础开始,逐步过渡到网络爬虫,贴近实际,根据不合需求选取不合的爬虫,有针对性地讲解了几种Python网络爬虫,所有案例源码均以上传网盘供读者使用,很是适合Python网络爬虫初学者使用。
相关推荐:《Python教程》
2.精通Python网络爬虫:核心技术、框架与项目实战
这本书代码全是基于Python3,本书基于Python从零基础开始,逐渐深入,再到爬虫框架到反爬到项目拭魅战,帮忙读者构建完整的知识系统,很是适合小白和刚接触爬虫的读者。
3.Python爬虫开发与项目实战
本书从爬虫涉及的多线程,多进程讲起,然后介绍web前真个基础知识,再到数据存储,网络协议,最后拭魅战项目,完全专注于Python爬虫,比较适合想要进阶Python爬虫的朋友。
4.用Python写网络爬虫
本书基础笼盖很全,把写一个爬虫所需的各个方面都写到,由于代码案例比较底层,所以适合有一定Python基础的小伙伴。
5.Python网络数据收集
作者是此行达人,代码优美简洁,运用年夜量递归算法和正则表达式,本书很好的利用Python完成从数据爬起到数据清洗整个流程的时间过程,更为难得的是用python3进行工程实践,而不只是讲解语法。
6.精通Scrapy网络爬虫
本书通过案例、源码,从零基础、逐步由浅入深进行详细讲解Python爬虫框架Scrapy,使读者能够对Scrapy框架有个清晰的认知,适用于有Python语言基础的读者。
Python 从入门到精通推荐看哪些书籍呢?
基础篇
1.《笨方法学Python》
《笨方法学Python》的英文版,最初的几章有点枯燥,但如果把书里面所有代码都敲一遍,确实能够把基础打好。
2.《Python学习手册》
这种外国人写的书,都有共同的特点,特别详细,每个知识点给你解释透透的,看的时候可以当作一个字典来翻,这本书确实是面向初学者的。
这本书的前几章是关于python语法的,最后几章是练习案例,但这些案例有点陈旧了,不做也罢。只是看前几章用来入门Python,那么这本书还是不错的。
这本书的前几章是关于python语法的,最后几章是练习案例,但这些案例有点陈旧了,不做也罢。只是看前几章用来入门Python,那么这本书还是不错的。
进阶篇
1.《流畅的python》
这本书的作者水平有点高,洋洋洒洒写了这么厚一本,关键是读的时候啊,感觉到处都有收获。前面几章是关于数据结构的,用上合适的数据结构,可以让代码更简洁,也可以让代码执行得更有效率。
2.《Python Cookbook》
又是一本大部头著作,图灵的书真的挺好,缺点就是太厚了。cookbook类的书呢,大体遵循的规律是,面对那一个一个具体的问题,我们该怎么办。有点类似QA,实操性拉满。这本书还把不同的问题给你分门别类了,查起来挺方便。看过后对于代码质量的提升,很有帮助。
就业篇
在就业篇里就需要分方向了。就业通常只学习python语法是不够的,还得掌握具体的学科知识。
1.web方向
(1)《Flask Web开发》
公司如果用python做web大多是初创的,大多用了flask,因为flask是一个小而美的框架,积累了大量第三方库,值得一学。
(2)《精通Django 3 Web开发》
2.人工智能方向
(1)《深度学习》
深度学习挺有名的书,理论深度足够。俗称“花书”。
(2)《利用Python进行数据分析》
用python做数据分析就得读这本。
读书破万卷,下笔如有神。这句古话说来是有道理的。学python推荐这些书籍,大家也可以先多去看看,这样对自己接下来的深入学习是十分有帮助的。
学习python爬虫推荐书籍
1、基础书籍:《Python编程》
豆瓣评分:9.1分
推荐指数:★★★★★
推荐理由:架构非常漂亮,针对所有层次的Python读者而作的Python入门书,完美描绘了Python的“景象”,没有教科书式的分章节阐释语法,没有太复杂的概念延伸。
适读群体:零基础、小白读者。
2、入门秘籍:《零基础入门学习Python》
豆瓣评分:8.7分
推荐指数:★★★★★
推荐理由:与B站小甲鱼视频配套书籍,适合小白入门的好书,不完全局限于Python,其他编程入门也非常适合,由浅入深,在普及概念的同时,逐渐加深大家对Python的认知。
适读群体:零基础、刚入门的读者。
3、经典好书:《利用Python进行数据分析》
豆瓣评分:8.6分
推荐指数:★★★★★
推荐理由:书中列举了大量具体的科学计算及数据分析的实践案例,被誉为“未来几年Python领域技术计算权威指南”。你将学会灵活运用各种Python库(如:NumPy、pandas、matplotlib、IPython等),来高效解决各种数据分析问题。
适读群体:刚接触Python的分析人员、刚接触科学计算的Python程序员等。
4、实用宝典:《Python网络数据采集》
豆瓣评分:7.7分
推荐指数:★★★★☆
推荐理由:本书使用简单易懂的强大机器语言Python,从原理到实战,介绍了如何用Python从网络服务器请求信息、如何对服务器的响应进行基本处理、如何以自动化手段与网站进行交互等网络数据采集基本原理,以及如何使用网络爬虫测试网站、自动化处理、如何通过更多的方式接入网络等实际操作。
适读群体:对Python网络数据采集、网站爬虫感兴趣的朋友。
5、兴趣读物:《Python数据挖掘入门与实践》
豆瓣评分:7.7分
推荐指数:★★★★☆
推荐理由:本书为数据挖掘入门读物,作者本身具备为多个行业提供数据挖掘和数据分析解决方案的丰富经验,循序渐进,带你轻松踏上数据挖掘之旅。
适读群体:对Python数据挖掘感兴趣者。
6、实战指南《Python数据可视化编程实战》
豆瓣评分:7.2分
推荐指数:★★★★☆
推荐理由:本书介绍了Python数据可视化最流行的库,用60+种方法呈现出美观的数据可视化效果,让读者从头开始了解数据、数据格式、数据可视化,并学会使用Python可视化数据。
适读群体:了解Python基础,对数据可视化感兴趣的读者。
7、爬虫至宝《Python 3网络爬虫开发实战》
豆瓣评分:9.0分
推荐指数:★★★★★
推荐理由:作者专业水平极高,从原理到开发实战,内容详尽且涉及面广,通过多个案例介绍了不同场景下如何实现数据爬取,通篇干货,无一点水分。
适读群体:适合有一定Python基础,或有开发经验想转爬虫方向的读者。