python电影数据爬取的代码_Python3.5:爬取网站上电影数据

本文介绍了如何使用Python3的urllib和HTMLParser库爬取电影数据。通过定义一个`print_movies`函数,设置了伪装成浏览器的请求头,并解析HTML内容。自定义的`MovieParser`类继承自HTMLParser,解析li标签中包含的数据如标题、评分、导演和演员。通过调用feed方法处理网页内容,获取并打印电影信息。

首先我们导入几个pyhton3的库:

from urllib import request

import urllib

from html.parser import HTMLParser

在Python2和Python3之间一个重要区别就是,在Python2有urllib,urllib2两个库,在Python3整合到一起,里面的函数方式也有一点变,先定义一个函数,将header,url,request,都打包成一个函数方便调用,且看下面代码:

defprint_movies(url):#伪装成浏览器访问网站,但其实没啥用,很容易被中间件检测出来,但没有又不行,所以蛮写吧

header ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}#Python3的urllib

req = urllib.request.Request(url, headers=header)

s=urllib.request.urlopen(req)

parser=MovieParser()

parser.feed((s.read()).decode('utf-8'))

s.close()

再重载HTMLParser库的handle_starttag(self, tag, attrs),系统就会默认调用用户重载的,具体调用方式在官方文档里面详细介绍:HTMLParser,

classMovieParser(HTMLParser):def __init__(self):

HTMLParser.__init__(self)

self.movies=[]#重载HTMLParser自带的函数

defhandle_starttag(self, tag, attrs):def_attr(attrlist, attrname):for attr inattrlist:if attr[0] ==attrname:return attr[1]returnNone#可以在这class后面找到每个li标签的特征属性比如catrgory在下面判断

if tag == 'li' and _attr(attrs, 'data-title'):

movie={}

movie['title'] = _attr(attrs, 'data-title')

movie['rate'] = _attr(attrs, 'data-rate')

movie['director'] = _attr(attrs, 'data-director')

movie['actors'] = _attr(attrs, 'data-actors')

self.movies.append(movie)print('%(title)s|%(rate)s|%(director)s|%(actors)s' % movie)

当我们执行到parser.feed((s.read()).decode('utf-8'))时,知道为什么要这样写,首先parser时HTMLParser的子类所以包括feed(),在注入数据时,s.read()是返回bytes类型,但feed()只接受str类型,所以直接在后面加个decode('utf-8')即转码(三个bytes转换为一个中文),又可以转换为str,基本获取数据就这么简单,要是想获取别的网站的数据,可以换个url和条件判断就可以了,我把全部代码贴上来:

from urllib importrequestimporturllibfrom html.parser importHTMLParserclassMovieParser(HTMLParser):def __init__(self):

HTMLParser.__init__(self)

self.movies=[]#重载HTMLParser自带的函数

defhandle_starttag(self, tag, attrs):def_attr(attrlist, attrname):for attr inattrlist:if attr[0] ==attrname:return attr[1]returnNone#可以在这class后面找到每个li标签的特征属性比如catrgory在下面判断

if tag == 'li' and _attr(attrs, 'data-title'):

movie={}

movie['title'] = _attr(attrs, 'data-title')

movie['rate'] = _attr(attrs, 'data-rate')

movie['director'] = _attr(attrs, 'data-director')

movie['actors'] = _attr(attrs, 'data-actors')

self.movies.append(movie)print('%(title)s|%(rate)s|%(director)s|%(actors)s' %movie)defprint_movies(url):#伪装成浏览器访问网站,但其实没啥用,很容易被中间件检测出来,但没有又不行,所以蛮写吧

header ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}#Python3的urllib

req = urllib.request.Request(url, headers=header)

s=urllib.request.urlopen(req)

parser=MovieParser()

parser.feed((s.read()).decode('utf-8'))

s.close()if __name__ == '__main__':

url= 'https://movie.douban.com/'

#返回一个电影列表

print_movies(url)

运行结果为:

802822-20170815015347271-1984485407.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值