python豆瓣电影爬虫

本文介绍了一位编程新手使用Python实现的豆瓣电影爬虫,包括Spider、DetailSpider和Seek三个类,用于抓取电影信息并实现关键词搜索。虽然爬虫存在限制(如每标签页数不超过35页),但作者提出了改进方案,如利用多标签获取数据,并讨论了代码组织和效率提升的空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

作为本人的第一篇博客,不知道怎么写才好。同时作为一个编程的菜鸟,第一次分享自己的练习之作,希望能够通过写博客这种方式慢慢的提高自己的表述能力。
本人最近学习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  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值