zoukankan      html  css  js  c++  java
  • 使用Python爬取豆瓣电影详细数据

    # -*- codeing = utf-8 -*-
    # @Time :  23:35
    # @Auther : wyt
    # @File : spider.py
    # @Software : PyCharm
    
    from bs4 import BeautifulSoup #网页解析,获取数据
    import re   #正则表达式,进行文字匹配
    import urllib.request,urllib.error  #制定url,获取网页数据
    import xlwt #进行Excel操作
    import sqlite3  #进行SQLite数据库操作
    
    
    def main():
       baseurl="https://movie.douban.com/top250?start="
        #爬取网页
       datalist = getData(baseurl)
       savepath = ".\豆瓣电影Top250.xls"
       #3、保存数据
       # saveData(savepath)
       #askURL("https://movie.douban.com/top250?start=")
    
    #影片详情的链接规则
    findlink = re.compile(r'<a href="(.*?)">') #创建正则表达式对象,表示规则
    #影片图片
    findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)  #re.S 让换行符包含在字符中
    #影片片名
    findTitle = re.compile(r'<span class="title">(.*)</span>')
    #影片评分
    findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    #评价人数
    findJudge= re.compile(r'<span>(d*)人评价</span>')
    #找到概况:
    findInq = re.compile(r'<span class="inq">(.*)</span>')
    #找到影片的相关内容
    findBd = re.compile(r'<p class="">(.*?)</p>',re.S)
    # 1、爬取网页
    def getData(baseurl):
        datalist=[]
        for i in range(0,1):  #调用获取页面信息的函数,10次,25个  #修改数量
            url = baseurl + str(i*25)
            html = askURL(url)  #保存获取到的网页源码
        # 2、逐一进行解析数据
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all("div",class_="item"): #查找符合要求的字符串,形成列表
            #print(item)  #测试,查看电影item全部信息
            data = []  #保存一部电影的所有信息
            item = str(item)
            #影片详情的链接
            link = re.findall(findlink,item)[0]  #re库用来查找指定的字符串,
            data.append(link)
    
            imgs = re.findall(findImgSrc,item)[0]
            data.append(imgs)
    
            titles = re.findall(findTitle,item)
            if(len(titles)==2):
                ctitle = titles[0]
                data.append(ctitle)
                otitle = titles[1].replace("/","") #去掉无关符号
                data.append(otitle)
    
            else:
                data.append(titles[0])
                data.append(' ')  #外文名没有的时候,留空 这一步是为了以后导入数据库、exls表的时候行列数据不规范
    
            reting = re.findall(findRating,item)[0]
            data.append(reting)
    
            judgeNum = re.findall(findJudge,item)[0]
            data.append(judgeNum)
    
            inq = re.findall(findInq,item)
            if len(inq)!=0:
                inq = inq[0].replace("。","")  #去掉句号
                data.append(inq)
            else:
                data.append(" ")
    
            bd = re.findall(findBd,item)[0]
            bd = re.sub(r'<br(s+)?/>(s+)?'," ",bd)  # 去掉<br/>
            bd = re.sub(r'/'," ",bd)  # 替换 /
            c = bd.strip()  # 去掉前后的空格
            data.append(c)
            datalist.append(data)  # 把处理好的一部电影信息放入datalist
        print(datalist)
        return datalist
    
    #得到一个指定url的网页内容:
    def askURL(url):
        head =  {      #摸你浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400"
        }
        #用户代理:告诉豆瓣服务器,我们是什么类型的机器,本质上是告诉浏览器我们能接受什么水平的文件内容
        request = urllib.request.Request(url,headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            #print(html)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
    
        return html
    
    
    
    
    
    def saveData(savepath):
    
        print("1")
    
    if __name__ == "__main__":  #当程序被调用执行时
        #调用函数
        main()
    

      

    执行结果:

    这是爬取了豆瓣电影第一页的前二十五个电影的详细内容,可以修改数量,在红色注释处,修改range中的数字改为(0,10),则可以爬取前250个电影的详细信息。

    这段代码分别爬取了电影的详情链接,图片,片名,评分,评价人数,概况,影片相应内容共计七个属性并将他们逐一保存到列表中,然后将列表data保存到datalist中,最后输出了datalist。

  • 相关阅读:
    CMS4.0——后知后觉
    《Mysql 入门很简单》(读后感②)
    《Mysql 入门很简单》(读后感①)
    Mysql 入门
    jQuery ajax中serialize()方法增加其他参数
    简单语法
    音频——H5 audio
    js 中的break continue return
    vue再次入手(数据传递②)
    vue再次入手(数据传递①)
  • 原文地址:https://www.cnblogs.com/zhangxinyue/p/13995078.html
Copyright © 2011-2022 走看看