以下为学习内容的笔记
具体学习资料详见猫眼电影实例
本次内容我们要爬取猫眼网站上前100电影的信息。
一.导入模块
首先我们要要导入用到的模块
import requests
import re
import xlwt#用于保存数据
二.准备需要爬取的url组
首先大体观察一下我们要爬取的页面,爬取top100的电影需要爬取大概10个网页,观察一下这些网页的url
这些信息不再一页上,而一共在十页上。所以需要发现每一页的规律,然后构造出来每一页的url。
第一页:https://maoyan.com/board/4?offset=0
第二页:https://maoyan.com/board/4?offset=10
第三页:https://maoyan.com/board/4?offset=20
……
第十页:https://maoyan.com/board/4?offset=90’
于是有:
第n页网址:https://maoyan.com/board/4?offset=(n-1)*10
所以就用代码构造出所有的url以备用:
urls=['https://maoyan.com/board/4?offset={}'.format(i*10) for i in range(10)]
然后我们看一下对一个页面爬取是都要做些什么,10个页面爬取无非再加一个循环。
三.设计get_page函数
为了把代码包装成浏览器,我们需要获取Headers,就是我们伪装成浏览器所需要的参数,是字典形式,每次爬虫都需要去所爬取的网站去复制一下。
获得方法如下:
首先找到页面的页面查看器,我用的火狐浏览器,在右上角打开三行的菜单栏,找到web开发者,然后找到查看器即是。
然后在页面查看器上找network即网络,然后刷新,随便选择一个新出来的网页,会出现一个侧栏,下拉找到请求头,找到user-agent复制留备用。
于是有以下get_page函数的设计:
url='https://maoyan.com/board/4?'
headers={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
def get_page(url):
try:
response=requests.get(url,headers=headers)
response.raise_for_status()
response.encoding=response.apparent_encoding
return response.text
#这就是我们写这个函数所需要的结果,网页原代码。
except Exception as e:
print(e)
四.设计get_info函数
首先打开页面源代码,control+F打开搜索栏,输入你想记录下的信息一部分,页面会定位到那里,观察一下它的位置特征,为我们写findall函数第一个参数做准备。
这个是爬虫过程中变数最大的地方,因不同的数据需求而异
对于本文实例,有:
def get_info(page):
items=re.findall('board-index .*?>(\d+)</i>.*?class="name"><.*?>(.*?)</a></p>.*?<p class="star">.*?'+
'主演:(.*?) .*?</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">'+
'(.*?)</i><i class="fraction">(\d+)</i></p>',page,re.S)
#items形如(【】,【】,【】)
#item是【】
#然后我们要把item【】变成date{}
#最后再变成DATA({},{},{})
#这个函数只是返回一个个data
for item in items:
data={}
data['rank']=item[0]
data['title']=item[1]
actors=re.sub('\n','',item[2])
data['actors']=actors
data['date']=item[3]
data['score']=str(item[4])+str(item[5])
yield data
五.主程序
借助之前的
url组(需要爬取的网页)
get_page(输入网页获得文本)
get_info(输入文本获得数据)
以获得DATA
#主程序
DATA=[]
for url in urls:
page=get_page(url)
datas=get_info(page)
for data in datas:
DATA.append(data) #将所有的数据添加到DATA里
#每次爬一个网页,保留一个网页的信息
六.保存数据
保存到Excel,运用到已经导入的xlwt模块
此段代码比较固定
import xlwt
f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'rank') #第一行第一列
sheet01.write(0,1,'title')
sheet01.write(0,2,'actors')
sheet01.write(0,3,'date')
sheet01.write(0,4,'score')
#写内容
for i in range(len(DATA)):
sheet01.write(i+1,0,DATA[i]['rank'])
sheet01.write(i+1,1,DATA[i]['title'])
sheet01.write(i+1,2,DATA[i]['actors'])
sheet01.write(i+1,3,DATA[i]['date'])
sheet01.write(i+1,4,DATA[i]['score'])
print('p',end='')
f.save('E:\\猫眼电影.xls')
最终代码
import requests
import re
import xlwt
url='https://maoyan.com/board/4?'#这个应该不需要
headers={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
def get_page(url):
try:
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.text
else:
print('获取网页失败')
except Exception as e:
print(e)
def get_info(page):
items=re.findall('board-index .*?>(\d+)</i>.*?class="name"><.*?>(.*?)</a></p>.*?<p class="star">.*?'+
'主演:(.*?) .*?</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">'+
'(.*?)</i><i class="fraction">(\d+)</i></p>',page,re.S)
for item in items:
data={}
data['rank']=item[0]
data['title']=item[1]
actors=re.sub('\n','',item[2])
data['actors']=actors
data['date']=item[3]
data['score']=str(item[4])+str(item[5])
yield data
urls=['https://maoyan.com/board/4?offset={}'.format(i*10) for i in range(10)]
DATA=[]
for url in urls:
page=get_page(url)
datas=get_info(page)
for data in datas:
DATA.append(data) #将所有的数据添加到DATA里
f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'rank') #第一行第一列
sheet01.write(0,1,'title')
sheet01.write(0,2,'actors')
sheet01.write(0,3,'date')
sheet01.write(0,4,'score')
#写内容
for i in range(len(DATA)):
sheet01.write(i+1,0,DATA[i]['rank'])
sheet01.write(i+1,1,DATA[i]['title'])
sheet01.write(i+1,2,DATA[i]['actors'])
sheet01.write(i+1,3,DATA[i]['date'])
sheet01.write(i+1,4,DATA[i]['score'])
print('p',end='')
f.save('E:\\猫眼电影.xls')
效果如下: