应用xlwt爬取豆瓣电影Top250实例

使用requests、re、BeautifulSoup、xlwt库来实现爬取豆瓣电影top250相关信息

程序

程序加了详细的注释,便于理解

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
# -*- coding=utf-8 -*-
# @Time : 2021/4/21 19:10
# @Auther : Tianze
# @File : crawler.py
# @Software : PyCharm

from bs4 import BeautifulSoup #网页解析,获取数据
import requests #HTTP请求
import re #正则表达式,进行文字匹配
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作

def main():
url="https://movie.douban.com/top250?start="
#1.爬取网页
datalist=getData(url)
#2.逐一解析数据,边爬边解析
#3.保存数据
savepath=".\\豆瓣电影Top250.xls"
saveData(datalist,savepath) #按住ctrl点击函数,可以快速跳转定位

#电影链接的规则
findlink=re.compile(r'<a href="(.*?)">') #.*?表示非贪婪模式
#电影图片
findImgSrc=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>')
#评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#电影寓意
findInt=re.compile(r'<span class="inq">(.*?)</span>')
#电影相关信息
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)


#爬取网页
def getData(url):
datalist=[]
for i in range(0,10): #调用10次
url1=url+str(i*25)
html=getURL(url1)

#2.逐一解析数据,边爬边解析
soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all("div",class_="item"): #查找符合要求的字符串,形成列表
#print(item) #测试,查看电影item信息
data=[] #保存一部电影的所有信息
item=str(item)

#电影链接:
link=re.findall(findlink,item)[0] #通过正则表达式查找指定字符串
data.append(link) #添加电影链接
imgSrc=re.findall(findImgSrc,item)[0]
data.append(imgSrc) #添加图片链接
titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外国名
if len(titles)==2:
ctitle=titles[0]
data.append(ctitle) #添加中文名
otitle=titles[1].replace("/","") #去掉无关符号
data.append(otitle) #添加外国名
else:
data.append(titles[0])
data.append(" ") #外国名字留空
rating=re.findall(findRating,item)[0]
data.append(rating) #添加评分
judgeNum=re.findall(findJudge,item)[0]
data.append(judgeNum) #添加评价人数
inq=re.findall(findInt,item)
if len(inq)!=0:
inq=inq[0].replace("。",'') #去掉句号
data.append(inq) #添加寓意
else:
data.append(" ") #留空
bd=re.findall(findBd,item)[0]
bd=re.sub("<br(\s)?/>(\s+)?"," ",bd) #替换<br/>
bd=re.sub("/"," ",bd) #替换/
data.append(bd.strip()) #去掉前后的空格
datalist.append(data) #把处理好的一部电影信息放入datalist
return datalist

#得到指定URL的网页内容
def getURL(url):
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
}
html=""
try:
res=requests.get(url=url,headers=headers)
html=res.text
#print(html)
except requests.HTTPError as err:
if hasattr(err,"code"):
print(err.code)
if hasattr(err,"reason"):
print(err.reason)
return html

#保存数据
def saveData(datalist,savepath):
print("[*]开始爬取")
book=xlwt.Workbook(encoding="utf-8") #创建workbook对象
sheet=book.add_sheet("豆瓣电影top250") #创建工作表
col=('电影链接','图片链接','电影中文名','电影外国名','评分','评价人数','寓意','相关信息')
for i in range(len(col)):
sheet.write(0,i,col[i]) #列名
for i in range(0,250):
print("第{}条".format(i+1))
data=datalist[i]
for j in range(len(col)):
sheet.write(i+1,j,data[j])
book.save(savepath) #保存数据表

if __name__=="__main__":
main()
print("[*]爬取完毕")
#getData("https://movie.douban.com/top250?start=")

结果

程序运行后,在同级目录下生成了一个”豆瓣电影Top250.xls”文件:

image-20210511085313798

跟着up主做的第一个爬虫,深刻地感受到了爬虫的便利和强大

参考

https://www.bilibili.com/video/BV12E411A7ZQ?t=1236&p=25

https://blog.csdn.net/lxcnn/article/details/4756030

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2021 Blog of Tianze

请我喝杯咖啡吧~

支付宝
微信