Python爬虫 爬取豆瓣电影Top250信息

时间:2022-07-25
本文章向大家介绍Python爬虫 爬取豆瓣电影Top250信息,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

一、分析网页

翻页查看url变化规律:

第一页: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=225&filter=

分析可得页面url的规律:

url_list = “https://movie.douban.com/top250?start={}&filter=”.format(x * 25) for x in range(10)

二、多线程爬取电影封面图

单线程版

import requests
from lxml import etree
import datetime

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
}

# 设置保存路径   保存到指定文件夹  路径复制过来
path = input("请输入保存路径:")
start_time = datetime.datetime.now()


def get_pic(url):
    rep = requests.get(url, headers=headers).text
    html = etree.HTML(rep)
    # 获取电影封面图  电影名称  xpath定位提取   得到的是列表
    src = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@src')
    name = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@alt')
    # 保存到本地
    for src, name in zip(src, name):
        file_name = name + ".jpg"
        img = requests.get(src, headers=headers).content
        with open(path + "/" + file_name, "wb") as f:
            f.write(img)


if __name__ == "__main__":
	# 列表推导式得到url列表  10页的电影信息  Top250
    url_list = ["https://movie.douban.com/top250?start={}&filter=".format(x * 25) for x in range(10)]
    for url in url_list:
        get_pic(url)
    delta = (datetime.datetime.now() - start_time).total_seconds()
    print("抓取250张电影封面图用时:{}s".format(delta))

单线程抓取250张电影封面图所用时间:

多线程版

import requests
from lxml import etree
import datetime
from concurrent.futures import ThreadPoolExecutor

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
}

# 设置保存路径   保存到指定文件夹  路径复制过来
path = input("请输入保存路径:")
start_time = datetime.datetime.now()


def get_pic(url):
    rep = requests.get(url, headers=headers).text
    html = etree.HTML(rep)
    # 获取电影封面图  电影名称  xpath定位提取   得到的是列表
    src = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@src')
    name = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@alt')
    # 保存到本地
    for src, name in zip(src, name):
        file_name = name + ".jpg"
        img = requests.get(src, headers=headers).content
        with open(path + "/" + file_name, "wb") as f:
            f.write(img)


if __name__ == "__main__":
	# 列表推导式得到url列表  10页的电影信息  Top250
    url_list = ["https://movie.douban.com/top250?start={}&filter=".format(x * 25) for x in range(10)]
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(get_pic, url_list)
    delta = (datetime.datetime.now() - start_time).total_seconds()
    print("抓取250张电影封面图用时:{}s".format(delta))

多线程抓取250张电影封面图所用时间:

程序成功运行,250张电影封面图保存到了本地文件夹,通过比较,开多线程抓取电影封面图,抓取效率有明显提高。

三、爬取电影信息

import requests
from lxml import etree
import openpyxl

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
}

wb = openpyxl.Workbook()    # 创建工作簿对象
sheet = wb.active           # 获取工作簿的活动表
sheet.title = "movie"       # 工作簿重命名
sheet.append(["排名", "电影名", "导演和主演", "上映时间", "上映地区", "电影类型", "评分", "评价人数", "引言"])


def get_movie(urls):
    rank = 1
    for url in urls:
        res = requests.get(url, headers=headers).text
        html = etree.HTML(res)
        # 先xpath定位提取到每个页面的所有li标签
        lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
        # 每个li标签里有每部电影的基本信息
        for li in lis:
            name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
            director_actor = li.xpath('.//div[@class="bd"]/p/text()')[0].strip()
            info = li.xpath('.//div[@class="bd"]/p/text()')[1].strip()
            # 按"/"切割成列表
            _info = info.split("/")
            # 得到 上映时间  上映地区  电影类型信息   去除两端多余空格
            time, area, genres = _info[0].strip(), _info[1].strip(), _info[2].strip()
            # print(time, area, genres)
            rating_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
            rating_num = li.xpath('.//div[@class="star"]/span[4]/text()')[0]
            quote = li.xpath('.//p[@class="quote"]/span/text()')
            # 最后一页有部电影  九品芝麻官  没有一句话引言  加条件判断  防止报错
            if len(quote) == 0:
                quote = None
            else:
                quote = quote[0]
            sheet.append([rank, name, director_actor, time, area, genres, rating_score, rating_num, quote])
            rank += 1
    # 保存到Excel
    wb.save("movie.xlsx")


if __name__ == "__main__":
    # 列表推导式得到url列表  10页的电影信息  Top250
    url_list = ["https://movie.douban.com/top250?start={}&filter=".format(i * 25) for i in range(10)]
    get_movie(url_list)

程序成功运行,豆瓣电影Top250榜单上电影的基本信息保存到了本地Excel里。

作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。