- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python利用lxml模块爬取豆瓣读书排行榜的方法与分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
上次使用了beautifulsoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢。本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快.
本次爬取的豆瓣书籍排行榜的首页地址是:
https://www.douban.com/doulist/1264675/?start=0&sort=time&playable=0&sub_type= 。
该排行榜一共有22页,且发现更改网址的 start=0 的 0 为25、50就可以跳到排行榜的第2、第三页,所以后面只需更改这个数字然后通过遍历就可以爬取整个排行榜的书籍信息.
本次爬取的内容有书名、评分、评价数、出版社、出版年份以及书籍封面图,封面图保存为图片,其他数据存为csv文件,方面后面读取分析.
本次的项目步骤:1、分析网页,确定爬取数据 。
2、使用lxml库爬取内容并保存 。
3、读取数据并选择部分内容进行分析 。
步骤一:
分析网页源代码可以看到,书籍信息在属性为的div标签中,打开发现,我们需要爬取的信息都在标签内部,通过xpath语法我们可以很简便的爬取所需内容.
(书籍各类信息所在标签) 。
所需爬取的内容在 class为post、title、rating、abstract的div标签中.
步骤二:
先定义爬取函数,爬取所需内容执行函数,并存入csv文件 。
具体代码如下: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import
requests
from
lxml
import
etree
import
time
import
csv
#信息头
headers
=
{
'user-agent'
:
'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/73.0.3683.103 safari/537.36'
}
#定义爬取函数
def
douban_booksrank(url):
res
=
requests.get(url, headers
=
headers)
selector
=
etree.html(res.text)
contents
=
selector.xpath(
'//div[@class="article"]/div[contains(@class,"doulist-item")]'
)
#循环点
for
content
in
contents:
try
:
title
=
content.xpath(
'div/div[2]/div[3]/a/text()'
)[
0
]
#书名
scores
=
content.xpath(
'div/div[2]/div[4]/span[2]/text()'
)
#评分
scores.append(
'9.0'
)
#因为有一些书没有评分,导致列表为空,此处添加一个默认评分,若无评分则默认为9.0
score
=
scores[
0
]
comments
=
content.xpath(
'div/div[2]/div[4]/span[3]/text()'
)[
0
]
#评论数量
author
=
content.xpath(
'div/div[2]/div[5]/text()[1]'
)[
0
]
#作者
publishment
=
content.xpath(
'div/div[2]/div[5]/text()[2]'
)[
0
]
#出版社
pub_year
=
content.xpath(
'div/div[2]/div[5]/text()[3]'
)[
0
]
#出版时间
img_url
=
content.xpath(
'div/div[2]/div[2]/a/img/@src'
)[
0
]
#书本图片的网址
img
=
requests.get(img_url)
#解析图片网址,为下面下载图片
img_name_file
=
'c:/users/lenovo/desktop/douban_books/{}.png'
.
format
((title.strip())[:
3
])
#图片存储位置,图片名只取前3
#写入csv
with
open
(
'c:\\users\lenovo\desktop\\douban_books.csv'
,
'a+'
, newline
=
'
', encoding='
utf
-
8
')as fp:
#newline 使不隔行
writer
=
csv.writer(fp)
writer.writerow((title, score, comments, author, publishment, pub_year, img_url))
#下载图片,为防止图片名导致格式错误,加入try...except
try
:
with
open
(img_name_file,
'wb'
)as imgf:
imgf.write(img.content)
except
filenotfounderror
or
oserror:
pass
time.sleep(
0.5
)
#睡眠0.5s
except
indexerror:
pass
#执行程序
if
__name__
=
=
'__main__'
:
#爬取所有书本,共22页的内容
urls
=
[
'https://www.douban.com/doulist/1264675/?start={}&sort=time&playable=0&sub_type='
.
format
(
str
(i))
for
i
in
range
(
0
,
550
,
25
)]
#写csv首行
with
open
(
'c:\\users\lenovo\desktop\\douban_books.csv'
,
'a+'
, newline
=
'
', encoding='
utf
-
8
')as f:
writer
=
csv.writer(f)
writer.writerow((
'title'
,
'score'
,
'comment'
,
'author'
,
'publishment'
,
'pub_year'
,
'img_url'
))
#遍历所有网页,执行爬取程序
for
url
in
urls:
douban_booksrank(url)
|
爬取结果截图如下:
步骤三:
本次使用python常用的数据分析库pandas来提取所需内容。pandas的read_csv()函数可以读取csv文件并根据文件格式转换为series、dataframe或面板对象.
此处我们提取的数据转变为dataframe(数据帧)对象,然后通过matplotlib绘图库来进行绘图.
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
from
matplotlib
import
pyplot as plt
import
pandas as pd
import
re
plt.rcparams[
'font.sans-serif'
]
=
[
'simhei'
]
#用来正常显示中文标签
plt.rcparams[
'axes.unicode_minus'
]
=
false
#用来正常显示负号
plt.subplots_adjust(wsapce
=
0.5
, hspace
=
0.5
)
#调整subplot子图间的距离
pd.set_option(
'display.max_rows'
, none)
#设置使dataframe 所有行都显示
df
=
pd.read_csv(
'c:\\users\lenovo\desktop\\douban_books.csv'
)
#读取csv文件,并赋为dataframe对象
comment
=
re.findall(
'\((.*?)人评价'
,
str
(df.comment), re.s)
#使用正则表达式获取评论人数
#将comment的元素化为整型
new_comment
=
[]
for
i
in
comment:
new_comment.append(
int
(i))
pub_year
=
re.findall(r
'\d{4}'
,
str
(df.pub_year),re.s)
#获取书籍出版年份
#同上
new_pubyear
=
[]
for
n
in
pub_year:
new_pubyear.append(
int
(n))
#绘图
#1、绘制书籍评分范围的直方图
plt.subplot(
2
,
2
,
1
)
plt.hist(df.score, bins
=
16
, edgecolor
=
'black'
)
plt.title(
'豆瓣书籍排行榜评分分布'
, fontweight
=
700
)
plt.xlabel(
'scores'
)
plt.ylabel(
'numbers'
)
#绘制书籍评论数量的直方分布图
plt.subplot(
222
)
plt.hist(new_comment, bins
=
16
, color
=
'green'
, edgecolor
=
'yellow'
)
plt.title(
'豆瓣书籍排行榜评价分布'
, fontweight
=
700
)
plt.xlabel(
'评价数'
)
plt.ylabel(
'书籍数量(单位/本)'
)
#绘制书籍出版年份分布图
plt.subplot(
2
,
2
,
3
)
plt.hist(new_pubyear, bins
=
30
, color
=
'indigo'
,edgecolor
=
'blue'
)
plt.title(
'书籍出版年份分布'
, fontweight
=
700
)
plt.xlabel(
'出版年份/year'
)
plt.ylabel(
'书籍数量/本'
)
#寻找关系
plt.subplot(
224
)
plt.bar(new_pubyear,new_comment, color
=
'red'
, edgecolor
=
'white'
)
plt.title(
'书籍出版年份与评论数量的关系'
, fontweight
=
700
)
plt.xlabel(
'出版年份/year'
)
plt.ylabel(
'评论数'
)
plt.savefig(
'c:\\users\lenovo\desktop\\douban_books_analysis.png'
)
#保存图片
plt.show()
|
这里需要注意的是,使用了正则表达式来提取评论数和出版年份,将其中的符号和文字等剔除.
分析结果如下:
本次分析的内容也较为简单,从上面的几个图形中我们也能得出一些结论.
这些高分书籍中绝大多数的评论数量都在50000以下;多数排行榜上的高分书籍都出版在2000年以后;出版年份在2000年后的书籍有更多的评论数量.
以上数据也见解的说明了在进入二十世纪后我国的图书需求量更大了,网络更发达,更多人愿意发表自己的看法.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持.
原文链接:https://www.cnblogs.com/berryguotoshare/p/10708143.html 。
最后此篇关于Python利用lxml模块爬取豆瓣读书排行榜的方法与分析的文章就讲到这里了,如果你想了解更多关于Python利用lxml模块爬取豆瓣读书排行榜的方法与分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下xml文件 10.10.0.135::3111 10.10.0.130::3111 10.10.0.129::3111 10.
我已经为 PyPy 创建了一个 virtualenv: virtualenv test -p `which pypy` source test/bin/activate 我安装了以下依赖项: sudo
我正在尝试使用 lxml 的 ElementTree etree 在我的 xml 文档中查找特定标签。标签如下所示: 12 我希望使用 etree.find('text:statedAge
在 python 3.5 项目中,我必须读取一些 xml 文件,因此我决定使用 lxml 库。由于我正在阅读文件,因此根据文档执行此操作的最有效方法是使用 lxml.etree.parse(...)
执行 pip install lxml 或 pip install pyquery 会出现此错误: gcc: error trying to exec 'cc1': execvp: No such f
我正在使用下面的代码获取一个部分的所有 html 内容以保存到数据库 el = doc.get_element_by_id('productDescription') lxml.html.tostri
我想以可区分的方式打印出 etree 的树结构(由 html 文档形成)(意味着两个 etree 应该以不同的方式打印出来)。 我所说的结构是指树的“形状”,基本上是指所有标签,但没有属性,也没有文本
谁能解释为什么第一次调用 root.cssselect() 有效,而第二次失败? from lxml.html import fromstring from lxml import etree htm
我收到此错误“ImportError: No module named lxml”,即使确实安装了 LXML。具体来说,它安装在项目的 python Virtualenv 中。最终我正在研究 Pyth
我在 Windows 32 位上使用 Anaconda v4.2 和 Python 3.5,并想使用 lxml etree。我的 Anaconda 发行版包括 lxml 3.6.4,但我的 IDE(P
我有一个脚本,可以从 URL 列表的 XML 文件中提取一些术语。所有 URL 都可以访问 XML 数据。 它在第一次正确打开、解析和提取时工作正常,但随后在过程中被某些 XML 文件中断并出现此错误
我正在使用 mechanize/cookiejar/lxml 来读取页面,它适用于某些页面但不适用于其他页面。我在其中遇到的错误是标题中的错误。我不能在这里发布页面,因为它们不是 SFW,但是有没有办
这是一个基本的问题,我实际上在文档中找不到它:-/ 如下: img = house_tree.xpath('//img[@id="mainphoto"]')[0] 如何获取 的 HTML标记? 我尝
我只想说,这个问题我已经在Pip is already installed: but I am getting no module named lxml看到了并且已经看到关于以非 root 用户身份安
我通过 pip 安装了 lxml 3.3.5。现在我在运行一些 Django 测试时遇到了问题: Traceback (most recent call last): File "manage.p
我有一个 Django 应用程序,其中包含 Tastypie 提供的 RESTFull 服务。我使用 easy_install 安装 lxml 和 defusedxml,这样我就可以使用 xml 而不
我正在使用 lxml etree 创建 xml 或 REST 调用。我有命名空间的问题,因为如果没有正确制定,我会从服务器收到语法错误。 正如您在以下 2 个示例中所看到的,我应该得到例如 ns1、n
我对导航具有 lxml.etree namespace 的 xml 文档感到有些困惑。 .我已经看到了一些关于这个主题的主题( 1 、 2 )以及 lxml docs但仍然没有想出答案。 xml =
由于各种原因,我试图从lxml.html.fromstring()切换到lxml.html.html5parser.document_fromstring()。两者之间的最大区别是,第一个返回lxml
我需要通过向现有元素添加子元素来修改现有的 xml 文件。我使用 lxml 库。 Eric Idle 999-999-999 555-555-555
我是一名优秀的程序员,十分优秀!