• 13、爬虫


    爬虫准备

    #-*- codeing = utf-8 -*-
    #@Time : 2020/6/8 7:33
    #@Author : zhangfudong
    #@FILE :douban.py
    #@Software : PyCharm
    
    # 豆瓣
    # https://movie.douban.com/top250
    
    # 电影天堂
    # https://dytt8.net/
    
    # 百度指数
    # http://index.baidu.com/
    
    # 天眼查
    # https://www.tianyancha.com/
    
    # 爬虫的本质是:模拟浏览器打开网页,获取网页中我们想要的那部分数据信息
    # 基本流程:
    #  准备工作
    #  获取数据:http库。header。Response。
    
    #  解析内容
    
    #  保存数据
    # https://movie.douban.com/top250?start=50
    # 页面分析250条电影数据,每页25条,分10页
    # 每页的URL不同之处:最后的数值=(页数-1)*25
    #
    # 请求,headers
    
    
    # 1、python程序的第一行加入:
    -*- codeing = utf-8 -*- 或者 coding = utf-8
    
    # 2、python文件中可以加入main函数用于程序的入口
    if __name__== "__main__":   ## 当程序执行时
    ## 调用函数
    
    # 3、引入模块
    ## module: 使用import引入
    ## 引入系统模块
    import sys
    import os
    
    ## 引入第三方模块
    import re
    
    ## 引入自定义模块
    from dir1 import test1  ##dir1目录下有test.py文件
    print(test1.add(11,33))
    
    
    import sys
    ## bs4默认没有安装:
    ## 方法一:命令行Terminal>>> pip bs4
    ## 方法二(建议):file -- settinig -- project:douban --
    ## -- project interpreter -- + -- 搜索bs4 -- install package -- X(可以关闭) -- OK
    from bs4 import BeautifulSoup   ## 网页解析,获取数据
    import re                       ## 正则表达式,进行文字匹配
    import urllib.request,urllib.error ## 指定url,获取网页数据
    import xlwt                        ## 进行excel操作
    import sqlite3                    ## 进行SQLITE数据库操作
    

    spider 爬取网页

    #-*- codeing = utf-8 -*-
    #@Time : 2020/6/8 22:05
    #@Author : zhangfudong
    #@FILE :spider.py
    #@Software : PyCharm
    import urllib
    import re
    
    def main():
        baseurl="https://movie.douban.com/top250?start="
        datalist = getData(baseurl)
        ## savepath="豆瓣电影Top250.xls"
        ## savaData(datalist,savepath)
        dbpath="movie.db"
        saveData2DB(datalist,dbpath)
    
    ## 获取影片详情链接的规则,全局变量
    # findLink = re.compile(r'<a href="https://movie.douban.com/subject/1292052/">')
    findLink = re.compile(r'<a href="(.*)">')  ## 创建正则表达式对象,表示规则,字符串的模式
    ## 获取影片图片链接
    findImg = 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,10):       ## 测试时可只访问一页range(0,1),总共10页
            url = baseurl + str(i*25)
            html = askURL(url)      ## 保存获取到的一页源码
            ## 2、逐一解析数据
            from bs4 import BeautifulSoup
            soup = BeautifulSoup(html,"html.parser")
            for item  in soup.find_all('div',class_="item"):  ## 查找符合要求的字符串形成列表,既满足条件为div,也满足条件为class="item"的类属性的所有内容
                # print(item) ## 测试:查看item的全部信息
                # break
                data = []       ##保存一部电影的所有信息
                item = str(item)
                ## 获取影片详情链接
                link = re.findall(findLink,item)[0]      ## 用re库来通过正则表达式查找指定规则,[0]表示第一个下标的内容
                # print(link)                                 ## 若获取时不加下标,link则表示列表,可用print(link[0])获取内容
                data.append(link)                   ## 添加片名链接
    
                imgSrc = re.findall(findImg,item)[0]
                data.append(imgSrc)
    
                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("")
    
                rating = re.findall(findRating,item)[0]
                data.append(rating)         ## 添加评分
    
                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('<br(s+)?/>(s+)?'," ",bd) ## 去掉</br>
                bd = re.sub('/'," ",bd) ## 去掉/
                data.append(bd.strip())         ## 去掉空格,添加影片相关内容
    
                datalist.append(data)   ## 把处理好的一部电影信息放入datalist
    
        ## 返回所有电影信息
        # print(datalist)
        return datalist
    
    
    ### 得到指定一个url的网页内容
    ## 用户代理表示:告诉豆瓣服务器,我们是什么类型的机器,浏览器
    ## 本质上是告诉浏览器,我们可以接收什么水平的内容
    import   urllib.request
    import  urllib.error
    def askURL(url):
        head={  ## 模拟浏览器头部信息,向豆瓣服务器发送请求
            "User-Agent": "Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 83.0.4103.97 Safari / 537.36"
        }
        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
    
    # import os
    # os.remove("aaa.xls")
    import xlwt
    import sqlite3
    ## 3、保存数据
    def savaData(datalist,savepath):
        print("save...")
        book = xlwt.Workbook(encoding="utf-8",style_compression=0)
        sheet = book.add_sheet("豆瓣电影top250",cell_overwrite_ok=True)
        col = ("电影详情链接","图片链接","电影中文名","电影外国名","评分","评价数","概况","相关信息")
        for i in range(0,8):
            sheet.write(0,i,col[i])
    
        for i in range(0,250):
            print("第%d条:"%(i+1))
            data = datalist[i]
            for j in range(0,8):
                sheet.write(i+1,j,data[j])
        book.save(savepath)
    
    ## 保存数据到数据库
    def saveData2DB(datalist,dbpath):
        init_db(dbpath)
        conn = sqlite3.connect(dbpath)
        cur=conn.cursor()
        for data in datalist:
            for index in range(len(data)):
                if index == 4 or index == 5:
                    continue
                data[index] = '"'+data[index]+'"'
            sql = '''
                insert into movie250(
                info_link, pic_link, cname, ename, score, rated, instruoduction, info)
                values(%s)'''%",".join(data)
            #print(sql)
            cur.execute(sql)
            conn.commit()
        cur.close()
        conn.close()
    
        print("保存至数据库完毕")
    
    def init_db(dbpath):
        sql = '''
            create table movie250(
            id integer primary key autoincrement,
            info_link text,
            pic_link text,
            cname varchar ,
            ename varchar ,
            score numeric ,
            rated numeric ,
            instruoduction text,
            info text
            )
        '''
        conn = sqlite3.connect(dbpath)
        cursor = conn.cursor()
        cursor.execute(sql)
        conn.commit()
        conn.close()
    
    
    
    
    
    
    if __name__ == "__main__":
        ## 当程序执行时
        main()
        ## 1、爬取网页
        ## 2、解析数据
        ## 3、保存数据
        print("爬取完毕")
    
  • 相关阅读:
    JAVA 面试知识点
    JAVA String.format()的使用
    XorPay.com 支付平台介绍【免费申请个人微信支付接口】
    PC软件/web网站/小程序/手机APP产品如何增加个人收款接口
    个人收款之微信小微商户
    个人小程序接入支付解决方案
    XorPay 个人支付平台增加 个人支付宝支付接口
    Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串
    网页启用Gzip压缩 提高浏览速度
    C/S架构和B/S架构的概念和区别
  • 原文地址:https://www.cnblogs.com/moox/p/13199503.html
Copyright © 2020-2023  润新知