用requests和etree爬取豆瓣电影评论

Posted wsmrzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用requests和etree爬取豆瓣电影评论相关的知识,希望对你有一定的参考价值。

写在前面的话上一篇文章我们用requests和lxml.etree爬取了豆瓣电影Top250的电影信息,为了能对requests和lxml.etree有更深的理解,下面我们将继续用他们来爬取豆瓣电影的短评

温馨提示 :博主使用的系统为win10,使用的python版本为3.6.5

一、网页分析

首先我们使用chrome浏览器打开某一部电影的评论(这里示例为最近很火的《一出好戏》),我们首先可以判断该网站是一个静态网页,和之前一样我们可以通过构造URL来获取全部网页的内容,但是这次我们尝试使用一种新方法——翻页

使用快捷键 Ctrl+Shift+I 打开Chrome浏览器自带的开发者工具,然后可以使用快捷键 Ctrl+Shift+C 来打开元素选择工具,用鼠标点击网页中的 后页,就会在源代码中自动定位到相应位置,用lxml.etree匹配下一页的链接为 html.xpath(‘//div[@id="paginator"]/a[@class="next"]/@href‘),这样我们就可以通过循环不断获取下一页的内容了

技术分享图片

接下来我们需要解析每一页网页的内容以获取我们需要的数据,包括:评论者、赞同人数、评价和评论内容,这里我们使用lxml.etree进行匹配

  • 赞同人数://div[@class="comment-item"]/div[2]/h3/span[1]/span/text()
  • 评论者://div[@class="comment-item"]/div[2]/h3/span[2]/a/text()
  • 评价://div[@class="comment-item"]/div[2]/h3/span[2]/span[2]/@title
  • 评论内容://div[@class="comment-item"]/div[2]/p/span/text()

技术分享图片

二、代码实现

import requests
from lxml import etree
import time
import random

class DoubanSpider():
    movieID = ""
    
    def init(self):
        self.movieID = input(‘请输入电影ID:‘)
    
    def get_html(self,url):
        headers = {
            ‘USER-AGENT‘:‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36‘
        }
        response = requests.get(url=url,headers=headers)
        return response.text

    def parse_page(self,html):
        html = etree.HTML(html)
        agrees = html.xpath(‘//div[@class="comment-item"]/div[2]/h3/span[1]/span/text()‘)
        authods = html.xpath(‘//div[@class="comment-item"]/div[2]/h3/span[2]/a/text()‘)
        stars = html.xpath(‘//div[@class="comment-item"]/div[2]/h3/span[2]/span[2]/@title‘)
        contents = html.xpath(‘//div[@class="comment-item"]/div[2]/p/span/text()‘)
        result = []
        for i in range(len(agrees)):
            data = {}
            data[‘agree‘] = agrees[i].encode(‘utf-8‘).decode(‘utf-8‘)
            data[‘authod‘] = authods[i].encode(‘utf-8‘).decode(‘utf-8‘)
            data[‘star‘] = stars[i].encode(‘utf-8‘).decode(‘utf-8‘)
            data[‘content‘] = contents[i].encode(‘utf-8‘).decode(‘utf-8‘)
            result.append(data)
        return result

    def parse_link(self,html):
        html = etree.HTML(html)
        base_url = ‘https://movie.douban.com/subject/‘+str(self.movieID)+‘/comments‘
        url = html.xpath(‘//div[@id="paginator"]/a[@class="next"]/@href‘)
        if not url :
            return "END"
        link = base_url + url[0].encode(‘utf-8‘).decode(‘utf-8‘)
        return link

    def crawl(self):
        print(‘Processing‘)
        file = open(‘douban.txt‘,‘w‘,encoding=‘utf-8‘)
        url = ‘https://movie.douban.com/subject/‘ + str(self.movieID) + ‘/comments?start=0&limit=20&sort=new_score&status=P&percent_type=‘
        count = 0
        while True :
            time.sleep(random.random())
            html = self.get_html(url)
            result = self.parse_page(html)
            for item in result:
                count += 1
                print(count)
                file.write(‘--------------------‘+str(count)+‘--------------------
‘)
                file.write(‘评论者:‘)
                file.write(item[‘authod‘])
                file.write(‘
‘)
                file.write(‘赞同人数:‘)
                file.write(item[‘agree‘])
                file.write(‘
‘)
                file.write(‘评价:‘)
                file.write(item[‘star‘])
                file.write(‘
‘)
                file.write(‘评论内容:‘)
                file.write(item[‘content‘])
                file.write(‘
‘)
            url = self.parse_link(html)
            if url==‘END‘ :
                break
        file.close()
        print(‘Finished‘)

if __name__ == "__main__":
    spider = DoubanSpider()
    spider.init()
    spider.crawl()

写在后面的话 :通过之前的学习我们已经掌握了静态网页的爬取方法,下一篇文章我们将学习动态网页的爬取,谢谢大家

以上是关于用requests和etree爬取豆瓣电影评论的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫简单实例——豆瓣电影评论数据的爬取

用requests 爬取豆瓣书评的评论

Python正则匹配抓取豆瓣电影链接和评论代码分享

初始python 之 爬虫:爬取豆瓣电影最热评论

Python豆瓣电影《肖申克的救赎》评论爬取

Python爬虫实战(1)requests爬取豆瓣电影TOP250