学习 Python 也有一段时间,在 Google 上看到大家都拿豆瓣电影来练手,今天我也来练练手,使用 python 来抓取豆瓣电影的 Top250 的榜单并保存到 Excel 中。
这其中会使用的库有:
reqeusts 网络请求库,用来访问网络并返回请求结果,这里用来返回网页的html
lxml 解析库,用来解析html,本次使用的是 xpath
re 正则表达式库,用来对字符串进行匹配
csv 访问csv文件的库,用来写入文件
先来看看豆瓣电影的 Top250 的页面是什么样?
我们主要抓取片名、导演、主演(取第一个)、年份、国家和评分。
通过 chrome 的开发者工具,可以很轻松的找到我们需要的 xpath,如下图:
按F12 展示出 Elements 后,通过左上角的小箭头点击需要的元素,上图选中的是片名,此时在片名上右键会出现列表,选中 copy -> xpath 就获取到我们需要的
获得的 xPath 是其中一个片名的,多获取几个会发现有规律,很容易总结出规则。
好了,说了这么多,还是那句话,show me your code!
importrequests
fromlxmlimporthtml
importre
importcsv
#解析html网页
defparse_tree(url):
r=requests.get(url)
tree=html.fromstring(r.text)
returntree
#获取title
defget_title(tree):
titles=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[1]/a/span[1]/text()')
arr_title=[]
# print(titles)
fortitleintitles:
arr_title.append(str(title))
# print(arr_title)
returnarr_title
#获取导演和主演,只取第一个名字
defget_da(tree):
doctor=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/p[1]/text()[1]')
da=[]
fordindoctor:
# print(d)
dd=re.split(r'[\s\\xa0]',str(d))
# print(dd)
dactor=''
actor=''
forsindd:
if'导演'ins:
index1=dd.index(s)
ifindex1+1
dactor=dd[index1+1]
elif'主演'ins:
index=dd.index(s)
ifindex+1
actor=dd[index+1]
break
arr=[dactor,actor]
da.append(arr)
# print(da)
returnda
#获取年份
defget_years(tree):
years=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/p[1]/text()[2]')
arr_year=[]
foryinyears:
year=str(y).strip('\n').strip().split('\xa0/\xa0')
arr_year.append(year)
# print(arr_year)
returnarr_year
#获取评分
defget_rate(tree):
rates=tree.xpath('//*[@id="content"]/div/div[1]/ol/*/div/div[2]/div[2]/div/span[2]/text()')
arr_rate=[]
# print(rates)
forrinrates:
arr_rate.append(str(r))
# print(arr_rate)
returnarr_rate
#将结果拼接到result中
defappend(result,arr_title,arr_da,arr_year,arr_rate):
foriinrange(len(arr_title)):
a=(arr_title[i],arr_da[i][],arr_da[i][1],arr_year[i][],arr_year[i][1],arr_year[i][2],arr_rate[i])
result.append(a)
result_title=['名字','导演','主演','年份','国家','类型','评分']
result=[]
foriinrange(10):#一共10页
count=i*25#每页25条数据
url='https://movie.douban.com/top250?start=%d'%(count)#拼接每页的url地址
print(url)
tree=parse_tree(url)#解析html
#拼接数据到result中
append(result,get_title(tree),get_da(tree),get_years(tree),get_rate(tree))
#输出一下看看结果
print(result_title)
forrinresult:
print(r)
#保存到csv中, newline字段是设置换行,默认是'\n',会直接在csv中插入空行
csvfile=open('douban_top250.csv','w',encoding='gb18030',newline='')
writer=csv.writer(csvfile)
#先写入title
writer.writerow(result_title)
print('====================')
forrinresult:
print(r)
#写入每一条数据,如果出错则跳过该条数据
try:
writer.writerow(r)
except:
continue
csvfile.close()#最后关闭文件
好了,是不是很简单,我们来看一下结果
so Easy 吧!
领取专属 10元无门槛券
私享最新 技术干货