- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python爬取内容存入Excel实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近老师布置了个作业,爬取豆瓣top250的电影信息。按照套路,自然是先去看看源代码了,一看,基本的信息竟然都有,心想这可省事多了。简单分析了下源代码,标记出所需信息的所在标签,ok,开始干活! 。
鉴于正则表达式的资料已经看了不少,所以本次除了beautifulsoup外,还有些re的使用,当然,比较简单。而爬到信息后,以往一般是存到txt文件,或者数据库中,老是重样的操作,难免有些‘厌倦'。心想,干嘛不存到excel表呢?对啊,可以存到excel表.
环境准备:pip install openpyxl (假设你已配好了python环境) 。
好了,废话少说,上代码。 。
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# coding=utf-8
'''
function:爬取豆瓣top250的电影信息,并写入excel文件
'''
import
requests
import
re
from
openpyxl
import
workbook
# 写入excel表所用
from
openpyxl
import
load_workbook
# 读取excel表所用
from
bs4
import
beautifulsoup as bs
import
os
os.chdir(
'c:\users\administrator\desktop'
)
# 更改工作目录为桌面
def
gethtml(src):
html
=
requests.get(src).content
getdata(html, src)
# 首页链接和其他页不同,所以单独获取信息
urls
=
re.findall(
'href="(.*filter=?)'
, html)
# re获取获取跳转链接的href
for
u
in
range
(
len
(urls)
-
2
):
# 匹配到的跳转链接最后两个重复,需去掉
next_url
=
'https://movie.douban.com/top250'
+
urls[u]
html
=
requests.get(next_url).content
getdata(html, next_url)
def
getdata(html, num_url):
# html:网页源码 ,num_url:页面链接
global
ws
# 全局工作表对象
name
=
[]
# 存储电影名
dr
=
[]
# 存储导演信息
ma
=
[]
# 存储主演信息
si
=
[]
# 存储简介
r_score
=
[]
# 存储评分
r_count
=
[]
# 存储评论人数
r_year
=
[]
# 存储年份
r_area
=
[]
# 存储地区
r_about
=
[]
# 存储剧情类型
soup
=
bs(html,
'lxml'
)
for
n
in
soup.find_all(
'div'
,
class_
=
'hd'
):
# ts = n.contents[1].text # 得到电影的所有名称
ts
=
n.contents[
1
].text.strip().split(
'/'
)[
0
]
# 得到电影中文名
name.append(ts)
for
p
in
soup.find_all(
'p'
,
class_
=
''):
infor
=
p.text.strip().encode(
'utf-8'
)
#此处用utf-8编码,以免下面查找 ‘主演'下标报错
ya
=
re.findall(
'[0-9]+.*\/?'
, infor)[
0
]
# re得到年份和地区
r_year.append(ya.split(
'/'
)[
0
])
# 得到年份
r_area.append(ya.split(
'/'
)[
1
])
# 得到地区
r_about.append(infor[infor.rindex(
'/'
)
+
1
:])
# rindex函数取最后一个/下标,得到剧情类型
try
:
sub
=
infor.index(
'主演'
)
# 取得主演下标
dr.append(infor[
0
:sub].split(
':'
)[
1
])
# 得到导演信息
mh
=
infor[sub:].split(
':'
)[
1
]
# 得到主演后面的信息
ma.append(re.split(
'[1-2]+'
, mh)[
0
])
# 正则切片得到主演信息
except
:
print
'无主演信息'
dr.append(infor.split(
':'
)[
1
].split(
'/'
)[
0
])
ma.append(
'无介绍...'
)
for
r
in
soup.find_all(
'div'
,
class_
=
'star'
):
rs
=
r.contents
# 得到该div的子节点列表
r_score.append(rs[
3
].text)
# 得到评分
r_count.append(rs[
7
].text)
# 得到评论人数
for
s
in
soup.find_all(
'span'
,
'inq'
):
si.append(s.text)
# 得到简介
if
len
(si) <
25
:
for
k
in
range
(
25
-
len
(si)):
si.append(
'本页有的电影没简介,建议查看核对,链接:'
+
num_url)
for
i
in
range
(
25
):
# 每页25条数据,写入工作表中
ws.append([name[i], r_year[i], r_area[i], r_about[i],
dr[i], ma[i], r_score[i], r_count[i], si[i]])
if
__name__
=
=
'__main__'
:
# 读取存在的excel表测试
# wb = load_workbook('test.xlsx') #加载存在的excel表
# a_sheet = wb.get_sheet_by_name('sheet1') #根据表名获取表对象
# for row in a_sheet.rows: #遍历输出行数据
# for cell in row: #每行的每一个单元格
# print cell.value,
# 创建excel表并写入数据
wb
=
workbook.workbook()
# 创建excel对象
ws
=
wb.active
# 获取当前正在操作的表对象
# 往表中写入标题行,以列表形式写入!
ws.append([
'电影名'
,
'年份'
,
'地区'
,
'剧情类型'
,
'导演'
,
'主演'
,
'评分'
,
'评论人数'
,
'简介'
])
src
=
'https://movie.douban.com/top250'
gethtml(src)
wb.save(
'test2.xlsx'
)
# 存入所有信息后,保存为filename.xlsx
|
代码中已有不少注释,这里说下爬取过程中遇到的小问题.
1.soup的contents方法,返回的是某标签下的子节点列表,但刚开始总是取不到想要的值,输出其长度后,有些傻眼..tm什么情况?有这么多的子节点吗?较真的我又去数了几遍,最后发现,它竟然连"换行"都算作是子节点!莫名地有点方...不知各位有没有遇到过.
如图,我按列表下标标记,0,2,4,6,8是换行,但也被算作子节点... 。
2.还是contents方法,代码中的 '#得到电影所有名称' 处的代码 n.contents[1]获取的除了a标签外,还有其下的span标签,这是为何?它们算一个整体?
3.对如下图的电影信息处理时,出现了几处错误,原因有以下几点:
(1)部分电影没有主演信息... 。
(2)主演信息为这样'主演: ',就一个主演字样,无内容 。
(3)部分电影没有简介 。
(4)当主演信息中没有'...'时,获取主演信息受阻 。
解决方案:(1)(2)都是主演问题,判断是否存在即可。(我以捕获异常处理) 。
(3)是简介问题,我无法给出具体哪部电影没有简介,但给了该电影所在的页面链接,可访问核查。(貌似有点笨) 。
(4)获取受阻是因为后面没有精确定位点,最后以re.split('[1-2]+')方法解决,匹配年份第一位作为分片点 。
本次分享就到这儿了,最后,照旧放几张结果图吧.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/Dick633/article/details/79933772 。
最后此篇关于python爬取内容存入Excel实例的文章就讲到这里了,如果你想了解更多关于python爬取内容存入Excel实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!