专栏首页伪君子的梦呓用 Python 爬取豆瓣电影海报

用 Python 爬取豆瓣电影海报

伪君子

读完需要

9

分钟

速读仅需 4 分钟

0 前言

之前写过一篇用 Python 爬取豆瓣上的图片,那今天就来写一下爬取豆瓣上的电影海报,算是姐妹篇。

1 环境说明

Win10 系统下 Python3,编译器是 PyCharm 。requests 可以直接用 pip install requests 安装,lxml、selenium 也一样,要是不知道该怎么安装,那还是用 PyCharm 安装吧。

PyCharm 安装第三方库

PyCharm 安装第三方库 还需要下载和配置 ChromeDriver,可以看看这篇文章里面的内容。

2 代码

代码不算多,为了能解释清楚,所以也是按顺序分开来,用的时候按顺序复制就好。

先导入要用的库

import os
import requests
from lxml import etree
from selenium import webdriver

query 是查询,在代码里的意思是想要爬取的人的名字,随意修改。

path 这个是可以随意修改的,可以把 path = os.getcwd() 这一句注释,然后下面那一句注释掉。path = os.getcwd() 的作用是获得当前文件的路径,然后把这个 .py 文件的路径赋值给 path。

path = 'C:/Users/ASUS/Desktop/测试' 的意思是一样的,把后面这个路径赋给 path,如果用这个的话,记得修改成自己想要的路径。两个语句只能选择一个,另一个需要注释掉,不然程序会把最后一个赋值语句的值赋给 path。

picpath 就是图片所在的目录,接下来就是要判断一下这个目录是否创建了,如果没有创建,那就创建。

query = '王祖贤'  # 名字可以随便换
path = os.getcwd()  # 当前路径,可以替换成别的路径
# path = 'C:/Users/ASUS/Desktop/测试'
picpath = path + '/' + query  # 设置的图片目录
print(picpath)  # 输出设置的图片目录
if not os.path.isdir(picpath):  # 如果图片目录未创建则创建一个
    os.mkdir(picpath)

这里是下载图片的 download 函数,传入的 src 是图片的链接,传入的 id 是图片的名称,图片的完整名就是图片对应的 id 再加上 .jpg。

dir 就是图片的路径,先是请求图片,如果遇到网络问题导致请求不到,那么就捕获 requests 的 ConnectionError 异常。如果能够请求到,那就打开以 wb 也就是二进制写模式打开图片,图片的路径就是上面说到的dir 。打开之后就把请求到的图片的内容写入,然后关闭。

def download(src, id):
    dir = picpath + '/' + str(id) + '.jpg'
    try:
        pic = requests.get(src, timeout=10)
    except requests.exceptions.ConnectionError:
        # print 'error, %d 当前图片无法下载', %id
        print('图片无法下载')
    fp = open(dir, 'wb')
    fp.write(pic.content)
    fp.close()

这里是关于 ChromeDriver 的部分,需要下载和配置 ChromeDriver,可以看看这篇文章里面的内容,里面有提及到。

driver_path = "C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe"  # chromedriver 的路径
browser = webdriver.Chrome(executable_path=driver_path)

for i in range(0, 6*15, 15): ,意思是从 0 开始到 75,每一个间隔是 15,例如,0、15、30、45、60、75,这里要说明的是,90 是不算在内的。

6*15 是因为王祖贤的电影海报只有 6 页,6 可以改成 10,最多就是程序运行多一会,不会有太多的影响。

对提取出来的 src 进行替换链接,s_ratio_celebrity 和 s_ratio_poster 都是小图,替换成 l 之后就是大图。webp 替换成 jpg,方便下载之后查看图片。

for i in range(0, 10*15, 15):
    url = 'https://movie.douban.com/subject_search?search_text=' + query + '&cat=1002' + '&start=' + str(i)
    browser.get(url)  # 打开浏览器
    html = etree.HTML(browser.page_source)
    # print(browser.page_source)
    src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"  # 所有图片的 XPath
    title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"  # 所有电影名称的 XPath
    srcs = html.xpath(src_xpath)  # 获取页面中所有的 src_xpath,把值传给 srcs
    titles = html.xpath(title_xpath)  # 获取页面中所有的 title_xpath,把值传给 titles

    for src, title in zip(srcs, titles):
        src = src.replace('s_ratio_celebrity', 'l')
        src = src.replace('s_ratio_poster', 'l')
        src = src.replace('webp', 'jpg')
        title.text = title.text.replace('?', '')
        print('\t'.join([str(src), str(title.text)]))  # 把链接和标题输出,方便查看。
        download(src, title.text)  # 传到下载函数那进行下载

