这是个小爬虫,基于python2.7.主要用到了BeautifulSoup库和urllib2的urlopen,爬取豆瓣电影排行前250,并保存在文件中.
主要分为三个步骤:
* 分析url
* 分析网站数据
* 爬取数据
一.分析url
豆瓣电影排行榜250的url很好分析:
格式都是这样子的:
http://movie.douban.com/top250?start=(page_num)&filter=
并且当start=0,对应的是排名1到25的电影,start=25对应的是排名25到50的电影,以此类推,我们便可以得到所有的url
http://movie.douban.com/top250?start=0&filter=
http://movie.douban.com/top250?start=25&filter=
http://movie.douban.com/top250?start=50&filter=
http://movie.douban.com/top250?start=75&filter=
…
基于此,我们甚至不需要从网站中提取url,只需要每次将start=后的数字更换,便可作为新的url使用了.
这是我的做法: response=urlopen(urljoin(self.url,'top250?start='+str(self.page_num*25)+'&filter='))
用str将数字转换成字符串,连接到start=后面,再使用urljoin将前后url连接起来,就可以传入urlopen函数中了.
二.分析网站数据
在这一步中,首先我使用了BeautifulSoup将得到的response对象解析 page_bsObj=BeautifulSoup(response,"lxml")
然后我们就需要查找豆瓣网页源代码来确定如何找到我们所需要的数据,即电影名称.
可发现电影名称都在span标签中,并且该标签还具有class属性.于是我们便可以利用BeautifulSoup的find_all()函数来找到所有具有class属性的span标签,同时BeautifulSoup是从上到下搜索span标签的,因此可以不用担心排名的问题: movie_items=page_bsObj.find_all("span",{"class":"title"})
然而在这里我们要注意的是,有些电影有两个span标签,即列出了两个title:中文翻译名字和原作名字,而有些电影是国产电影,只列出了一个名字,对于英文名,是在class=other标签中列出的:
这样就带来了一定的麻烦,因为我们是查找所有具有class=title的span表桥,有些电影我们只能找到一个名字.因此,我们也不能通过每部电影具有两个title来分配top顺序.不过好在我们还可以找到一些规律:
如果这部电影有英文名,那么它还包含一个/
,这可以区分这是中文翻译名字还是原作名字.知道了这样的规律,结合我们每行列出一个Top电影,那么我们便可以这样做:
*1.首先判断当前元素是否是最后一个元素,如果不是,就跳转到2
2.判断当前元素的下一个元素是否还有/
,这里利用str.find()函数,如果含有/
,则说明不需要多写入换行符.如果含有/
,说明要多写入一个换行符.*
分析网站数据完成后,我们便可以爬取数据,并下载,写入文件中了.
最后详细效果见此
豆瓣电影Top250