• python+selenium+unittest,爬虫电影网站


        以前经常在这个网站上下载电影下来看,这个网站比较坑的就是,主页上只有电影的名称,但是评分是看不到的;只有再点击电影名字,进入电影主页时才能看到评分。一般下载的电影都是评分高的才看,低的就忽略掉了。每次都要来回去看评分,太麻烦了。So,我就写了一个小小的爬虫,暂时就叫爬虫好了。

        在脚本中使用的是:python2.7 + selenium + unittest + chrome(其实我想用phantomjs的,但是在抓取评分的时候,老是抓取不到,好像是js搞的鬼)

      其实流程很简单:1、进入主页获取电影的title和url,2、根据获取的url,获取该电影的评分score,3、保存结果到本地文件中

      1、进入主页获取电影的title和url

      

      2、根据获取的url,获取该电影的评分score

      

       下面我就逐步分解:

       首先,进入该网站的主页,利用webdriver来定位电影,然后获取所有电影的属性:title,url,使用的定位是css

       

     1 def geturl(self): # 该函数是获取首页的电影的  title 和 url
     2         self.dr.get('http://www.xiamp4.com') # 网站首页
     3         urls = [] # 存放结果的list
     4         eles = self.dr.find_elements_by_css_selector('div.box.newbox ul.img-list.dis.clearfix b a') # 定位满足条件的所有电影,css定位
     5         for ele in eles:
     6             tmp = dict()
     7             url = ele.get_attribute('href') # 获取电影的url
     8             title = ele.get_attribute('title') # 获取电影的title
     9             tmp['url'] = url
    10             tmp['title'] = title 
    11             urls.append(tmp) # 将电影的title和url放在一个字典中,然后添加到 urls中
    12         return urls

      2、根据获取的url,获取该电影的评分score

      

      

    1     def getscore(self, url):
    2         # url = 'http://www.xiamp4.com/Html/GP23161.html'
    3         self.dr.get(url) # 进入电影的页面
    4         time.sleep(2)
    5         ele = self.dr.find_element_by_css_selector('input#MARK_B2') # 定位评分的元素
    6         score = ele.get_attribute('value') # 获取元素value的值
    7         # print score
    8         return score    # 该函数的左右就是 根据参数电影的url,返回该电影的评分

      下面是最终的代码:

     1 #coding=utf-8
     2 
     3 from selenium import webdriver
     4 import unittest
     5 import time
     6 
     7 class Spider(unittest.TestCase):
     8     def setUp(self):
     9         print '####################### Start #######################'
    10         self.dr = webdriver.Chrome()
    11         self.dr.implicitly_wait(10)
    12 
    13 
    14     def tearDown(self):
    15         self.dr.close()
    16         print '####################### End   #######################'
    17 
    18     def geturl(self):
    19         self.dr.get('http://www.xiamp4.com')
    20         urls = []
    21         eles = self.dr.find_elements_by_css_selector('div.box.newbox ul.img-list.dis.clearfix b a')
    22         for ele in eles:
    23             tmp = dict()
    24             url = ele.get_attribute('href')
    25             title = ele.get_attribute('title')
    26             tmp['url'] = url
    27             tmp['title'] = title
    28             urls.append(tmp)
    29         return urls
    30 
    31     def getscore(self, url):
    32         # url = 'http://www.xiamp4.com/Html/GP23161.html'
    33         self.dr.get(url)
    34         time.sleep(2)
    35         ele = self.dr.find_element_by_css_selector('input#MARK_B2')
    36         score = ele.get_attribute('value')
    37         # print score
    38         return score
    39 
    40     def test_run(self):
    41         moves = self.geturl()
    42         # print len(moves)
    43         for move in moves:
    44             move['score'] = self.getscore(move['url'])
    45         try:
    46             if len(moves) > 0:
    47                 with open('MoveMessage.txt', 'a') as f:
    48                         f.write('####################### Start #######################' + '
    ')
    49                 for move in moves:
    50                     tmp = 'MoveName: %s	,MoveScore: %s	,MoveUrl: %s' % (move['title'],move['score'],move['url'])
    51                     print tmp
    52                     with open('MoveMessage.txt', 'a') as f:
    53                         f.write(tmp.encode('utf-8') + '
    ')
    54                 with open('MoveMessage.txt', 'a') as f:
    55                         f.write('#######################  End  #######################' + '
    ')
    56         except Exception,e:
    57             print 'Not found moves!',e
    63 
    64 if __name__ == '__main__':
    65     unittest.main()

        运行的最终结果:

      

  • 相关阅读:
    React Native入门教程2 -- 基本组件使用及样式
    React Native入门教程 1 -- 开发环境搭建
    [轻松一下] 大热天的宿舍太热了,来网吧敲代码
    读外部存储的权限READ_EXTERNAL_STORAGE
    【翻译】Ext JS 6.2 早期访问版本发布
    等火车
    HTTP 简介
    建造模式Builder
    DP解LCS问题模板及其优化(模板)
    poj1015 正解--二维DP(完全背包)
  • 原文地址:https://www.cnblogs.com/xiaoshitoutest/p/5679413.html
Copyright © 2020-2023  润新知