前言
作为本人的第一篇博客,不知道怎么写才好。同时作为一个编程的菜鸟,第一次分享自己的练习之作,希望能够通过写博客这种方式慢慢的提高自己的表述能力。
本人最近学习python,学习了基本的语法,就想着做点东西练练手,反正大家说起python第一反应都是爬虫,那我就做一个爬虫吧。
本人经常由于上豆瓣看各类电影的评分,从中选出自己想要看的电影,但是豆瓣提供的几种筛选方式都不能满足,所以打算做一个爬虫爬取豆瓣的电影,顺便在根据这个数据做一个电影筛选程序,提供一个GUI界面。
第一个类Spider
首先编写了一个类Spider,它的主要功能是将上面的url连接的网页抓取下来,然后分析和提取html其中的电影名字和url,并保存如文本文件中。代码如下:
#coding=utf-8
"""
Created on 2015年12月31日
python的版本是3.4
@author: ypk
本爬虫主要是通过豆瓣的年份标签获取都有那些电影及url并存储,然后在获取这些电影的具体网页并分析,最后提供GUI界面进行查找相关电影。本爬虫用到了BeautifulSoup这个包,必须先引入这个包。
这个类主要是先调用startSpiderHtml,从豆瓣http://www.douban.com/tag/2015/movie?start=0类似网页下载下来,
接下来调用startSpiderMovie,分析之前下载html文件,将其中的电影名字及url提取出来并保存到文本中。
"""
from bs4 import BeautifulSoup
import urllib.request;
import urllib.error;
import string;
import socket
import time;
from email._header_value_parser import Header
import os
class Spider:
def getHtml(self,url):#从url网站上获取html
try:
page=urllib.request.urlopen(url,timeout=10)
html=page.read()
except urllib.error.HTTPError:
return False
except socket.timeout:
html=Spider().getHtml(url)
return html
def saveHtml(self,html,filename):#将html保存到filename
fb=open(filename,"wb")
fb.write(html)
def saveMovieUrl(self,html):#将html页面中的电影及url提取并保存起来
soup=BeautifulSoup(html,"html.parser")
for str in soup.find_all('dl') :
if str==None:
return Flase
str=str.dd
print(str.a['href'])#电影名字
file=open("./1.txt",'a',encoding="UTF-8")
file.write(str.a['href'])
file.write('\n')
print(str.a.string)#电影url
file.write(str.a.string,)
file.write('\n')
return True
def startSpiderHtml(self,year,start,end_year,end_start):#爬取网页,从year年start页开始,到end_year年end_start结束
"""
由于是从豆瓣标签年份标签爬取的数据,url格式是http://www.douban.com/tag/year/movie?start=start
里面的year和start就是我们需要设置的。这个函数将存放电影目录的网页抓取下来。
"""
year=year
start=start
proxy_support = urllib.request.ProxyHandler({
'sock5': 'localhost:1080'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
while (year>end_year or start<end_start):
url="http://www.douban.com/tag/"+str(year)+"/movie?start="+str(start)
html=Spider.getHtml(Spider(),url)
soup=BeautifulSoup(html,"html.parser")
if soup.dl==None:
print(str(year)+"已经结束了~")
year-=1
start=0
time.sleep(150)
continue
else :
Spider.saveHtml(Spider(),html,"./"+str(year)+"_"+str(start)+".html")
print(str(year)+"_"+str(start)+".html已经下载")
start+=15
if start%1200==0:
time.sleep(120)
def startSpiderMovie(self,year,start,*end):#开始爬取网页中的数据,year是开始年份,start是开始页数
"""
将startSpiderHtml中获取的html网页解析,从中取出电影名字和具体的url信息,存入文本中。
"""
year=2015
start=0
while year>1980:
filename="./豆瓣电影列表/"+str(year)+"_"+str(start)+".html"
if(os.path.exists(filename)):
Spider.saveMovieUrl(Spider(),open(filename,'r',encoding="UTF-8").read())
start+=15
else:
print("~")
year-=1
start=0
#Spider().startSpiderMovie(2015, 0)
#Spider().saveHtml(Spider().getHtml("http://movie.douban.com/subject/25835474/?from=showing"),"./test.html")
#Spider().startSpiderHtml(1981,90,1980,1)
这个时候我们就得到了这个文本:
这个这个文本文件中存储的是电影名字及url,这个URL类似这个http://movie.douban.com/subject/26366465/?from=tag_all,其中存放着电影的具体信息。
第二个类DetailSpider
接下来编写第二个类DetailSpider,这个类的功能第一是从之前的文本中获得电影名字及url,并将url指向的网页抓取下来;第二是分析抓取下来的这些网页,从中获得具体的电影信息,存储到文本中。代码如下:
#coding=utf-8
from Spider import Spider
from bs4 import BeautifulSoup