最近在学习Python爬虫基础,仅用博客记录下学习的过程。
学习过程基于麦子学院的课程,感谢麦子学院,感谢Joey老师。
那么我们来看一下,怎么抓取数据。
Chrome浏览器有一个开发者工具,很适合查看网页源代码,所以我们用Chrome。
打开之后是这样:
然后我们在网页地址栏输入豆瓣电影的链接:
/
进入网页以后,我们利用开发者工具中的抓取链接工具(左上角的指针工具):
点击,然后选取一个正在热映的电影面板
然后我们看到开发者工具跳转到该面板的源代码处:
我们可以看到,我们所需要的数据,就在这里,热映信息的是用类似一个class的字典去存储的,在class前面li,即是它对应的Tag值,本次测试中,我们需要四个数据:电影名称,评分,导演名,主演名单,代码中我们可以看到,在字典中,对应的4个Key值分别是data-title,data-rate,data-director,data-actors。
那么我们的编程思想就出来了:先抓取豆瓣电影的网页数据,然后根据tag值和data-title去筛选我们想要的class,将四个关键的key和value存到我们自己的字典里,然后显示出来。
以下,上代码:
# -*- coding: utf-8 -*-import urllib2from HTMLParser import HTMLParserclass MovieParser(HTMLParser):def __init__(self):HTMLParser.__init__(self)self.movies=[]def handle_starttag(self, tag, attrs):def _attr(attrlist,attrname):for attr in attrlist:if attr[0] == attrname:return attr[1]return None #print(tag) #遍历tag值为li且包含data-title字段的class 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)def nowplaying_movies(url):#headers用来模拟浏览器登录环境 headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}req=urllib2.Request(url,headers=headers)str=urllib2.urlopen(req)#print(str.read()) parser=MovieParser()parser.feed(str.read())str.close()return parser.moviesif __name__ == '__main__':url='/' movies=nowplaying_movies(url)import jsonprint('%s' % json.dumps(movies,sort_keys=True,indent=4,separators=(',',':')))
运行成功以后,我们就会打印出以下数据:
完成!