selenium爬取豆瓣电影和电视剧

简述

代码直接借助python的selenium的库来控制浏览器,与requests和bs4相比,selenium允许你用高级多的方法实现网页交互,但是因为他启动了Web浏览器,下载文件会比较慢,并且难以在后台运行。假如你考虑的不是通过此程序来练习,那么就直接退出这篇文章。

思路上面,在父页面获取10部电影或者电视剧的link,然后跳转到电影详情页,进行信息爬取。

import os,re
from time import sleep
from selenium import webdriver

URL = "https://www.douban.com/"
URLmovie = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'
URLseries = ''#后面直接加入跳转,无需这个变量
webdri_path = r'C:\Users\86151\AppData\Local\Google\Chrome\Application\chromedriver.exe'
global flag 

os.mkdir(os.path.join(".","douban"))
os.mkdir(os.path.join(".","douban","movie"))
os.mkdir(os.path.join(".","douban","series"))

# 定义一个函数来获取电影的相关信息,并且存放在文件里面
def getInfo(titleOfWork,aim):
    # 获取电影发布时间和作品名称
    releaseTime = driver.find_element_by_class_name('year')
    if int(re.sub(r"\D","",releaseTime.text)) < 2018:
        return
    # 利用正则表达式取出发布时间中的非数字内容
    fileName = re.sub(r"\D","",releaseTime.text) + re.sub(r"\W","",titleOfWork)
    print(fileName)
    os.mkdir(os.path.join(".","douban",aim,fileName))

    # 存放电影图片
    driver.find_element_by_xpath('//*[@id="mainpic"]/a/img').screenshot(os.path.join(".","douban",aim,fileName,"pic.png"))
    # 创建一个txt文件,写入作品的基本内容,名称,上映年份,导演,主演,作品简介,豆瓣关于这个作品的链接
    with open(os.path.join(".","douban",aim,fileName,"info.txt"),"a") as movieFile:
        # 写入作品名称
        movieFile.write(titleOfWork+"\n")
        # 写入作品上映年份
        movieFile.write("上映日期:" + re.sub(r"\D","",releaseTime.text)+"\n")
        # 写入作品导演
        director = driver.find_element_by_class_name('attrs').text
        movieFile.write("导演:" + director+"\n")
        # 写入作品主演
        starring = driver.find_element_by_class_name('actor').text
        movieFile.write(starring+"\n")
        # 写入作品简介
        # introduction = driver.find_element_by_xpath('//*[@id="link-report"]/span[1]').text
        introduction = driver.find_element_by_class_name('related-info').text
        movieFile.write(introduction+"\n")
        # 写如链接
        movieFile.write("链接:"+driver.current_url)
        global flag 
        flag +=1
def openURL(aim,Links):
    global flag
    flag = 0
    for link in Links:
        # 获取电影名称
        titleOfWork = link.text
        print(type(link.text[-3:]))
        if ("." not in titleOfWork[-3:]) or (float(titleOfWork[-3:]) < 7):
            continue
        driver.execute_script(js.format(link.get_attribute("href")))
        driver.switch_to_window(driver.window_handles[-1])
        getInfo(titleOfWork[:-3],aim)
        # 关闭新建的电影窗口
        driver.close()
        driver.switch_to_window(driver.window_handles[0])
        if flag == 10:
            break
try:
    driver = webdriver.Chrome(webdri_path)
    driver.get(URLmovie)
    driver.implicitly_wait(3)
    driver.maximize_window()
    sleep(1)
    js = "window.open('{}','_blank');"

    # 选10部电影,按评价排序选取电影
    driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[2]/div[1]/form/div[3]/div[1]/label[2]/input').click()
    driver.find_elements_by_css_selector('.tag-list label')[4].click()
    # 将所有的电影链接存放在links数组里面
    movieLinks = driver.find_elements_by_class_name("item")
    openURL("movie",movieLinks)

    # 处理电视剧部分
    driver.find_element_by_xpath('//*[@id="db-nav-movie"]/div[2]/div/ul/li[3]/a').click()
    seriesLinks = driver.find_elements_by_class_name("item")
    openURL("series",seriesLinks)

    driver.quit()
except Exception as e:
    print(e)

常见问题

  1. 不能运行,看看是否安装webdriver。我用的是谷歌浏览器,所以使用的是谷歌的webdriver,请安装对应浏览器的对应版本。
  2. 有可能显示到一个让你登录的页面,这是由于我在刚开始打开页面时不是真正的豆瓣主页面。可以试着改变网络,或者增加跳转。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值