为什么选取Grab框架,原因是它的许多优点:
- 高效的数据抓取:Grab框架支持异步网络请求处理,这意味着它可以同时处理多个网络请求,从而显著提高数据抓取的效率。
- 强大的HTML解析能力:内置的HTML解析支持使得Grab能够轻松地抽取网页内容。无论是简单的文本提取还是复杂的DOM树操作,Grab都能提供便捷的方法。
- 高度的可定制性:Grab提供了一套灵活的配置机制,允许用户根据需求高度定制抓取行为。这包括请求头、代理、超时设置等多个方面,使得Grab能够适应各种复杂的抓取场景。
- 丰富的功能支持:除了基本的页面抓取功能外,Grab还支持文件上传、cookie处理、重定向、代理管理、错误处理、重试逻辑等。这些功能对于构建复杂的爬虫任务至关重要。
- 详细的日志记录:Grab提供了详细的日志记录功能,有助于开发者在调试和运行时跟踪和排查问题。
- 良好的文档和社区支持:Grab拥有完善的文档,对于新手来说非常友好。同时,作为一个开源项目,Grab也拥有活跃的社区支持,开发者可以在社区中寻求帮助或分享经验。
接下来,我们有一个需求:
爬取追剧影视网站的"正在热播"部分的影视信息。输出影视名称、影视类型(判断是电影还是电视剧,如果是电影则输出电影,如果是电视剧,输出电视剧和集数)、影视画质、影视评分人数、影视评分和主演。
于是我们启动Grab框架行动吧!
具体实现:
from grab import Grab
print("追剧影视网站的'正在热播'的影视信息如下:")
print()
# 创建对象
g = Grab()
# 设置要请求的网页的url
url1 = 'https://zjuys.com/'
# 发起请求并得到响应即html
res = g.go(url1)
# 影视
videos = res.select('//*[@id="flex-1"]/main/div[2]/div/div/div[1]/div/div[2]/div[3]/div/div')
for video in videos:
# 影视名称
video_name = video.select('./div/a/div[2]/div[1]/div/span').text()
print("影视名称:"+video_name)
# 影视类型
# 根据标签里面内容是否为空即是否显示剧集判断,为空就是电影,不为空就是电视剧,并且获取剧集
video_num = video.select('./div/a/div[1]/div[2]/div[1]').text()
if video_num:
if '集' in video_num:
print('影视类型:电视剧')
print('电视剧集数:' + video_num)
else:
print('影视类型:电影')
else:
print('影视类型:电影')
# 影视画质
video_qua = video.select('./div/a/div[1]/div[3]/div').text()
print('影视画质:'+video_qua)
# 影视评分人数
video_score_people = video.select('./div/a/div[1]/div[2]/div[2]/div[1]').text()
video_score_people = video_score_people.replace('"','')
print("影视评分人数:"+video_score_people)
# 影视评分
video_score = video.select('./div/a/div[1]/div[2]/div[2]/div[2]').text()
print("影视评分:"+video_score)
# 主演
video_actors = video.select('./div/a/div[2]/div[2]/span').text()
print("主演;"+video_actors)
print('------------------------------------------------------------')