过年观影指南(一)
本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张 邯
之前在《Python爬虫之selenium爬取国际自然科学基金数据库(一)》介绍了selenium的初步使用,在《selenium登录豆瓣》中用selenium自动登录了豆瓣,今天小编打算用selenium来下载豆瓣电影的预告片。程序写好之后,只需更改输入的搜索内容即可按照自己的需求,看着电脑自行下载,十分痛快!最近的《唐人街探案3》就要上映了,先来看看刘昊然精彩的预告片吧~
首先使用webdriver进入豆瓣电影网页。
from selenium import webdriver
CHROME_DRIVER="F:\\ chromedriver.exe" #填写放置chromedriver的路径
driver=webdriver.Chrome(executable_path=CHROME_DRIVER)
driver.set_window_position(0,0)
driver.maximize_window()
url='https://movie.douban.com/'
driver.get(url) #进入豆瓣电影网页
然后进行检索,把光标放在搜索框中,在搜索框中输入想要搜索的电影名称,如“唐人街探案3”,按下回车键进行检索。
from selenium.webdriver.common.keys import Keys #引入键盘动作模块
driver.implicitly_wait(10) # 隐性等待,最长等10秒
driver.find_element_by_xpath('//*[@id="inp-query"]').click() #鼠标放到搜索键上
driver.find_element_by_xpath('//*[@id="inp-query"]').send_keys("唐人街探案3") #输入电影名称
driver.find_element_by_xpath('//*[@id="inp-query"]').send_keys(Keys.ENTER) #按下回车键
接着,向下滚动鼠标滑轮,点击第一个搜索结果,再点击“预告片”,就进入了想要得到的视频的总链接了。
from selenium.webdriver.common.by import By #引入定位寻找模块
from selenium.webdriver.common.keys import Keys #引入键盘动作模块
from selenium.webdriver import ActionChains #引入鼠标行为模块
driver.implicitly_wait(10) # 隐性等待,最长等10秒
driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[1]/div[1]/div[1]/div[1]/div/div[1]/a').click() #点击第一个搜索结果
driver.execute_script('window.scrollTo(0,1000)') #向下滑动鼠标
driver.find_element_by_xpath('//*[@id="related-pic"]/h2/span/a[1]').click() #点击预告片
driver.implicitly_wait(10) # 隐性等待,最长等10秒
tovideo_url=driver.current_url
print(tovideo_url) #显示当前链接
结果为:
https://movie.douban.com/subject/27619748/trailer#trailer
现在进入了预告片的总链接,接下来想得到每一个预告片的视频。小编尝试从这个网页上找链接,找不到,于是考虑进入每一个视频的网页里,进行二次爬取。需要先从预告片总链接里找到每一个预告片视频对应的分链接,以便进行二次抓取。
首先分析网页源代码,获取每个分链接对应的xpath路径。
想要得到这个元素对应的文本信息,如果直接print,结果显示为selenium对象,无法显示元素内的信息,此时需要使用text方法。
video_href_list=driver.find_elements_by_xpath('//div[@class="mod"][1]/ul[1]/li/p[1]/a') #定位预告片视频的xpath
print(video_href_list) #返回结果是selenium对象,无法显示内容
结果是:
vititle=[]
for i in video_href_list:
vititle.append(i.text) #将视频的标题放到vititle中
print(vititle)
结果是:
至此得到了视频的标题文字,现在想要得到每个视频对应的链接,分析源代码发现是该元素对应的一个href属性。那么现在想做一件用xpath来提取元素属性的事情,在xpath解析中可以这样得到:'//div[@class="mod"][1]/ul[1]/li/p[1]/a/@href',可是这一方法并不适用于selenium,这里需要使用get_attribute()方法得到相应的元素属性。
vilist =[]
for i in video_href_list:
vilist.append(i.get_attribute("href")) #将href放到vilist中
print(vilist)
结果是:
至此就得到了每一个预告片视频对应的链接了。完整程序如下:
###selenium下载豆瓣电影 预告片
from selenium import webdriver
from selenium.webdriver.common.by import By #引入定位寻找模块
from selenium.webdriver.common.keys import Keys #引入键盘动作模块
from selenium.webdriver import ActionChains #引入鼠标行为模块
CHROME_DRIVER="F:\\ chromedriver.exe" #填写放置chromedriver的路径
driver=webdriver.Chrome(executable_path=CHROME_DRIVER)
driver.set_window_position(0,0)
driver.maximize_window()
url='https://movie.douban.com/'
driver.get(url) #进入豆瓣电影网页
driver.implicitly_wait(10) # 隐性等待,最长等10秒
driver.find_element_by_xpath('//*[@id="inp-query"]').click() #鼠标放到搜索键上
driver.find_element_by_xpath('//*[@id="inp-query"]').send_keys("唐人街探案3") #输入电影名称
driver.find_element_by_xpath('//*[@id="inp-query"]').send_keys(Keys.ENTER) #按下回车键
driver.implicitly_wait(10) # 隐性等待,最长等10秒
driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[1]/div[1]/div[1]/div[1]/div/div[1]/a').click() #点击第一个搜索结果
driver.execute_script('window.scrollTo(0,1000)') #向下滑动鼠标
driver.find_element_by_xpath('//*[@id="related-pic"]/h2/span/a[1]').click() #点击预告片
driver.implicitly_wait(10) # 隐性等待,最长等10秒
tovideo_url=driver.current_url
print(tovideo_url) #显示当前链接
video_href_list=driver.find_elements_by_xpath('//div[@class="mod"][1]/ul[1]/li/p[1]/a') #定位预告片视频的xpath
print(video_href_list) #返回结果是selenium对象,无法显示内容
vilist =[]
vititle=[]
for i in video_href_list:
vilist.append(i.get_attribute("href")) #得到element的href属性
vititle.append(i.text) #得到element的文本内容
print(vilist)
print(vititle)
driver.quit()
在下一篇推文中,我们将进入每一链接,进行二次抓取,下载一下今年贺岁片《唐人街探案3》的预告片视频,敬请期待~
自科基金项目信息爬取
rename group批量修改变量名
小命令,大不同——insobs插入新值
新的一年,效率满满~(上)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。