1,
实验目的:
(1)掌握使用requests库实现HTTP请求;
(2)掌握使用正则表达式解析网页;
(3)掌握使用文件存储数据。
实验内容:
(1)爬取豆瓣TOP250排行榜,使用requests库生成HTTP请求、查看状态码与编码;
(2)使用requests库处理请求头与响应头;
(3)使用正则表达式查找电影 TOP250的超链接;
(4)爬取豆瓣TOP 250页面,获取网页中的电影TOP250榜单信息;
(5)把获取的信息保存到本地的csv文件;
实现的思路:先获得电影TOP250的网页地址,通过一系列操作,获得其网页代码,通过正则获取每25个电影的网页地址,通过选择即可获得想要的电影排行榜。
代码实现
import requests
import re
import csv
li=[]
a='https://movie.douban.com/top250?start='
url="https://movie.douban.com/top250?start=50&filter="
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
}
resp=requests.get(url,headers=headers)
page_content = resp.text
obj1=re.compile(r'<a href=".*?start=(?P<uuu>.*?)"',re.S)
obj2=re.compile(r'<em class="">(?P<num>.*?)'
r'</em>.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<div class="bd">.*?导演:(?P<daoyan>.*?)'
r' .*?<span class="inq">(?P<yuyan>.*?)</span>', re.S)
result2 = obj1.finditer(page_content)
for it in result2:
lii=a + it.group('uuu')
li.append(lii)
#print(lii)
#print(li)
resp.close()
b = int(input("1-10个,一个有25个电影,请输入你要查询的电影的页码:"))
if b==1:
url = 'https://movie.douban.com/top250?start=0&filter='
elif b==2:
url = 'https://movie.douban.com/top250?start=25&filter='
elif b==3:
url = 'https://movie.douban.com/top250?start=50&amp;filter='
else:
url = li[b]
resp=requests.get(url,headers=headers)
page_content = resp.text
result1 = obj2.finditer(page_content)
print(url)
f =open("data.csv",mode="w",newline='',encoding='utf-8')
csvwrite = csv.writer(f)
for it in result1:
dic = it.groupdict()
csvwrite.writerow( dic.values() )
resp.close()
f.close()
print("over!")
演示结果:
2,
实验目的:把豆瓣TOP250的数据爬到csv文件中,对数据进行可视化。
实验步骤:
1,首先需要豆瓣排行网页的源代码,通过源代码找到十个小的网址,再通过选择的方式选择需要查询电影。
2,通过正则的方式获得每个电影的序号,电影名,导演,评分。
3,导入csv库,将数据存入csv文件中。
4,导入matplotlib库,制作排行榜与评分的关系,由于一次性数据过多,需要用到两个图进行可视化。
代码实现:
import requests
import re
import csv
import matplotlib.pyplot as plt #画图
import numpy as np #初始数据
li = []
labels1 = []
labels2 = []
graphname = []
ff = []
a='https://movie.douban.com/top250?start='
url="https://movie.douban.com/top250?start=50&filter="
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
}
resp=requests.get(url,headers=headers)
page_content = resp.text
obj1=re.compile(r'<a href=".*?start=(?P<uuu>.*?)"',re.S)
obj2=re.compile(r'<em class="">(?P<num>.*?)'
r'</em>.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<div class="bd">.*?导演:(?P<daoyan>.*?)'
r' .*?property="v:average">(?P<score>.*?)</span>', re.S)
result2 = obj1.finditer(page_content)
for it in result2:
lii=a + it.group('uuu')
li.append(lii)
#print(lii)
#print(li)
resp.close()
b = int(input("1-10个,一个有25个电影,请输入你要查询的电影的页码:"))
if b==1:
url = 'https://movie.douban.com/top250?start=0&filter='
elif b==2:
url = 'https://movie.douban.com/top250?start=25&filter='
elif b==3:
url = 'https://movie.douban.com/top250?start=50&amp;filter='
else:
url = li[b]
resp=requests.get(url,headers=headers)
page_content = resp.text
result1 = obj2.finditer(page_content)
print(url)
#将数据存入csv文件中
f =open("tt.csv",mode="w",newline='',encoding='utf-8')
csvwrite = csv.writer(f)
for it in result1:
dic = it.groupdict()
#print(dic)
graphname.append(dic['name'])
ff.append( float(dic['score']) )
csvwrite.writerow( dic.values() )
resp.close()
f.close()
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
for i in range(0,13):
labels1.append(graphname[i])
for i in range(13,25):
labels2.append(graphname[i])
#可视化 创建两个图
fig = plt.figure()
a1 = fig.add_subplot(211)
x = np.arange(0,13,1)
y = np.array(ff)[x] #索引数组去索引一个列表,即诸如list[indexarray]的形式,np.array(list)[indexarray]
plt.ylabel('评分')
plt.xlabel('豆瓣排名top250')
plt.xticks(range(0,13,1),labels=labels1 )
plt.plot(x,y,color='red',linestyle='-',linewidth=2,marker='^')
a2 = fig.add_subplot(212)
x = np.arange(13,25,1)
y = np.array(ff)[x]
plt.ylabel('评分')
plt.xlabel('豆瓣排名top250')
plt.xticks(range(13,25,1),labels=labels2 )
plt.plot(x,y,color='red',linestyle='-',linewidth=2,marker='^')
plt.show()
print("over!")
爬取到csv文件:
数据可视化: