《Python网络爬虫:从入门到实践》3.4.3自我实践题:
获取豆瓣网上TOP250电影的英文名、港台名、导演、主演、上映年份、电影分类及评分。
学习嘛,就费了点劲自己试了一下,挺耽误时间的,不过好在搞出来了,书上给的代码有点问题,不够全面。
现在把自己测试过的源代码给大家分享出来,供大家学习借鉴,正好正则表达式一起学了,还是很有收获的。
由于电影的英文名、港台名爬取过滤比较麻烦,太耽误时间,所以忽略掉了,知道怎么弄就行。
代码测试时间是11月8日。
以下是 rmv_by_re 模块中的 rmv_by_re 函数。
import redef 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 requestsimport rmv_by_reimport timefrom 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': ''}allcontents = []for i in range(0,10):link = '/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爬虫特别感兴趣的爱好者学习,浅尝辄止的估计看不下去。有疑问的可以给我留言,有时间的话我会解答。