爬取目标
本文将提取猫眼电影 TOP100 排行榜的电影名称、时间、评分、图片等信息,URL 为http://maoyan.com/board/4,提取的结果我们以 excel 格式保存下来。
准备工作
保证电脑安装了 python3.6 和已经安装好了 requests 库、beautifulsoup 库和 openpyxl 库。
前期安装步骤可以参考:https://germey.gitbooks.io/python3webspider/1-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.html
爬取分析
打开http://maoyan.com/board/4我们会发现榜单主要显示 4 个数据:电影名、主演、上映时间和评分。
如图所示:
猫眼榜单
网页下滑到最下方可以发现有分页的列表,我们点击一下第二页会发现页面的 URL 变成了http://maoyan.com/board/4?offset=10,比之前的页面多了一个 offset=10 的参数,而且页面显示的是排行 11-20 名的电影。
由此我们可以总结出规律,offset 代表了一个偏移量值,如果偏移量为 n,则显示的电影序号就是 n+1 到 n+10,每页显示 10 个。所以我们如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数设置为 0,10,20,…,90 即可,这样我们获取不同的页面结果之后再用正则表达式提取出相关信息就可以得到 TOP100 的所有电影信息了。
抓取首页
1import requests 2def get_one_page(url): 3 response = requests.get(url) 4 if response.status_code == 200: 5 return response.text 6 return None 7def main(): 8 url = 'http://maoyan.com/board/4' 9 html = get_one_page(url)10 print(html)11main()
这样我们就可以获取首页的源代码了,获取源代码之后我们要对页面进行解析,提取出我们想要的信息。
使用 BeautifulSoup 进行提取
接下来我们回到网页看一下页面的真实源码,在开发者工具中 Network 监听(建议使用谷歌浏览器,按 F12 即可查看网页信息),然后查看一下源代码。如图所示:
源代
码1
注意这里不要在 Elements 选项卡直接查看源码,此处的源码可能经过 JavaScript 的操作而和原始请求的不同,我们需要从Network选项卡部分查看原始请求得到的源码。
查看其中的一条源代码如图所示:
need-to-insert-img
源代码2
可以看到电影名、主演、上映时间和评分分别在属性 class="name"、class="star"、class="release" 和 class="score"的文本中
那么我们可以用 BeautifulSoup 的方法进行提取: 1def parse_one_page(html): 2 soup = bs4.BeautifulSoup(html, 'lxml') 3 # 获取电影名 4 movies = [] 5 targets = soup.find_all(class_='name') 6 for each in targets: 7 movies.append(each.get_text()) 8 # 获取评分 9 scores = []10 targets = soup.find_all(class_='score')11 for each in targets:12 scores.append(each.get_text())13 # 获取主演信息14 star_message = []15 targets = soup.find_all(class_='star')16 for each in targets:17 star_message.append(each.get_text().split(' ')[1].strip())18 print(each.get_text().split(' ')[1].strip())19 # 获取上映时间20 play_time = []21 targets = soup.find_all(class_='releasetime')22 for each in targets:23 play_time.append(each.get_text())24 result = []25 length = len(movies)26 for j in range(length):27 result.append([movies[j], scores[j], star_message[j], play_time[j]])28 return result
这样我们就成功的将一页的 10 个电影信息都提取出来了
写入文件
随后我们将提取的结果做成 excel 表格形式
1def save_to_excel(result): 2 wb = openpyxl.Workbook() 3 ws = wb.active 4 ws['A1'] = '电影名称' 5 ws['B1'] = '评分' 6 ws['C1'] = '主演' 7 ws['D1'] = '上映时间' 8 for item in result: 9 ws.append(item)10 wb.save('猫眼电影TOP100.xlsx')
分页爬取
但我们需要爬取的数据是 TOP100 的电影,所以我们还需要遍历一下给这个链接传入一个 offset 参数,实现其他 90 部电影的爬取
1for i in range(10):2 headers = {3 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',4 }5 url = 'http://maoyan.com/board/4?offset=' + str(i * 10)6 html = get_one_page(url, headers)7 result.extend(parse_one_page(html))
整合代码
到此为止,我们的猫眼电影 TOP100 的爬虫就全部完成了,再稍微整理一下,完整的代码如下:
运行结果如下图:
爬取结果
代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import bs4
from requests.exceptionsimport RequestException
import openpyxl
def get_one_page(url,headers):
try :
response = requests.get(url,headers=headers)
if response.status_code==200:
return response.text
else:
return None
except RequestException:
return None
def parse_one_page(html):
soup=bs4.BeautifulSoup(html)
'''获取电影名称'''
movies=[]
targrts=soup.find_all(class_='name')
for eachin targrts:
movies.append(each.get_text())
'''获取评分'''
scores=[]
targets1=soup.find_all(class_='score')
for eachin targets1:
scores.append(each.get_text())
'''获取主演信息'''
star_message=[]
targets2=soup.find_all(class_='star')
for eachin targets2:
star_message.append(each.get_text())
'''获取上映时间'''
play_time = []
targets3 = soup.find_all(class_='releasetime')
for eachin targets3:
play_time.append(each.get_text())
result=[]
length=len(movies)
for jin range(length):
result.append([movies[j],scores[j],star_message[j],play_time[j]])
return result
def save_to_excel(result):
wb=openpyxl.Workbook()
ws=wb.active
ws['A1']='电影名称'
ws['B1']='评分'
ws['C1']='主演'
ws['D1']='上映时间'
for itemin result:
ws.append(item)
wb.save(u'猫眼电影TOP100.xlsx')
def main():
result=[]
for iin range(10):
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
url='http://maoyan.com/board/4?offset='+str(i*10)
html=get_one_page(url,headers)
result.extend(parse_one_page(html))
save_to_excel(result)
if __name__=="__main__":
main()