• 售前

  • 售后

热门帖子
入门百科

详解利用Selenium爬取豆瓣影戏前100的爱情片相关信息

[复制链接]
楼琴观雪让 显示全部楼层 发表于 2021-10-26 12:54:10 |阅读模式 打印 上一主题 下一主题
什么是Selenium


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


由于Selenium的情况设置过程比力繁琐,我会尽可能详细的对其举行讲解。
1.1 安装Selenium


由于Selenium的情况设置过程比力繁琐,我会多花一些篇幅对其举行讲解。可以在cmd命令框输入以下内容安装Selenium库。
  1. pip install Selenium
复制代码
1.2 欣赏器驱动安装


Selenium的利用必须有相应欣赏器的webdriver,以Chrome欣赏器为例,可以在这个链接查看本身的欣赏器对应的Chromedriver的版本。
1.3 情况变量添加


设置欣赏器的地点非常简单。 我们可以手动创建一个存放欣赏器驱动的目次, , 将下载的欣赏器驱动文件丢到该目次下。然后在我的电脑–>属性–>体系设置–>高级–>情况变量–>体系变量–>Path,将该目次添加到Path的值中。假如设置变量有问题,可以参照这个链接

留意,假如体系报错为:
  1. selenium.common.exceptions.SessionNotCreatedException: Message: session not created:This version of ChromeDriver only supports Chrome version***
复制代码
体现当前下载的Chromedriver的版本与本身欣赏器的版本无法对应,可以通过Chrome的资助查看本身的欣赏器版本

1.4 小试牛刀


接下来就可以测试我们的selenium是不是可以正常利用了,以一个简单的例子开始:驱动欣赏器打开百度。
  1. from selenium import webdriver
  2. url='https://www.baidu.com/'
  3. browser=webdriver.Chrome()
  4. browser.get(url)
复制代码
假如到这里都没有问题的话,就已经可以开始举行下一步了。
2.相干步骤


2.1 引入相干模块


首先导入本次爬虫任务需要的相干库:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  6. import time
复制代码
其中selenium.webdriver.common.by 重要用于征采网页元素的id信息,用于定位按钮、输入框之类的元素,WebDriverWait重要是用于等候网页响应完成,因为网页没有完全加载,就利用find_elements_by_**等方法,就会出现找不到对应元素的情况。
2.2 获取信息

  1. movies=browser.find_elements_by_class_name('movie-name-text')
  2.   names=[]
  3.   for item in movies:
  4.     if item.text!='':
  5.       names.append(item.text)
复制代码
其中find_elements_by_class_name就是通过查找class_name来锁定影片名称这个信息。

检察元素后右键即可Copy这个元素的JS path,selector等信息,可以锁定这个元素及其类似的其他元素的信息。以‘霸王别姬'这部影片为例,他的selector就是
  1. #content > div > div.article > div.movie-list-panel.pictext > div:nth-child(1) > div > div > div.movie-name > span.movie-name-text > a<br />
复制代码
那么就可以用下面的代码来锁定影片名称。
  1. 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 对象实例的声明周期中,隐式的比及会让一个正常响应的应用的测试变慢,它将会在探求每个元素的时间都举行等候,这样会增长整个测试实行的时间。我们这里利用的就是隐式等候。
  1. def get_page():
  2.   browser.implicitly_wait(10)
  3.   for i in range(50):
  4.     time.sleep(0.3)
  5.     browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
  6.     print('正在下滑第{}次'.format(i))
  7.     print('-------------')
  8.   #time.sleep(10)
  9.   print("*****请等待几秒*****")
  10.   time.sleep(10)
  11.   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 页面自动下滑


页面下滑过程比力简单,不多赘述。其实现过程如下:
  1. browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下滑操作
复制代码
2.5 保存文件


爬取出的数据是列表形式,利用pandas的to_csv方法就可以保存到本地了。
  1. rate,miscs,actor_list,ranks,playable_sign,names=get_page()
  2.   datas=pd.DataFrame({'names':names,'rank':ranks,'分类':miscs,'评分':rate})
  3.   try:
  4.     datas.to_csv('机器学习\爬虫\douban_0327.csv',encoding='utf_8_sig')
  5.     print("保存成功")
  6.     print(datas)
复制代码
3.完备代码

  1. from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesimport pandas as pdimport timeurl='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')
  2.   names=[]
  3.   for item in movies:
  4.     if item.text!='':
  5.       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,namesif __name__ == "__main__":  rate,miscs,actor_list,ranks,playable_sign,names=get_page()
  6.   datas=pd.DataFrame({'names':names,'rank':ranks,'分类':miscs,'评分':rate})
  7.   try:
  8.     datas.to_csv('机器学习\爬虫\douban_0327.csv',encoding='utf_8_sig')
  9.     print("保存成功")
  10.     print(datas)  except:    print('保存失败')
复制代码
到此这篇关于详解利用Selenium爬取豆瓣影戏前100的爱情片相干信息的文章就介绍到这了,更多相干Selenium爬取豆瓣影戏内容请搜索脚本之家以前的文章或继续欣赏下面的相干文章盼望大家以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作