zoukankan      html  css  js  c++  java
  • python学习第四天

    爬虫原理:
    什么是爬虫?
    爬虫指的是爬数据
    什么是互联网?
    由一堆网络设备把一台一台的计算机互联到一起
    互联网建立的目的:数据的传递与数据的共享
    上网的全过程:
    -普通用户:
    打开浏览器-->往目标站点发送请求-->接受响应数据-->渲染到页面上
    -爬虫程序
    模拟浏览器-->往目标站点发送请求-->接受响应数据-->提取有用数据-->保存到本地数据库
    浏览器发送的什么请求?
    http协议请求:
    -请求url:
    -请求方式:
    get,POST

    -请求头:
    cookies
    user-agent
    host




    爬虫全过程:
    1、发送请求
    -request请求
    -selenium模块
    2、获取响应数据
    3、解析并提取数据
    -RE
    -bs4(BeautufulSoup4)
    4、保存数据
    -MongoDB
    1、3、4需要手动写

    -爬虫框架
    Scrapy(基于面向对象)

    爬取梨视频:
    1、分析网站的视频源地址
    2、通过request网视频源地址发送请求
    3、获取视频的二进制流,并保存到本地

    1、爬取整个梨视频里面的视频链接
    '''
    访问url
        https://www.pearvideo.com/
    请求方式:
        Get
    请求头:
        user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
    
    '''
    import requests
    import re
    response =requests.get(url="https://www.pearvideo.com/")
    print(response.status_code)
    #print(response.text)
    
    #re.findall('正则匹配规则','解析文本',"正则模式")
    #re.S:全局模式(对整个文本进行匹配)
    #.指的是当前位置
    #*指的是查找所有
    
    '''
    <a href="video_1543373"
    <a href="video_(.*?)"  #提取1543373
    '''
    
    #获取主页视频详情ID
    res=re.findall('<a href="video_(.*?)"',response.text,re.S)
    print(res)
    
    for m_id in res:
        detail_url='http://www.pearvideo.com/video_'+m_id
        print(detail_url)

    2、爬取整个详情页视频内容:

    import requests
    import re #正则模块
    #uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串
    import uuid
    
    #爬虫三部曲
    #1、发送请求
    def get_page(url):
        response=requests.get(url)
        return response
    
    #2、解析数据
    #解析主页获取视频详情页ID
    def parse_index(text):
        res=re.findall('<a href="video_(.*?)"',text,re.S)
        #print(res)
    
        detail_url_list=[]  #存放所有视频链接
        for m_id in res:
            #拼接详情页url
            detail_url = 'http://www.pearvideo.com/video_' + m_id
            #print(detail_url)
            detail_url_list.append(detail_url)  #把每个视频链接添加进去
    
        #print(detail_url_list)
        return detail_url_list
    
    #解析详情页获取视频url
    def parse_detail(text):
        '''
        (.*?):提取括号内容
        .*?:直接匹配
        <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style=" 100%; height: 100%;"></video>
        正则:<video.*?src="(.*?)"
    
    正则:srcUrl="(.*?)"
        '''
    
        movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0]
        #print(movie_url)
        return movie_url
    
    #3、保存数据
    def save_movie(movie_url):
        response=requests.get(movie_url)
    
        #把视频写到本地
        with open(f'{uuid.uuid4()}.mp4','wb') as f:
            f.write(response.content)
            f.flush()
    
    if __name__ == '__main__':#输入main加回车键
        #1、对主页发送请求
        index_res=get_page(url='http://www.pearvideo.com/')
    #2、对主页进行解析,获取详情页id
        detail_url_list=parse_index(index_res.text)
        #print(detail_url_list)
            #3、对每个详情页发送url请求
        for detail_url in detail_url_list:
             detail_res=get_page(url=detail_url)
             #print(detail_res.text)
             movie_url=parse_detail(detail_res.text)
             print(movie_url)
    
             save_movie(movie_url)

    3、采用多线程方法对详情页视频爬取:

    import requests
    import re #正则模块
    #uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串
    import uuid
    
    #爬虫三部曲
    #1、发送请求
    def get_page(url):
        response=requests.get(url)
        return response
    
    #2、解析数据
    #解析主页获取视频详情页ID
    def parse_index(text):
        res=re.findall('<a href="video_(.*?)"',text,re.S)
        #print(res)
    
        detail_url_list=[]  #存放所有视频链接
        for m_id in res:
            #拼接详情页url
            detail_url = 'http://www.pearvideo.com/video_' + m_id
            #print(detail_url)
            detail_url_list.append(detail_url)  #把每个视频链接添加进去
    
        #print(detail_url_list)
        return detail_url_list
    
    #解析详情页获取视频url
    def parse_detail(text):
        '''
        (.*?):提取括号内容
        .*?:直接匹配
        <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style=" 100%; height: 100%;"></video>
        正则:<video.*?src="(.*?)"
    
    正则:srcUrl="(.*?)"
        '''
    
        movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0]
        #print(movie_url)
        return movie_url
    
    #3、保存数据
    def save_movie(movie_url):
        response=requests.get(movie_url)
    
        #把视频写到本地
        with open(f'{uuid.uuid4()}.mp4','wb') as f:
            f.write(response.content)
            f.flush()
    
    if __name__ == '__main__':#输入main加回车键
        #1、对主页发送请求
        index_res=get_page(url='http://www.pearvideo.com/')
    #2、对主页进行解析,获取详情页id
        detail_url_list=parse_index(index_res.text)
        #print(detail_url_list)
            #3、对每个详情页发送url请求
        for detail_url in detail_url_list:
             detail_res=get_page(url=detail_url)
             #print(detail_res.text)
             movie_url=parse_detail(detail_res.text)
             print(movie_url)
    
             save_movie(movie_url)

    4、对requests命令的详细使用,其中需要注意headers的反扒操作,以及如何精准定位每页的网址

    '''
    访问发现知乎
    请求url:https://www.zhihu.com/explore
    请求方式l;GET
    请求头:
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    
        cookie
    
    
    '''
    #访问知乎
    import requests
    # response=requests.get(url="https://www.zhihu.com/explore")
    # print(response.status_code) #400
    # print(response.text)#错误页面
    
    
    
    '''
    params参数
    访问百度搜查蔡徐坤url
    http://www.baidu.com/s?wd=安徽工程大学&pn=10
    http://www.baidu.com/s?wd=安徽工程大学&pn=20
    '''
    
    from urllib.parse import urlencode
    #url='https://www.baidu.com/s?wd=%E8%94%A1%E5%BE%90%E5%9D%A4'
    #url='https://www.baidu.com/s?'+urlencode({"wd":"蔡徐坤"})
    
    url='http://www.baidu.com/s?'
    headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }
    
    
    #在get方法中添加params参数
    #response=requests.get(url,headers=headers,params={"wd":"安徽工程大学"})
    response=requests.get(url,headers=headers,params={"wd":"安徽工程大学","pn":"20"})
    #print(url)
    
    with open('gongcheng2.html','w',encoding='utf-8') as f:
        f.write(response.text)

    5、对豆瓣前25的电影信息进行爬取,其中包括电影详情页url、图片链接、电影名称、电影评分、评价人数

    '''
    主页:https://movie.douban.com/top250
        GET
        user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
    re正则:
        # 电影详情页url、图片链接、电影名称、电影评分、评价人数
        <div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价
    
    '''
    import requests
    import re
    url="https://movie.douban.com/top250"
    headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }
    
    #1、往豆瓣top250发送请求获取响应数据
    response=requests.get(url,headers=headers)
    #print(response.text)
    #2、通过正则解析提取数据
    # 电影详情页url、图片链接、电影名称、电影评分、评价人数
    movie_content_list=re.findall(
        #正则规则
        '<div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价',
        #解析分析
        response.text,
        #匹配模式
        re.S
    )
    
    for movie_content in movie_content_list:
        #解压赋值
        detail_url,movie_jpg,name,point,num=movie_content
        data=f'电影名字:{name},详情页url:{detail_url},图片url:{movie_jpg},评分:{point},评价人数:{num}
    '
        print(data)
    
        #保存数据,把电影信息写入文件中
        with open('douban.txt','a',encoding='utf-8') as f:
            f.write(data)

    6、作业:

      对豆瓣前250的电影进行爬取,其中又增加两条信息为:演出人员信息、电影简介

    代码如下:

    import requests
    import re
    
    def crow(i):
        url = 'https://movie.douban.com/top250?start=' + str(25 * i)
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
        }
    
        # 1、往豆瓣top250发送请求获取响应数据
        response = requests.get(url, headers=headers)
        # print(response.text)
        # 2、通过正则解析提取数据
        # 电影详情页url、图片链接、电影名称、导演信息、电影评分、评价人数、电影简介
        movie_content_list = re.findall(
            # 正则规则
            '<div class="item">.*?href="(.*?)">.*?src="(.*?)" .*?<span class="title">(.*?)</span>.*?<p class="">(.*?)</p>.*?<span class="rating_num" property="v:average">(.*?)</span>.*?<span>(.*?)人评价.*?<span class="inq">(.*?)</span>',
            # 解析分析
            response.text,
            # 匹配模式
            re.S
        )
    
        for movie_content in movie_content_list:
            # 解压赋值
            detail_url, movie_jpg, name,actor, point, num ,brief= movie_content
            data = f'电影名字:{name},详情页url:{detail_url},图片url:{movie_jpg},演员信息:{actor},评分:{point},评价人数:{num},简介:{brief}
    '
            print(data)
    
            # 保存数据,把电影信息写入文件中
            with open('douban.txt', 'a', encoding='utf-8') as f:
                f.write(data)
    
    
    for i in range(10):
    
        crow(i)

    得到的爬取信息

    小结:通过对python的学习,了解到了更多有关Python的知识,整个过程是新奇刺激的,也大大提高对python的兴趣,同时在后面的学习中也会更加认真,争取学习到更多的知识。




  • 相关阅读:
    WORD数据类型数据类型及 Bit,Byte,WORD,DWORD区别和联系
    C++指针探讨 (三) 成员函数指针
    visual c++中常用MFC文件及库文件
    SVN版本管理软件的使用介绍与教程
    C++星号的含义
    ajaxValidator 常见问题解决(传参,中文乱码)
    C++中的常量
    孙鑫老师VC++深入详解第一节课源代码(这样写更好理解)
    C/C++ 头文件 常用头文件功能查询表
    C++指针探讨 (一)数据指针
  • 原文地址:https://www.cnblogs.com/zmmm/p/11032069.html
Copyright © 2011-2022 走看看