zoukankan      html  css  js  c++  java
  • 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("爬取完毕")
    
  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/moox/p/13199503.html
Copyright © 2011-2022 走看看