Python爬虫有他无可比拟的优势:语法简单,经常几十行代码就能轻松解决问题,相比于JAVA,C,PHP;第三方库丰富,Python强大而又丰富的第三方库使他几乎可以无所不能。今天我们就来用用Python爬取电影天堂最新电影资源,一起来看看吧。
分析网页源代码
进入开发者模式
首先我们打开浏览器,进入开发者模式(这里推荐大家使用谷歌浏览器)
快捷键
开发者模式:Ctrl/shitf + x
或者直接按下:F12

分析下一页网页链接变化规律
我们爬取左边2020新片精品的相关电影。首先传递初始页面的url,先获取2020新片精品的页面链接。我们分析出每一页网页链接的变化规律:比如第一页的链接‘https://www.dy2018.com/html/gndy/dyzz/index.html’,而第二页第三页的网页链接区别于第一页的就是后面几位’index.html’和’index_2.html’,‘index_3.html’
写第一个链接获取函数
def get_detail_urls(initial_url):#解析总页面链接,得到每一个电影的链接
pro='index'
page_url=[]
details=[]
detail_urls=[]
count=0
for i in range(1,8):
if i ==1 :
index=pro
else:
index=pro+'_%d'%i
html=initial_url+index+'.html'
page_url.append(html)
for i in range(len(page_url)):
count+=1
try:
response=requests.get(url=page_url[i],headers=headers)
text=response.content.decode('gbk',errors='ignore')
rst=etree.HTML(text)
detail=rst.xpath('//td/b/a/@href')
details.append(detail)
if response.status_code == 200:
print('最新电影第%d页网页链接获取成功'%count)
except Exception as e:
print(e)
# print(details)
for i in range(len(details)):
for j in range(len(details[i])):
url=details[i][j]
detail_url=base_domain+url
#count+=1
detail_urls.append(detail_url)
return detail_urls
得到每一页的链接后,分析每个电影相关介绍的URL放在哪里,还是在开发者模式里面,点击这个左上角的小箭头,你会发现你的鼠标移到哪下面的标签也会随之发生变化。点击最新电影上面的第一个,发现他把一个电影链接分割成了两部分,
演示图


它将另一部分链接放在了在td/b/a中的href(千万不要写成了herf)属性中,然后就开始写xpath语法了("//td/b/a/@href")这里我们用一下谷歌浏览器的插件xpath来验证一下对不对

