我是靠谱客的博主 踏实发夹,这篇文章主要介绍跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib, bs, re, xlwt库),现在分享给大家,希望可以做个参考。
出于督促自己学习以及未来回顾和分享的目的,记录一下自己的学习过程。
B站视频号:BV12E411A7ZQ
ep15-25. 完成爬取信息,处理数据,保存到Excel。具体流程为:
1. 找到目标网页的URL,如果存在多页,需要确定URL定位和页数的关系;
2. 引入所需要的库:Urllib,BS4,BeautifulSoup,Re,Xlwt;
3. 结构顺序为:爬取网页源代码→解析源代码→获得所需数据信息→整理并保存数据
代码实现:
复制代码
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167# -*- coding = utf-8 -*- # @Time : 10/11/21 3:11 pm # @Author: YS # @File : 爬取豆瓣电影TOP250.py # @Software: PyCharm # 爬取豆瓣电影TOP250:名称、豆瓣评分、评价数、电影概况、电影链接(https://movie.douban.com/top250) # PS 爬虫实际上是爬取网页源代码 # 从网站获取信息,必须发送user-agent,读取cookie # 1.获取目标URL # 从网页浏览得到,每一页展示25个电影,共10页,每一页的URL对应(https://movie.douban.com/top250?start=X),期中X=开始编号-1 # 2.页面分析 # 开发者模式,查找elements,获得network访问详情 # 3.编码规范 # utf-8编码;多用函数;用main执行测试 # 4.引入模块 import bs4 # 网页解析 from bs4 import BeautifulSoup # 将源码解析为html,即分层结构 import re # 正则表达式,文字匹配 import urllib.request # 获取URL网页源码 import urllib.error # 检验访问错误 import xlwt # excel操作 import sqlite3 # 进行SQL def main(): baseurl = "https://movie.douban.com/top250?start=" # 1.爬取网页 askURL("https://movie.douban.com/top250?start=0") # 2.获得数据 datalist = getData(baseurl) # 3.保存数据 savepath = "/Users/zippoil/Desktop/豆瓣电影top250.xls" saveData(datalist, savepath) # 电影详情链接匹配规则 findlink = re.compile(r'<a href="(.*?)">') # 创建正则表达式规则,规则配合finall返回的是()中的内容 # 电影封面图匹配规则(链接) findcover = re.compile(r'<img.*src="(.*?)"', re.S) # .不匹配换行符,re.S可以让换行符也包含在.中 # 电影名匹配规则 findtitle = re.compile(r'<span class="title">(.*?)</span>') # 电影评分匹配规则 findrating = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>') # 电影评分人数匹配规则 findaudience = re.compile(r'<span>(d*)人评价</span>') # 此处锁定数字,贪婪匹配 # 电影概述匹配规则 findquote = re.compile(r'<span class="inq">(.*?)</span>') # 演职员,年份,产地,类型匹配规则 findcast = re.compile(r'<p class="">(.*?)</p>', re.S) def getData(baseurl): datalist = [] for i in range(0, 10): # 调用askURL十次, url = baseurl + str(i * 25) html = askURL(url) # 执行十次,拿到10页全部250部电影数据,因为askURL的末尾是return,所以可以存为html # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") # 解析html, 应用html解析器 # 重点:先在浏览器的开发者模式elements下分析,得到每个电影在<li> <div class="item">,具体信息在<div class="info">下 for item in soup.find_all('div', class_="item"): # 找到所有的div,且class="item",注意需要下划线_ # print(item) # 经过解析,在查找时会返回满足条件的内容及其所有下层内容 moviedata = [] # 保存一个电影的全部信息 item = str(item) # 获得电影详情链接 link = re.findall(findlink, item)[0] # 用re库通过正则表达式查找指定字符串,findall返回的是列表,限定0即储存第一个满足的链接 moviedata.append(link) # 获得电影封面图 cover = re.findall(findcover, item)[0] moviedata.append(cover) # 获得电影名 title = re.findall(findtitle, item) # 有时有外文名有时没有 if len(title) == 2: ctitle = title[0] ftitle = title[1].replace("/", "") # 去掉/符号 moviedata.append(ctitle) # 中文名 moviedata.append(ftitle) # 外文名 else: ctitle = title[0] moviedata.append(ctitle) moviedata.append("Null") # 没有外文名时,外文名列留空,保证最后导出效果 # 获得电影评分 rating = re.findall(findrating, item)[0] moviedata.append(rating) # 获得评分人数 audience = re.findall(findaudience, item)[0] moviedata.append(audience) # 获得电影概况 quote = re.findall(findquote, item) # 有的电影没有概述 if len(quote) != 0: quote = quote[0].replace("。", "") # 去掉句号 moviedata.append(quote) else: moviedata.append("Null") # 留空 # 获得演职员,年份,产地,类型 cast = re.findall(findcast, item)[0] cast = re.sub('<br(s+)?/>(s+)?', " ", cast) # 去掉<br/> cast = re.sub("/", " ", cast) # 去掉/ moviedata.append(cast.strip()) # 去掉空格 datalist.append(moviedata) print(datalist) return datalist # 得到指定一个URL的网页内容 def askURL(url): head = {} # 模拟浏览器头部 head["User-Agent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15") head["Cookie"] = ('"push_noty_num=0; _pk_id.100001.4cf6=efb4e3002bfde787.1614869431.12.1636645754.1636640031.; _pk_ses.100001.4cf6=*; push_doumail_num=0; __utma=30149280.1643107469.1614869431.1636640031.1636645556.13; __utmb=30149280.0.10.1636645556; __utmc=30149280; __utmz=30149280.1636645556.13.9.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ck=TgEX; __utma=223695111.1232125652.1614869431.1636640031.1636645556.11; __utmb=223695111.0.10.1636645556; __utmc=223695111; __utmz=223695111.1636645556.11.7.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1636645555%2C%22https%3A%2F%2Faccounts.douban.com%2F%22%5D; dbcl2="209250688:VZZbqQ9NL7M"; _vwo_uuid_v2=D1835B0D5A26110B33228387A3B3497D9|2102788b20e0c99e81d2963cb8bdb3fa; ct=y; __yadk_uid=torZWdjbSJlf3JWSODn5mmPq8OlrjQX1; douban-fav-remind=1; __gads=ID=8a8633abef7a1403-228e9d3403b90021:T=1614869431:RT=1614869431:S=ALNI_MZ_EI5P-8v7pmmlOjl6hZv5pH_7ng; bid=ua9QPwGvWYQ; ll="108296"') request = urllib.request.Request(url, headers=head) # 带着头部信息访问URL html = "" try: responce = urllib.request.urlopen(request) # 返回结果 html = responce.read().decode("utf-8") # print(html) except urllib.error.URLError as e: # 识别错误类型 if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html # 保存数据 def saveData(datalist, savepath): print("save...") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 建文件 sheet = book.add_sheet("豆瓣电影TOP250", cell_overwrite_ok=True) # 建工作簿 col = ("电影链接", "图片链接", "中文名", "外文名", "评分", "评价数", "概述", "相关信息") for i in range(0, 8, 1): sheet.write(0, i, col[i]) # 写入表头 for i in range(0, 250, 1): print("第%d条"%(i+1)) data = datalist[i] # 第i个电影信息整合的列表 for j in range(0, 8, 1): sheet.write(i+1, j, data[j]) print("yeah!!!") book.save(savepath) if __name__ == "__main__": # 当程序执行时 main()
最后
以上就是踏实发夹最近收集整理的关于跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib, bs, re, xlwt库)的全部内容,更多相关跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib,内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复