1、通过requests.get获取页面html代码
2、通过lxml的etree模块配合xpath方法获取需要的内容
3、json文件的加载和提取相关内容
4、其它:for语句、字符串截取、元祖的使用等
在经过一段时间学习python的基本知识,同时也照葫芦画瓢了一段时间后,编写了下面的python程序,实现对时光网电影TOP100的电影信息进行提取。
#-*- coding=utf-8 -*-
import requests
import time
import json
from lxml import etree
#获取页面的html并返回etree
def get_html_tree(url,headers):
resp = requests.get(url,headers=headers).text
resp_tree = etree.HTML(resp)
return resp_tree
#获取初始页的电影链接
def get_movie_link(resp_tree):
links = resp_tree.xpath('//div[@class="mov_con"]//h2/a/@href')
return links
#对每个电影页面进行解析
def parse_page(movie_tree,movie_id):
#从json中获取电影评分
surl = 'http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http%3A%2F%2Fmovie.mtime.com%2F'+movie_id+'%2F&Ajax_CallBackArgument0='+movie_id
sresp = requests.get(surl,headers=headers)
b = sresp.text.find('MovieId')
e = sresp.text.find('IP":0')
sjson = json.loads(sresp.text[b-2:e+6])
s = sjson['RatingFinal']
#获取电影名称,年份和内容简介
name = movie_tree.xpath('//div[@class="db_head"]//h1/text()')
year = movie_tree.xpath('//div[@class="db_head"]//p/a/text()')
content = movie_tree.xpath('//*[@id="movie_warp"]//dl/dt/p[1]/text()')
return name,s,year,content
#获取下一页的链接
def get_page_links(resp_tree):
all_page_links = resp_tree.xpath('//*[@id="PageNavigator"]/a/@href')
return all_page_links
def main():
global headers
url = 'http://www.mtime.com/top/movie/top100/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
top = 1
for page in range(2,12):
resp_tree = get_html_tree(url,headers)
links = get_movie_link(resp_tree)
for link in links:
movie_tree = get_html_tree(link,headers)
movie_id = str(link)[23:-1]
movie=parse_page(movie_tree,movie_id)
print('%d:' %top, '电影名称:%s' %movie[0])
print('评分:%s' %movie[1])
print('年代:%s' %movie[2])
print('内容介绍:%s' %movie[3])
top += 1
url = 'http://www.mtime.com/top/movie/top100/index-%d.html' %page
if __name__ == '__main__':
main()
运行结果:
1: 电影名称:['肖申克的救赎']
评分:9.2
年代:['1994']
内容介绍:['银行家安迪因被陷害杀害妻子与她的情夫,被判两个终身监禁。入狱后,影片便以黑人狱友瑞德冷静的旁白来推进。监狱数十年如一日的改造会使原本自由的心灵习惯了牢笼的禁锢,而这也将是安迪的命运?', '全球各地的新一代电影人也都在逐步扬名,中国的第五代导演走上了历史舞台,日本的黑泽明大师虽然步..']
2: 电影名称:['盗梦空间']
评分:9.1
年代:['2010']
内容介绍:['多姆·柯布能够潜入人们的梦境中,窃取潜意识中有价值的秘密,这也使他成为了一名国际逃犯。为了重回原本的生活,柯布和他的团队接受了一项任务,这次不是窃取思想,而是植入思想。如果他们成功,这就是一次完美犯罪。', '在《盗梦空间》中扮演小李子岳父的演员迈克尔·凯恩近日揭开了结尾的谜底,或许你早已经猜出来了,..']
3: 电影名称:['阿甘正传']
评分:9.1
年代:['1994']
内容介绍:['阿甘的智商只有75,但凭借跑步的天赋,他顺利大学毕业。在越南战场,他结识了“捕虾迷”布巴和丹中尉。回国后,阿甘机缘巧合累积了大量资产。不过,钱并不是阿甘所看重的东西。阿甘和珍妮青梅竹马,可珍妮有自己的梦想……', '在距离《阿甘正传》问世20多年后,2D蓝光版首次引进中国大陆,并由泰盛文化发行。']
虽然对于python的知识点已经看了很多遍,但是在真正编写程序时发现自己还是有很多不懂的地方。比如电影的评分,直接通过html代码无法获得,需要通过json的url获得相关的代码,再从中提取电影评分。虽然代码还存在很多不完善的地方,这只是一个开端,继续努力学习,希望能够尽早掌握python的编程。
在写这个代码期间,看了很多文章,感谢大家的分享!