使用Selenium爬取豆瓣电影前100的爱情片相关信息

slenium入门小练手之使用Selenium爬取豆瓣电影前100的爱情片相关信息

文章目录

  • 什么是Selenium
  • 1.准备工作
    • 1.1 安装Selenium
    • 1.2 浏览器驱动安装
    • 1.3 环境变量添加
    • 1.4 小试牛刀
  • 2.相关步骤
    • 2.1 引入相关模块
    • 2.2 获取信息
    • 2.3 设置等待时间
      • 2.3.1 显式等待
      • 2.3.2 隐式等待
      • 2.3.3 强制等待(补充)
    • 2.4 页面自动下滑
    • 2.5 保存文件
  • 3.完整代码

什么是Selenium

Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。


1.准备工作

由于Selenium的环境配置过程比较繁琐,我会尽可能详细的对其进行讲解。

1.1 安装Selenium

由于Selenium的环境配置过程比较繁琐,我会多花一些篇幅对其进行讲解。可以在cmd命令框输入以下内容安装Selenium库。

pip install Selenium

1.2 浏览器驱动安装

Selenium的使用必须有相应浏览器的webdriver,以Chrome浏览器为例,可以在这个链接查看自己的浏览器对应的Chromedriver的版本。

1.3 环境变量添加

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录, , 将下载的浏览器驱动文件丢到该目录下。然后在我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将该目录添加到Path的值中。如果配置变量有问题,可以参照这个链接
注意,如果系统报错为:

selenium.common.exceptions.SessionNotCreatedException: Message: session not created:This version of ChromeDriver only supports Chrome version***

表示当前下载的Chromedriver的版本与自己浏览器的版本无法对应,可以通过Chrome的帮助查看自己的浏览器版本

1.4 小试牛刀

接下来就可以测试我们的selenium是不是可以正常使用了,以一个简单的例子开始:驱动浏览器打开百度。

from selenium import webdriver

url='https://www.baidu.com/'
browser=webdriver.Chrome()
browser.get(url)

如果到这里都没有问题的话,就已经可以开始进行下一步了。


2.相关步骤

2.1 引入相关模块

首先导入本次爬虫任务需要的相关库:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

其中selenium.webdriver.common.by 主要用于搜寻网页元素的id信息,用于定位按钮、输入框之类的元素,WebDriverWait主要是用于等待网页响应完成,因为网页没有完全加载,就使用find_elements_by_**等方法,就会出现找不到对应元素的情况。

2.2 获取信息

movies=browser.find_elements_by_class_name('movie-name-text')
    names=[]
    for item in movies:
        if item.text!='':
            names.append(item.text)

其中find_elements_by_class_name就是通过查找class_name来锁定影片名称这个信息。

审查元素后右键即可Copy这个元素的JS pathselector等信息,可以锁定这个元素及其类似的其他元素的信息。以'霸王别姬’这部影片为例,他的selector就是#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(1) > div > div > div.movie-name > span.movie-name-text > a
那么就可以用下面的代码来锁定影片名称。

movies=browser.find_elements_by_class_name('#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(1) > div > div > div.movie-name > span.movie-name-text > a')

2.3 设置等待时间

前面已经说过,如果页面还没有完全加载出,我们就进行元素的查找,返回的很可能是空列表,所以我们需要设置等待时间。
这里就涉及到显示等待和隐式等待的区别。

2.3.1 显式等待

每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常(TimeoutException)代码格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

2.3.2 隐式等待

隐式等待是通过一定的时长等待页面上某个元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常。
操作如下:implicitly_wait()
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0,一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。我们这里使用的就是隐式等待。

def get_page():
    browser.implicitly_wait(10)
    for i in range(50):
        time.sleep(0.3)
        browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
        print('正在下滑第{}次'.format(i))
        print('-------------')
    #time.sleep(10)
    print("*****请等待几秒*****")
    time.sleep(10)
    when=wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(380) > div > a > img')))

