简介

这里的爬虫不是那种慢慢爬行的虫子,而是一种在互联网上不断爬取数据的程序。因为它们的行为是爬取数据,而且通常情况下这些程序都是比较小但数量众多,所以就被人们称之为“爬虫”。网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。网络爬虫为搜索引擎从万维网下载网页。一般分为传统爬虫和聚焦爬虫。

程序设计背景

一句话,为了完成Python大作业做准备……不过也是为了了解爬虫的基本构成以及对HTML文件的解析。这次程序例子是爬取豆瓣电影中《肖申克的救赎》的评论信息。

程序执行步骤

0.我们每一个人在爬取数据时都应该遵守道德规范与法律,不该爬的数据不能爬,并且在爬取数据时不能给目标网站带来过大的压力。

1.首先利用身份信息伪装自己,让浏览器误认为是真实用户在进行操作。在爬取未做反爬虫处理的网站时可以不做身份伪装。下面是身份标识的信息,其中包括

myHearder={ #头部信息
    #发送请求的设备信息
    'User-Agent': '',
    #用户cookie,用于身份验证
    'Cookie': ''
}

其中User-Agent为设备标识信息,欺骗网站这是有正常浏览器发出的请求,Cookie是作为身份验证的标识,作用是让浏览器知道是哪个用户在浏览网页,在一些需要登录才能浏览的网站中,Cookie是必需的。User-Agent与Cookie的获取方式在后面介绍。

2.构造方法调用requests.get()发出页面请求

 url = 'https://movie.douban.com/subject/1292052/comments?start='+str(flag)+'&limit=20&status=P&sort=new_score'
    r = requests.get(url, headers=myHearder)

这时r即可获取到整个网页的内容。

3.对获取到的页面内容进行解析筛选数据信息

temptext1 = BeautifulSoup(r.text, 'lxml')  # 解析页面

解析网页文件可以借助BeautifulSoup来完成,这个包里面有非常多对HTML页面进行处理的方法,更多详情读者可以百度查看。在这里我用到的解析器为lxml,接下来就是利用find与find_all方法来逐步定位到我们需要的信息的位置,find与find_all方法的使用详解请点击这里。

messagediv = temptext1.find('div', id='comments')  # 定位到评论界面的div
commentItemdiv = messagediv.find_all('div',class_='comment-item')    #定位到单个评论的详细信息板块,板块中包含发言人、发言时间和发言内容

4.将每一页评论装填至一个临时列表中,并在最后写入文件进行保存

fileName = '《肖申克的救赎》评论'+str(datetime.now().year)+'-'+str(datetime.now().month)+'-'+str(datetime.now().day)+'-'+str(datetime.now().hour)+'-'+str(datetime.now().minute)+'-'+str(datetime.now().second)+'.txt'
with open(fileName, mode='w', encoding='utf-8') as f:  #打开文件
    for i in commentList:
        f.write(i + '\n')  #写入评论

注意事项

电影影评是分页显示的,因此需要定义一个flag来对索引进行标识,利用flag来对请求目标URL进行重构来达到分页的目的。豆瓣电影是需要登录才能够访问所有的评论的,因此在爬取数据时应该先登录网页获取cookie来对爬虫进行伪装。程序每爬取完一个页面休眠3秒再发送一次请求。

User-Agent与Cookie的获取方式

1.首选打开浏览器搜索到豆瓣电影,登录完成之后搜索《肖申克的救赎》并来到它的评论页面。

1webp

2.按F12启动浏览器的功能调试界面,并且选择网络(Network)选项卡。

2.webp

3.刷新浏览器即可截取到网页的信息。

3.webp

4.点击包含头部信息的文件即可查看到User-Agent与Cookie的信息。

4.webp

5.webp

获取到User-Agent和Cookie之后将这两项信息填入自定义的myHeader中即可。

至此爬取影评的简单爬虫的基础设计步骤介绍完了,爬虫需要的两个第三方包requests与BeautifulSoup需要读者自行安装,推荐使用pip install安装方法进行安装,在安装之前记得换源,即把下载源从国外更改至国内,这样可以大幅增加下载速度。

完整程序代码

# encoding=utf-8
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import time
'''
版本信息:V2.0
作者:莫,小白
实现功能:
    1.利用cookie来进行身份验证
    2.能够逐页爬取短评
    3.更够对cookie失效以及数据截止(数据爬取完成)的状态进行相关提示处理
    4.能够将爬取下来的评论写入相关文本保存,格式为《电影名》+爬取日期
    5.进程休眠,每爬取一个页面进程休眠5秒,防止给目标服务器带来压力
    6.增加对发言人和发言时间地爬取
'''
myHearder={ #头部信息
    #发送请求的设备信息
    'User-Agent': '', #User-Agent信息填入单引号内
    #用户cookie,用于身份验证
    'Cookie': '' #Cookie信息填入单引号内
}
flag = 0   #定义评论索引
commentList = []  #临时存放评论的列表
while(True):
    url = 'https://movie.douban.com/subject/1292052/comments?start='+str(flag)+'&limit=20&status=P&sort=new_score'
    r = requests.get(url, headers=myHearder)
    temptext1 = BeautifulSoup(r.text, 'lxml')  # 解析页面
    messagediv = temptext1.find('div', id='comments')  # 定位到评论界面的div
    try:
        commentItemdiv = messagediv.find_all('div',class_='comment-item')    #定位到单个评论的详细信息板块,板块中包含发言人、发言时间和发言内容
    except:
        print("*************登录可能已超时,请重新更换cookie!****************")
        break
    print("******************这是第"+str(flag/20+1)+"页的评论***********")
    try:
        for i in range(20):
            userifo = commentItemdiv[i].find('span',class_='comment-info')  # 定位至包含用户名的span板块
            userifo = userifo.text.split() #将用户信息转换成列表
            userifostr = '评论用户名:'+userifo[0]+',评论时间:'+userifo[2] #拼接用户信息字符串
            shortmessagespan = commentItemdiv[i].find('span',class_='short')  # 定位至评论语句
            messagestr = userifostr + '\n' +  shortmessagespan.text  #将用户信息与评论内容拼接形成一个完整的评论
            print(messagestr)
            commentList.append(messagestr)
    except Exception as ee:
        print("************已结束**************")
        print(ee)
        break
    flag = flag + 20   #每次增长二十条评论
    time.sleep(3)   #每一页评论休眠5秒,避免给服务器带来过大压力
fileName = '《肖申克的救赎》评论'+str(datetime.now().year)+'-'+str(datetime.now().month)+'-'+str(datetime.now().day)+'-'+str(datetime.now().hour)+'-'+str(datetime.now().minute)+'-'+str(datetime.now().second)+'.txt' #构建保存影评记录文件名
with open(fileName, mode='w', encoding='utf-8') as f:  #打开文件
    for i in commentList:
        f.write(i + '\n')  #写入评论

写在最后

这次的稿子是面向有基础的读者,之后还会修改,争取能做到面向小白读者ヽ(•̀ω•́ )ゝ

分类: Python学习

备案图标桂公网安备45020202000334桂ICP备20004521号-1