自定义获取豆瓣网电影TOP250里的排名数量
主要思路:先由requests库获取html基本信息,然后用BeautifulSoup来进行html.parser格式解析,逐个获取Tag属性,并且对内容进行字符串切片,字符串匹配,保存得到电影名称,地点,日期。
from bs4 import BeautifulSoup
import requests
import re #由于中文编码的原因需要重新计算中文所占长度
def SuperLen(s):
sum_len=len(s)
chi_len=len(re.sub('[a-zA-Z]','',s))
eng_len=sum_len-chi_len
return (chi_len*2+eng_len)
#此函数功能是准确得到中英文混合字符串所占长度 #由于每页只有25个电影,所以用户需求电影数目不同页数(URL)也就不同
def Get_Page(n):
if n%25!=0:
num=int(n/25)+1
else:
num=int(n/25)
return num
#此函数功能是获取页数 #根据所需参数页数来对应不同的URL
def Num_Get_Soup(n):
url='https://movie.douban.com/top250?start='+str(n)+'&filter='
resul=requests.get(url)
soup=BeautifulSoup(resul.text,'html.parser')
return soup
#此函数功能就是对URL进行requests.get 以获取对应的BeautifulSoup #使用BeautifulSoup
def Get_Name_Date_Locat(nums):
NAME=[]
Date=[]
Locat=[]
for j in range(Get_Page(nums)): #获取页数,进行循环操作
soup=Num_Get_Soup(j*25) #根据不同页数的不同URL获取soup
Name_temp=soup.find_all('img','',limit=25) #获取名称Tag,数目最大且为25
Date_Locat_temp=soup.find_all('p','',limit=25)#获取日期 地点Tag
for i in Name_temp:
NAME.append(i.attrs['alt']) #对获取的Tag获取属性
for l in Date_Locat_temp:
stemp=str(l)
Date.append(re.sub('\D','',stemp.split('\xa0')[-5])[:4]) #对字符串切片后进行字符串匹配获取数字日期
Locat.append(stemp.split('\xa0')[-3]) #字符串切片获取地点
return (NAME,Date,Locat) #此函数功能是格式化写入文件
def Write_text(n,N,D,L):
f=open('result.txt','w')
for i in range(n):
f.write(N[i]+'{}\t'.format((35-SuperLen(N[i]))*' '))
f.write(L[i]+'{}\t'.format((70-len(L[i]*2))*' '))
f.write(D[i])
f.write('\n')
f.close() #函数的开始
def Start():
nums=eval(input('请输入要爬取排名的个数0-250均可'))
print('Please Waitng........')
Name,Date,Locat=Get_Name_Date_Locat(nums)
Write_text(nums,Name,Date,Locat)
print('Complete!') Start()
效果图:
可改进思路:正则表达和字符串切片的使用可以再合理一些,格式化保存文件也可以再简化。