2.3.3 强制等待(补充)

强制等待就是使用python自带的time模块,设置等待时间,操作如下:time.sleep(time)一般可以用强制等待来限制计算机频繁访问目标链接导致验证问题。


2.4 页面自动下滑

页面下滑过程比较简单,不多赘述。其实现过程如下:

browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下滑操作

2.5 保存文件

爬取出的数据是列表形式,使用pandas的to_csv方法就可以保存到本地了。

rate,miscs,actor_list,ranks,playable_sign,names=get_page()
    datas=pd.DataFrame({'names':names,'rank':ranks,'分类':miscs,'评分':rate})
    try:
        datas.to_csv('机器学习\爬虫\douban_0327.csv',encoding='utf_8_sig')
        print("保存成功")
        print(datas)

3.完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import pandas as pd
import time

url='https://movie.douban.com/typerank?type_name=爱情片&type=13&interval_id=100:90&action='
options=webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"')
browser=webdriver.Chrome()
browser.get(url)
wait=WebDriverWait(browser,10)
def get_page():
    browser.implicitly_wait(10)
    for i in range(50):
        time.sleep(0.3)
        browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下滑操作
        print('正在下滑第{}次'.format(i))
        print('-------------')
    #time.sleep(10)
    print("*****请等待几秒*****")
    time.sleep(10)
    when=wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(380) > div > a > img')))
#-----------------------------------------------------------------
    movies=browser.find_elements_by_class_name('movie-name-text')
    names=[]
    for item in movies:
        if item.text!='':
            names.append(item.text)
    print("爬取成功")
    print(len(names))
#---------------------------------------------------------------
    playables=browser.find_elements_by_class_name('playable-sign')
    playable_sign=[]
    for sign in playables:
        if sign.text!='':
            playable_sign.append(sign.text)
    print('爬取成功')
    print(len(playable_sign))
#------------------------------------------------------------
    rank_names=browser.find_elements_by_class_name('rank-num')
    ranks=[]
    for rank in rank_names:
        if rank.text!='':
            ranks.append(rank.text)
    print('爬取成功')
    print(len(ranks))
#---------------------------------------------------------
    actors=browser.find_elements_by_class_name('movie-crew')
    actor_list=[]
    for actor in actors:
        if actor.text!='':
            actor_list.append(actor.text)
    print('爬取成功')
    print(len(actor_list))
#----------------------------------------------------------
    clasic=browser.find_elements_by_class_name('movie-misc')
    miscs=[]
    for misc in clasic:
        if misc.text!='':
            miscs.append(misc.text)
    print('爬取成功')
    print(len(miscs))
#-----------------------------------------------------------
    rates=browser.find_elements_by_class_name('movie-rating')
    rate=[]
    for score in rates:
        if score.text!='':
            rate.append(score.text)
    print('爬取成功')
    print(len(rate))
#-----------------------------------------------------------
    '''
    links=browser.find_elements_by_class_name('movie-content')
    for link in links:
        link_img=link.get_attribute('data-original')
        print(link_img)
    '''
    return rate,miscs,actor_list,ranks,playable_sign,names

if __name__ == "__main__":
    rate,miscs,actor_list,ranks,playable_sign,names=get_page()
    datas=pd.DataFrame({'names':names,'rank':ranks,'分类':miscs,'评分':rate})
    try:
        datas.to_csv('机器学习\爬虫\douban_0327.csv',encoding='utf_8_sig')
        print("保存成功")
        print(datas)
    except:
        print('保存失败')

小白上路,如有错误请多多指正!

来源:https://www.icode9.com/content-4-897251.html

(0)

