以前经常在这个网站上下载电影下来看,这个网站比较坑的就是,主页上只有电影的名称,但是评分是看不到的;只有再点击电影名字,进入电影主页时才能看到评分。一般下载的电影都是评分高的才看,低的就忽略掉了。每次都要来回去看评分,太麻烦了。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 #######################' + '\n') 49 for move in moves: 50 tmp = 'MoveName: %s\t,MoveScore: %s\t,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') + '\n') 54 with open('MoveMessage.txt', 'a') as f: 55 f.write('####################### End #######################' + '\n') 56 except Exception,e: 57 print 'Not found moves!',e 63 64 if __name__ == '__main__': 65 unittest.main()
运行的最终结果: