python爬虫.实例

以下为学习内容的笔记
具体学习资料详见猫眼电影实例
本次内容我们要爬取猫眼网站上前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')

效果如下:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值