编写链接解析函数
接下来我们来解析得到的链接,写一个解析函数。还是先分析所需要的内容在那放着:结果发现它都在一个("//div[@id=‘Zoom’]")里面。遍历依次提取就可以了。用xpath语法提取文本内容要加//text(),这样会返回一个文本。
def parse_detail_urls(url):#获取每个电影相关内容
movies={}
poster=[]
response=requests.get(url=url,headers=headers,timeout=5)
text=response.content.decode('gbk',errors='ignore')
html=etree.HTML(text)
lis=html.xpath("//div[@id='Zoom']")[0]
infos = lis.xpath(".//text()")
for index,info in enumerate(infos):
if info.startswith("◎片 名"):
movies['电影名称']=parse_info(info,"◎片 名")
elif info.startswith("◎产 地"):
movies['产地']=parse_info(info,"◎产 地")
elif info.startswith("◎类 别"):
movies['类别']=parse_info(info,"◎类 别")
elif info.startswith("◎语 言"):
movies['语言']=parse_info(info,"◎语 言")
elif info.startswith("◎字 幕"):
movies['字幕']=parse_info(info,"◎字 幕")
elif info.startswith("◎上映日期"):
movies['上映时间']=parse_info(info,"◎上映日期")
elif info.startswith("◎豆瓣评分"):
movies['豆瓣评分']=parse_info(info,"◎豆瓣评分")
elif info.startswith("◎片 长"):
movies['时长']=parse_info(info,"◎片 长")
elif info.startswith("◎导 演"):
movies['导演']=parse_info(info,"◎导 演")
elif info.startswith("◎标 签"):
movies['标签']=parse_info(info,"◎标签")
elif info.startswith("◎影片评价"):
movies['影评']=infos[index+1].strip()
elif info.startswith("◎主 演"):
info=parse_info(info,"◎主 演")
actors=info
for x in range(index+1,len(infos)):
actor=infos[x].strip()
if actor.startswith("◎"):
break
actors+=actor+'\n'
movies['主演'] = actors
elif info.startswith("◎简 介"):
brief=''
for x in range(index + 1, len(infos)):
bri = infos[x].strip()
if bri.startswith("◎"):
break
brief+=bri
movies['简介']='%s'%brief
movie_urls=html.xpath("//tr/td[@bgcolor='#fdfddf']/a/@href")
links=''
for link in movie_urls:
links+='%s'%link+'\n'
movies['电影链接']=links
poster_url= lis.xpath(".//img/@src")[0]
try:
if '电影天堂最新电影top175' in os.listdir('E:\python'):
pass
else:
os.mkdir('电影天堂最新电影top175')
print('文件夹创建成功')
except Exception as e:
print(e)
os.chdir('E:\python\电影天堂最新电影top175')
img = requests.get(poster_url).content
with open('%s'%movies['电影名称']+'.jpg','wb') as f:
f.write(img)
print("%s海报获取成功"%movies['电影名称'])
return movies
我们先用LXML库解析这个网页源代码,一次提取。注意这里的infos是一个列表,如果不在后面用索引指定的话,经常会出错误,要注意。这里用enumerate()这个方法同时提取内容以及索引,可以方便的找到你所要的内容在哪个位置。最后返回一电影详情的字典,电影的信息都在里面。后面可以写入表格里面(由于有的电影主演,简介以及链接较长,都放在里面表格看起来很不美观,建议不要放进去)这里我们用with语句把电影海报链接中的图片保存下来,用OS模块建立一个文件夹,写入照片的时候一定要用get()语句返回照片的字节流文件。然后以二进制的形式写入。经过分析之后发现电影天堂这个网站的写的不是很规范。
最后一步
if __name__ == '__main__':
movies=[]
headline=''
url='https://www.dy2018.com/html/gndy/dyzz/index.html'
resp=get_detail_urls(url)
#print(resp)
for index,info in enumerate(resp):
print(info)
a = requests.get(url=info, headers=headers)
text = a.content.decode('gbk', errors='ignore')
resp = etree.HTML(text)
title = resp.xpath("//div[@id='Zoom']//text()")
for i in title:
if i.startswith('◎片 名'):
headline = i
break
try:
a=parse_detail_urls(info)
print('正在解析{},已完成第{}个,剩余{}个'.format(info,index+1,(len(resp)-index-1)))
print("已完成{}%".format(10*(index/len(resp))))
movies.append(a)
except :
print('第{}页的电影{}解析出错'.format((index//7),headline))
os.chdir('E:/python')
data=pd.DataFrame(movies)
data.to_csv('电影天堂top175.csv')
这里多写几句便于可视化及时发现问题,检查问题。最后直接以csv文件导出(文件名结尾一定要加".csv"),就是常见的Excel写代码的时候一定要多调试(调试多了会被服务器封禁,注意调试规模,不要让程序多次全部运行,不然会给服务器增加负担,会被拉黑封禁的,可以多在循环的语句里面添加break),看着代码无差错的运行,也是一种享受。
写在最后
写在最后,这个里面会用到xpath语法以及xpath模块,关注公众号后台回复xpath即可获得xpath插件,安装教程以及xpath语法也会后续更新。更多精彩内容持续为您更新,谢谢大家。

想要获取源代码或者运行遇到了问题可以在微信后台私信我,有我的联系方式。
本文介绍了如何使用Python进行网页爬虫,通过分析电影天堂网站的源代码,提取最新电影链接,利用XPath解析电影信息,并保存电影海报。文章详细讲解了每个步骤,包括进入开发者模式分析网页链接规律,编写链接获取和解析函数,以及最终的数据保存。
3759

被折叠的 条评论
为什么被折叠?



