天天看点

爬虫-豆瓣top250-电影爬取爬取效果:代码:

爬取效果:

title,star,quote,link
肖申克的救赎 / The Shawshank Redemption / 月黑高飞(港)  /  刺激1995(台),9.7,希望让人自由。,https://movie.douban.com/subject/1292052/
霸王别姬 / 再见,我的妾  /  Farewell My Concubine,9.6,风华绝代。,https://movie.douban.com/subject/1291546/
阿甘正传 / Forrest Gump / 福雷斯特·冈普,9.5,一部美国近现代史。,https://movie.douban.com/subject/1292720/
这个杀手不太冷 / Léon / 杀手莱昂  /  终极追杀令(台),9.4,怪蜀黍和小萝莉不得不说的故事。,https://movie.douban.com/subject/1295644/
美丽人生 / La vita è bella / 一个快乐的传说(港)  /  Life Is Beautiful,9.5,最美的谎言。,https://movie.douban.com/subject/1292063/
泰坦尼克号 / Titanic / 铁达尼号(港 / 台),9.4,失去的才是永恒的。 ,https://movie.douban.com/subject/1292722/
千与千寻 / 千と千尋の神隠し / 神隐少女(台)  /  千与千寻的神隐,9.4,最好的宫崎骏,最好的久石让。 ,https://movie.douban.com/subject/1291561/
辛德勒的名单 / Schindler's List / 舒特拉的名单(港)  /  辛德勒名单,9.5,拯救一个人,就是拯救整个世界。,https://movie.douban.com/subject/1295124/
盗梦空间 / Inception / 潜行凶间(港)  /  全面启动(台),9.3,诺兰给了我们一场无法盗取的梦。,https://movie.douban.com/subject/3541415/
忠犬八公的故事 / Hachi: A Dog's Tale / 忠犬小八(台)  /  秋田犬八千(港),9.4,永远都不能忘记你所爱的人。,https://movie.douban.com/subject/3011091/
海上钢琴师 / La leggenda del pianista sull'oceano / 声光伴我飞(港)  /  一九零零的传奇,9.3,每个人都要走一条自己坚定了的路,就算是粉身碎骨。 ,https://movie.douban.com/subject/1292001/
楚门的世界 / The Truman Show / 真人Show(港)  /  真人戏,9.3,如果再也不能见到你,祝你早安,午安,晚安。,https://movie.douban.com/subject/1292064/
三傻大闹宝莱坞 / 3 Idiots / 三个傻瓜(台)  /  作死不离3兄弟(港),9.2,英俊版憨豆,高情商版谢耳朵。,https://movie.douban.com/subject/3793023/
机器人总动员 / WALL·E / 太空奇兵·威E(港)  /  瓦力(台),9.3,小瓦力,大人生。,https://movie.douban.com/subject/2131459/
           

代码:

# encoding: utf-8
"""
@version: 0.1
@author: 
@site: 
@software: PyCharm
@file: doubanDemo.py
@time: 2020-05-28 21:53
"""
# 第一步 导入库
import lxml.html
import csv, random
from urllib.request import urlopen, Request
from urllib import parse, request

# 第二步 获取目标网站
# https://movie.douban.com/top250?start=0&filter=       第一页
# https://movie.douban.com/top250?start=25&filter=      第二页
# https://movie.douban.com/top250?start=50&filter=      第三页
# https://movie.douban.com/top250?start=75&filter=      第四页
# 规律:(当前网页-1)*25
# doubanUrl = 'https://movie.douban.com/top250?start=0&filter='
doubanUrl = 'https://movie.douban.com/top250?start={}&filter='

# ua = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'
# ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'

# 模拟多个浏览器头,伪装
ua_list = [
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
]

# 随机选一个
ua = random.choice(ua_list)

headers = {
    'User-Agent': ua
}

# dict = {
#     'name': 'Germey'
# }

# 第三部 解析目标网站,得到网页源代码  --> class = info
# data = bytes(parse.urlencode(dict),encoding='utf-8')
data = parse.urlencode({'name': 'Germey'})


# 定义一个函数,目的:获得网页数据
def getSource(url):
    req = Request(url=url, data=data.encode(), headers=headers)
    # req = request.Request(url = url, data=data, headers={'User-Agent': ua})

# req.add_header('User-agent', ua)

    response = urlopen(req, timeout=5)  # GET
    # response = requests.get(url)

    # 修改编码格式,防止出现乱码
    response.encoding = 'utf-8'

    return response

# 定义第二个函数,目的:获取class = info数据,每一个电影信息,标题 引言 地址
def getEveryItem(source):

    # selector = lxml.html.document_fromstring(source)

    selector = lxml.html.document_fromstring(source.read())
    # selector = source.read()
    # 通过xpath技术来找到 calss = info
    # // 表示可以提取某个标签所有信息
    # / 表示逐层查找
    # @ 表示选取属性
    movieItemList = selector.xpath('//div[@class="info"]')
    # print('movieItemList', movieItemList)
    # 定义一个空列表,目的:展示数据
    movieList = []
    # 找每一个电影信息,标题 引言 地址
    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[@class="inq"]/text()')
        # print(eachMovie.xpath('//div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()'))
        # 增加索引,去掉获取数据中的[],同时处理没有影评的数据

        if quote:
            quote = quote[0]
        else:
            quote = ''

        # # 保存到字典
        movieDict['title'] = ''.join(title + otherTitle)
        # movieDict['title'] = title
        movieDict['link'] = link

        movieDict['star'] = star

        movieDict['quote'] = quote

        # 把列表数据添加到列表中
        movieList.append(movieDict)

    return movieList

# 第四步 下载数据
# 定义第三个函数
def writeData(movieList):
    # E:\02_python3.5\workspace\pypc\pc_demo\
    with open('douban.csv', 'w', encoding='utf-8', newline='') as ft:
        # write = csv.DictWriter(ft, fieldnames=['标题', '评分', '评论', '链接'])
        write = csv.DictWriter(ft, fieldnames=['title', 'star', 'quote', 'link'])

        write.writeheader() # 写入表头

        for each in movieList:

            write.writerow(each)


# 启动程序

if __name__ == '__main__':
    movieList = []
    for i in range(0, 11):
        # 获取每一页Url
        pageLink = doubanUrl.format(i * 25)
        # print(pageLink)
        # 有Url,就可以获取电影网页
        source = getSource(pageLink)

        # # 有了source,就可以获取电影信息
        movieList += getEveryItem(source)

    # 调用写csv函数
    writeData(movieList)