伪君子
读完需要
9
分钟
速读仅需 4 分钟
之前写过一篇用 Python 爬取豆瓣上的图片,那今天就来写一下爬取豆瓣上的电影海报,算是姐妹篇。
Win10 系统下 Python3,编译器是 PyCharm 。requests 可以直接用 pip install requests 安装,lxml、selenium 也一样,要是不知道该怎么安装,那还是用 PyCharm 安装吧。
PyCharm 安装第三方库
PyCharm 安装第三方库 还需要下载和配置 ChromeDriver,可以看看这篇文章里面的内容。
代码不算多,为了能解释清楚,所以也是按顺序分开来,用的时候按顺序复制就好。
先导入要用的库
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() # 下载完成后关闭浏览器
url = 'https://movie.douban.com/subject_search?search_text=' + query + '&cat=1002' + '&start=' + str(i)
先去豆瓣电影那搜索一下王祖贤,把每一页的链接都看一遍。
https://movie.douban.com/
看完后应该就理解了。
首先,先下载一个谷歌浏览器扩展程序,名字叫『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
下载后去查看图片,如果看到下图中圈出来的图片,这不说明程序出问题,这只是豆瓣没有这个电影的海报。
本文和本文的姐妹篇都是根据极客时间里《数据分析实战45讲》的其中一讲的内容展开写写的,需要说明的是,通过下面这个二维码购买课程,我有 6 元返利。
题图:Photo by Pablo Merchán Montes on Unsplash