《Python网络爬虫:从入门到实践》3.4.3自我实践题:
获取豆瓣网上TOP250电影的英文名、港台名、导演、主演、上映年份、电影分类及评分。
学习嘛,就费了点劲自己试了一下,挺耽误时间的,不过好在搞出来了,书上给的代码有点问题,不够全面。
现在把自己测试过的源代码给大家分享出来,供大家学习借鉴,正好正则表达式一起学了,还是很有收获的。
由于电影的英文名、港台名爬取过滤比较麻烦,太耽误时间,所以忽略掉了,知道怎么弄就行。
代码测试时间是2019年11月8日。
以下是 rmv_by_re 模块中的 rmv_by_re 函数。
import re
def rmv_by_re(regex,somelist,num):
"""根据正则表达式的结构和分组号替换列表中元素"""
results = []
for y in range(0,len(somelist)):
r = re.search(regex,somelist[y])
if r != None :
results.append(r.group(num))
else:
results.append(somelist[y])
return results
以下是主程序:
#3.4.3自我实践题
import requests
import rmv_by_re
import time
from bs4 import BeautifulSoup
# 导演
dirs = []
# 主演
acts = []
# 年份
year = []
# 类别
categories = []
# 评分
grades = []
def show_lists(dirs,acts,year,categories,grades):
print("共有",len(dirs),"个导演:",dirs)
print("对应的",len(acts),"组主演:",acts)
print(len(year),"部电影的出品年份:",year)
print(len(categories),"部电影的类别:",categories)
print(len(grades),"部电影的评分:",grades)
def get_top250details(dirs,acts,year,categories,grades):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x'
+ '64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom'
+ 'e/70.0.3538.102 Safari/537.36 Edge/18.18362',
'Host': 'movie.douban.com'
}
allcontents = []
for i in range(0,10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r = requests.get(link,headers=headers,timeout=15)
soup = BeautifulSoup(r.text,"html.parser")
# 提取评分列表
for one in soup.find_all("span",class_="rating_num"):
grades.append(str(one.text.strip()))
# 提取包含导演、主演、年份、类别的 p 标签
for everyone in soup.find_all("p",class_=''):
allcontents.append(str(everyone))
if i == 9:
# 提取导演、主演名字的正则表达式
dir_maj_re= '导演:\s*(.*?)\s*主(演:)?\s*(.*[\S$])\s*<'
# 提取年份的正则表达式
year_re = '(20|19|18)[0-9]{2}'
# 提取类别的正则表达式
cate_re = '(20|19|18)[0-9]{2}.*?/.*?/\s*(.*[^\s$])'
for num in range(0,len(allcontents)):
if "主"not in allcontents[num] :
dirs.append(rmv_by_re.rmv_by_re('导演:\s*(.*[\S$])\s*<',allcontents,1)[num])
else:
dirs.append(rmv_by_re.rmv_by_re(dir_maj_re,allcontents,1)[num])
if "主"not in allcontents[num] :
acts.append("(未提供)")
else:
acts.append(rmv_by_re.rmv_by_re(dir_maj_re,allcontents,3)[num])
year.append(rmv_by_re.rmv_by_re(year_re,allcontents,0)[num])
categories.append(rmv_by_re.rmv_by_re(cate_re,allcontents,2)[num])
time.sleep(3)
get_top250details(dirs,acts,year,categories,grades)
show_lists(dirs,acts,year,categories,grades)
这本书还是不错,适合对Python爬虫特别感兴趣的爱好者学习,浅尝辄止的估计看不下去。有疑问的可以给我留言,有时间的话我会解答。