相关推荐

  • selenium+python自动化91-多线程启动多个不同浏览器

    一.前言 如果想用多个浏览器跑同一套测试代码,driver=webdriver.Firefox()这里的driver就不能写死了,可以把浏览器名称参数化. 后续如果想实现多线程同时启动浏览器执行用例, ...

  • 反了!居然让我教她自动化测试!

    来源:Python 技术「ID: pythonall」 一个做测试的居然让我教她怎么做自动化测试,真是反了--行吧,正好懂一些 Selenium,今天就来跟大家一起了解下 Python 如何使用 Se ...

  • 爬虫神器 Pyppeteer 介绍及爬取某商城实战

    重磅干货,第一时间送达 作者:叶庭云,来自读者投稿 编辑:Lemon 出品:Python数据之道 提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支 ...

  • Selenium2+python自动化71-多个浏览器之间的切换

    前言 有时候一些业务的功能涉及到多个系统,需要在web系统1打开造一些数据,然后用到某些参数是动态生成的,需要调用web系统2里面的参数. 举个简单例子:在做某些业务的时候,需要手机短信验证码,我不可 ...

  • 使用selenium自动化操作浏览器

    selenium借助驱动程序webdriver来驱动相应的浏览器,以最常用的谷歌和火狐浏览器为例,对应的驱动程序如下 1. chromdriver, 谷歌浏览器的驱动程序 2. geckodriver ...

  • 第69天:Selenium详解

    Selenium 环境配置好之后,我们就可以使用 Selenium 来操作浏览器,做一些我们想做的事情了.在我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析 HTML 代码获取,这些 ...

  • Python实现数据技术|爬虫便可获取免费百度文库付费文档

    相信大家在百度文档中看到了比较合适的文档之后就有了想下载学习一下的想法,但是有些时候文章更多的需要付费下载,针对于文档中能发现语句是分为一个一个的标签中的文本进行输出的.如果你有耐心和任劳任怨的想法, ...

  • 这样教都不会?还得我亲自出马!

    来源:Python 技术「ID: pythonall」 上次说到了还有别的方法能找到搜索框吗?答案是当然有了.而且为了满足大部分场景,有很多方法可以定位元素.今天就来继续跟大家一起学习下 Python ...

  • 第119天:Python 爬取豆瓣电影 top 250

    豆瓣作为一个汇聚书影音内容的社区网站,得到了大量用户的认可和青睐,现在很年轻人在看电影或者买书之前都会去豆瓣上看一下评分和相关评论,不得不说豆瓣评分在一定程度上很客观的反映了一部作品的受欢迎程度. 今 ...

  • Python爬虫日记一:爬取豆瓣电影中速度与激情8演员图片

    2017.04.27 16:34:04字数 915阅读 1,958 一.前言 这是我第一次写文章,作为一个非计算机,编程类专业的大二学生,我希望能够给像我这样的入门的朋友一些帮助,也同时激励自己努力写 ...

  • python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看

    马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...

  • python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影

    我们在之前的文章谈到了高效爬虫 在 python 中 多线程下的 GIL 锁会让多线程显得有点鸡肋 特别是在 CPU 密集型的代码下 多线程被 GIL 锁搞得效率不高 特别是对于多核的 CPU 来说 ...

  • 使用Selenium爬取网站表格类数据

    本文转载自一下网站:Python爬虫(5):Selenium 爬取东方财富网股票财务报表 https://www.makcyun.top/web_scraping_withpython5.html 需 ...

  • pyquery爬取豆瓣读书

    用pyquery爬取豆瓣读书 正常来说,只要清楚些爬虫的任务需求,可以将写爬虫的逻辑顺序按照从大到小,或者从小到大.所以这篇文章可以倒着读或者正着读.本文按照从大到小逻辑编写代码和文章,如下图 大 中 ...

  • python爬取豆瓣影评存数据库【新手必入】

    效果展示 需要用到的库 import requestsfrom time import sleepfrom lxml import etreeimport pymysql 首先看看我们要爬的页面链接 ...

  • Python爬虫入门教程:豆瓣Top电影爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理.   基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests p ...

  • Python爬虫入门教程01:豆瓣Top电影爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...