2-2 用Python爬取银河演员网上的演员参演电影的信息进行抓取

脚本中用到的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,')'  #打印标记
原文地址:https://www.cnblogs.com/PistonType/p/5499059.html