爬虫入门经典(四) | 如何爬取豆瓣电影Top250

2020-10-30 14:08发布

一、项目分析

1.1 单页分析

目标网站:https://movie.douban.com/top250
4

我们打开网址,查看页面布局,可以看到有电影名称及别名、评分、引言等等,在此就以电影名称及别名、评分、引言为爬取目标。

我们打开开发者选项,发现这个网页为静态网页,这样就很好爬取了:
5

爬取部分所在位置
6

1、电影名称与其他名称
7
2、 URL
8
3、 评分
9
4、 引言
10
11
这个时候,你是否会感觉无从下手。没关系,本大师会为你排忧解惑!
12
网页大体结构已经分析完成,那么接下来就需要对我们所要爬取的内容进行xpath解析:

1、 电影名称解析
13
2、 其他名称解析
14
3、 链接解析
15
通过查看我们发现得到的是这一页中的所有链接,我们选取第一个即:

(//div[@class="hd"]/a/@href)[0]1

这样就可以达到对应的URL链接了。

4、 评分解析
16
我们可以看到评分和链接一样,都是选取第一个即可:

(//div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text())[0]1

5、 引言解析
17
引言解析和上述两个看着一样,但是如果直接和上面以上是会报错的,因为引言可能有的是没有的,比如说排名212的《九品芝麻官》,就没有引言。
18
这个时候就需要加上判断语句:

# 条件语句:如果有引言则写引言,若没有则不写if quote:
    quote = quote[0]else:
    quote = ''12345

1.2 翻页分析

在分析完单页爬取内容后,我们就需要继续分析分页,来完成循环爬取的功能。
19
我们先来分析下网页链接:

https://movie.douban.com/top250?start=0&filter=https://movie.douban.com/top250?start=25&filter=https://movie.douban.com/top250?start=50&filter=123

通过查看对比,我们发现其网页变化仅为start=?以此可以判定,其是以25为分页。

我们再来看下总页数,这印证了我们的猜想是正确的。
20
分析完成了下面就可以来进行实现了:

doubanUrl = 'https://movie.douban.com/top250?start={}&filter='# 一共10页,循环10次for i in range(10):
    # 获取url
    pageLink = doubanUrl.format(i * 25)
    print(pageLink)12345678

下面我们来打印下拼接网址
21
打开其中一个网址,看是否成功
22
Respect,????分析到这里就完美结束了!

23

二、完整代码

# encoding: utf-8'''
  @author 李华鑫
  @create 2020-10-14 8:30
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 豆瓣.py
  @Version:1.0
  
'''import requestsfrom lxml import etreeimport csv# 豆瓣top250网址doubanUrl = 'https://movie.douban.com/top250?start={}&filter='# 获取网页源码def getSource(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    # 以防出现乱码 设置编码格式
    response.encoding = 'utf-8'
    return response.text# 引言 评分 网址 标题 ---> 网页源代码中# 获取电影信息def getEveryItem(source):
    # 生成一个Html对象
    selector = etree.HTML(source)
    # 通过selector对象来找到  电影信息
    movieItemList = selector.xpath('//div[@class="info"]')

    # 定义一个空列表
    movieList = []

    # 通过for循环来遍历
    for eachMovie in movieItemList:
        # 创建一个字典,向列表中存储数据[{电影一},{电影二}...]
        movieDict = {}

        title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()') # 电影名
        otherTitle = eachMovie.xpath('div[@class="hd"]/a/span[@class="other"]/text()')  # 其他名称
        link = eachMovie.xpath('div[@class="hd"]/a/@href')[0]  # 链接
        star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]  # 评分
        quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()')  # 引言

        # 条件语句:如果有引言则写引言,若没有则不写
        if quote:
            quote = quote[0]
        else:
            quote = ''

        # 保存数据
        movieDict['title'] = ''.join(title + otherTitle)
        movieDict['url'] = link
        movieDict['star'] = star
        movieDict['quote'] = quote        print(movieDict)

        movieList.append(movieDict)

    return movieList# 保存数据def writeData(movieList):
    with open('douban_top250.csv', 'w', encoding='utf-8',newline='') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'star', 'quote', 'url'])
        writer.writeheader()  # 写入表头
        for each in movieList:
            # 逐行写入
            writer.writerow(each)# 启动if __name__ == "__main__":
    movieList = []

    # 一共10页,循环10次
    for i in range(10):
        # 获取url
        pageLink = doubanUrl.format(i * 25)
        print(pageLink)
        source = getSource(pageLink)
        movieList += getEveryItem(source)

    writeData(movieList)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394

三、运行结果

24
25
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


转载自:CSDN   作者:不温卜火

原文链接:https://buwenbuhuo.blog.csdn.net/article/details/109200583