腳本中用到的actors_use.csv為之前從豆瓣上抓取的演員列表。
1 galaxyactors.py 2 # -*- coding: utf-8 -*- 3 #該腳本可以按照文件actors_use.csv中給出的演員的姓名 4 #對銀河演員網http://www.8fkd.com/上的演員參演電影的信息進行抓取 5 #信息包括演員參演電影和電影日期,參演電影數量,和演員出道年份 6 import requests 7 import time 8 import lxml.html 9 import re 10 from pandas import DataFrame 11 import pandas as pd 12 import random 13 14 headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'} 15 def getDoc(url): 16 resp=requests.get(url,headers=headers) #得到網頁響應 17 time.sleep(0.1) #暫停0.1秒,防止抓取太頻繁被封IP 18 content=resp.text #獲取相應內容 19 doc = lxml.html.fromstring(content) #得到xml格式的文本 20 return doc 21 22 def getInfo(url): 23 doc=getDoc(url) #得到xml格式的文本 24 #得到演員演過的電影列表 25 temp1=doc.xpath('//*[@id="divLeft"]/div/div[2]/div/ul/li[1]/a/text()') 26 #得到演員演過的電影的日期的列表 27 temp2=doc.xpath('//*[@id="divLeft"]/div/div[2]/div/ul/li[2]/text()') 28 #如果抓取到的電影列表不為空 29 if temp1!=[]: 30 actor_m = [] #初始化該演員演過的電影列表 31 actor_d = [] #初始化該演員演過的電影的日期的列表 32 actor_y = [] #初始化該演員演過的電影的年份的列表 33 temp2=temp2[1:] #由于數據結構的問題,temp2中除去第一項剩下的為電影日期 34 for s in temp1: 35 # print s.encode('utf-8') 36 actor_m.append(s.encode('utf-8')) 37 for s in temp2: 38 # print s.encode('utf-8') 39 actor_d.append(s.encode('utf-8')) 40 # 取每部電影日期字符串的前四項,然后轉換成int數據類型,就是所演電影的年份 41 actor_y.append(int(s.strip()[:4])) 42 # print actor_m 43 # print actor_d 44 # print actor_y 45 startYear=min(actor_y) #演員出道年份就是演過電影的年份中的最小項 46 movieNum=len(actor_m) #統計演員演過的電影數量 47 actor_info={'movies':actor_m,'date':actor_d} #將演員演過的電影和電影的年份生成字典格式數據 48 # print actor_info 49 # print startYear 50 # print movieNum 51 return actor_info,movieNum,startYear #返回演員演過的電影信息,電影數,出道年份三個數據 52 else: 53 return '-','-','-' #如果沒有抓取到內容,則三項都返回'-' 54 # print temp3 55 # print chardet.detect(temp[0].encode('utf-8')) 56 57 df=pd.read_csv('actors_use.csv') 58 infoList = [] #初始化演員參演電影信息列表 59 numList = [] #初始化演員演過電影的數目列表 60 yearList = [] #初始化演員出道年份列表 61 actorList=[] #初始化演員姓名列表 62 for i in range(0,3566): 63 #演員電影頁網址為'http://yy.8fkd.com/'加演員姓名拼音,加'/DianYing' 64 url='http://yy.8fkd.com/'+str(df.ix[i,'actors_id'])+'/DianYing' 65 try: 66 actor_info,movieNum,startYear=getInfo(url) #調用getInfo函數 67 except: #如果出錯,則將三項標記為error 68 actor_info, movieNum, startYear=('error','error','error') 69 finally: 70 #對演員參演電影信息列表、參演電影數列表、出道年份、演員姓名進行數據添加操作 71 infoList.append(actor_info) 72 numList.append(movieNum) 73 yearList.append(startYear) 74 actorList.append(df.ix[i,'leadingRoles']) 75 tempDict={'actors':actorList,'info':infoList,'moviesNum':numList,'startYear':yearList} 76 df1=DataFrame(tempDict) #將結果數據轉換為DataFrame數據格式 77 df1.to_csv('test.csv',index=False) #寫入文件 78 print i+1,':',df.ix[i, 'leadingRoles'],'(',movieNum,')' #打印標記
?