猫眼电影榜单爬虫实战
文章目录
一、观察目标网页特征
1.1. 观察下猫眼电影网站及其代码。传送门:猫眼网站首页
1.2. 选择【榜单】页面,可以看到有五个榜,分别是【热映口碑】,【最受期待】,【国内票房】,【北美票房】和【TOP 100】,基本上根据自己的需求来选择哪个榜单,每个榜单信息的主要差异在于显示的是评分,想看人数还是票房。【这里选择TOP 100 榜进行实战分析,对应的网页链接记得自己查看当前的URL】
猫眼电影-榜单-TOP100榜页面:
1.3. 查看网页HTML:爬虫一般来讲是可见即可爬,那么爬取的内容一般来自于网页的HTML。在浏览器页面鼠标右键选择【查看网页源代码】,会出现新的窗口,就是当前页面的HTML内容。到这一步看到的HTML内容和之前看到的也main内容一样,那就基本上问题不难了,掌握基本的爬虫知识就可以解决了。
HTML页面图:
二、爬虫程序
这里用到的库有,requests,re,time
2.1 获取页面HTML函数
def get_html(Url):#定义一个函数来获取对应Url的页面HTML
import requests,time
cookies='XXX'#换成对应的cookies
user-agent='XXX'#换车对应的user-agent
headers={
'user-agent':user-agent,
'cookies':cookies
}#对请求头部信息进行赋值
time.sleep(1)#爬取页面设置睡眠时间
r=requests.get(Url,headers=headers)
if r.status_code==200:
r.encoding='utf-8'
html=r.text
return(html)#如果页面链接无误,就返回对应的HTML内容
else:
print("request"+Url+"FAILED")
return None #连接错误,返回None
2.2 解析HTML,得到想要的字段信息
下面图片截取了两部电影的信息,不难发现,每部电影信息都是在一组
《dd 》XXXXX 《/dd》之间,包含的信息有片名,主演,上映时间,评分。
根据对HTML的分析,写代码,提取目标字段
- 版本1:用正则表达式直接表示全部信息字段的解析方法(会出现一点错误)
对应代码:
#=========================版本1============================
def get_info(HTML):#传入特定的一个页面的HTML信息
import re
pattern= '<a href.*?title="(.*?)" class="image-link".*?<img data-src="(.*?)" alt.*?</a>.*?<p class="star">.*?(主演:.*?)</p>.*?<p class="releasetime">(上映时间:.*?)</p>.*?</div>'#定义了提取信息的模式,结合re库,就能提取到片名,头图链接,主演信息,上映时间(评分这里忽略了没写,但是逻辑是一样的)
infos=re.findall(pattern,HTML,re.S)
'''findall返回的是一个列表,re.S的功能是忽略换行符,
因为在pattern中没有具体到每一个换行信息,也没必要涉及'''
result=[]
for info in infos:#当前页面的每部电影遍历
title=info[0].strip()
pic_link=info[1].strip()
star=info[2].strip()
release_time=info[3].strip()
new=(index,title,pic_link,star,release_time)
#每部电影的信息生成一个元组new
result.append(new)
return result
- 版本2,将每个字段信息都精确的匹配,目前没有发现问题
#=====================版本2=======================
def get_info(HTML):#定义一个函数解析当前页面HTML的信息
import re
info_pattern='<dd>.*?<i class="board-index board-index-.*?">\d+</i>.*?</dd>'#先按照每部电影信息进行整理
infos=re.findall(info_pattern,HTML,re.S)
#返回一个列表,其中的元素为每部电影
#以下定义每个字段的匹配模式
index_pattern='<dd>.*?<i class="board-index board-index-.*?">(\d+)</i>'#序号字段
title_pattern='<a href.*?title="(.*?)" class="image-link"'#片名字段
pic_link_pattern='<img data-src="(.*?)" alt.*?</a>'#头图链接
star_pattern='<p class="star">.*?(主演:.*?)</p>'#主演
release_time_pattern='<p class="releasetime">(上映时间:.*?)</p>.*?</div>.*?</dd>'#上映时间
result=[