下载完成后输出一个『下载完成』,然后关闭浏览器。

print("下载完成")
browser.close()  # 下载完成后关闭浏览器

3 补充说明

3.1 url 为什么是这个?

url = 'https://movie.douban.com/subject_search?search_text=' + query + '&cat=1002' + '&start=' + str(i)

先去豆瓣电影那搜索一下王祖贤,把每一页的链接都看一遍。

https://movie.douban.com/

看完后应该就理解了。

3.2 src_xpath 、title_xpath 哪来的

首先,先下载一个谷歌浏览器扩展程序,名字叫『XPath Helper』,不会下载可以看我之前写的教程

安装完成后点击 XPath Helper 的图标就能显示和隐藏 XPath Helper 的界面,也可以使用快捷键 Ctrl+Shift+X 显示和隐藏 XPath Helper 的界面。

把 XPath 黏贴到 QUERY 框内就能看到这个 XPath 对应的内容。

当然,也可以按住 Ctrl+Shift,然后移动鼠标来查看 XPath.

浏览器复制出来的 XPath 和 XPath Helper 找到的 XPath 是有区别的,建议是使用 XPath Helper 找到的 XPath.

src_xpath 和 title_xpath 都是一步步试出来的。(这里是极客时间里《数据分析实战45讲》课程的作者陈旸试出来的)

src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"  # 所有图片的 XPath
title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"  # 所有电影名称的 XPath

3.3 结果

下载后去查看图片,如果看到下图中圈出来的图片,这不说明程序出问题,这只是豆瓣没有这个电影的海报。

4 说明

本文和本文的姐妹篇都是根据极客时间里《数据分析实战45讲》的其中一讲的内容展开写写的,需要说明的是,通过下面这个二维码购买课程,我有 6 元返利。

题图:Photo by Pablo Merchán Montes on Unsplash

本文分享自微信公众号 - 伪君子的梦呓(beiyue_lbj)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 安装和配置 Java 环境

    下面的在 win7 32 位电脑上安装 Java 的过程,目前最新的是 Java 10,由于 Java 10 Windows x86 的版本,所以只能下载和安装...

    伪君子
  • 3 种方法爬一个网页上的所有图片

    然后等谷歌浏览器下载完成,接着你会看得一个 html 文件,当然,还有一个和这个 html 文件命名相同的文件夹。

    伪君子
  • 电脑使用 Vysor 控制手机

    想用安卓手机一步一步演示个东西给别人看的时候,恰巧遇到对方不在身边;安卓手机上的东西想投影到 Windows 电脑上,用电脑控制手机,却没找到合适的方式;上班时...

    伪君子
  • Java面试集合(三)

    1.在Java中是否可以含有多个类? 答:可以含有多个类,但只有一个是public类,public类的类名与文件名必须一致。

    达达前端
  • 重要通知!小编出新的Java练习题咯!!

    正确答案 3月5号公布 一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是( )。 A. import ...

    Java学习
  • Python 按比例获取样本数据或执行任务

    已知每种分类的样本占比数,及样本总数,需要按比例获取这些分类的样本。比如,我有4种任务要执行,分别为任务A,任务B,任务C,任务D, 要求执行的总任务次数为10...

    授客
  • Eclipse安装JD-Eclipse反编译插件

    Java学习123
  • 分享—PCL 编译成.net可用的 DLL

    这是关于PCL 编译成.net可用的DLL ,来自于ccjia的分享,希望大家都能够踊跃的敢于分享,

    点云PCL博主
  • 苹果正式发布 iOS 14,多个组件更新还有「画中画」,iOS更像安卓了?

    今天iPhone 6S以上的用户就可以更新 iOS 14了,这是为 iPhone 设计的最新操作系统。而 iPadOS 14也可以在 iPad Air 2或更高...

    新智元
  • 选择Spring Boot项目的内嵌容器

    Spring Boot工程的默认web容器是Tomcat,但是开发人员可以根据需要修改,例如使用Jetty或者Undertow,Spring Boot提供了对应...

    阿杜

扫码关注云+社区

领取腾讯云代金券