zoukankan      html  css  js  c++  java
  • 爬虫

    爬虫的应用:

    # 1.通用爬虫:通用爬虫是搜索引擎(Baidu、Google、Yahoo等)“抓取系统”的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
      1)搜索引擎如何抓取互联网上的网站数据?
         a)门户网站主动向搜索引擎公司提供其网站的url
         b)搜索引擎公司与DNS服务商合作,获取网站的url
         c)门户网站主动挂靠在一些知名网站的友情链接中
    
    # 2.聚焦爬虫:聚焦爬虫是根据指定的需求抓取网络上指定的数据。
      例如:
          获取豆瓣上电影的名称和影评,而不是获取整张页面中所有的数据值。

    爬虫的基本流程:

    request:

    #1、请求方式:
        常用的请求方式:
        GET,POST
    
        其他请求方式:
        HEAD,PUT,DELETE,OPTHONS
    
        ps:用浏览器演示get与post的区别,(用登录演示post)
    
        post与get请求最终都会拼接成这种形式:
        k1=xxx&k2=yyy&k3=zzz
    
        post请求的参数放在请求体内:
           可用浏览器查看,存放于form data内
        get请求的参数直接放在url后
    
    #2、请求url
        url全称统一资源定位符,如一个网页文档,一张图片
        一个视频等都可以用url唯一来确定
    
        url编码: 
          https://www.baidu.com/s?wd=图片
          图片会被编码(看示例代码)
    
        网页的加载过程是:
          加载一个网页,通常都是先加载document文档,在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求。
    
    #3、请求头
        User-agent:
        请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户。
        
        Cookies:
        cookie用来保存登录信息。
    
       Referer:
        浏览器上次访问的网页url
    
       一般做爬虫都会加上请求头
    #4、请求体
        如果是get方式,请求体没有内容
        如果是post方式,请求体是format data
    
      ps:
        1、登录窗口,文件上传等,信息都会被附加到请求体内
        2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

    response:

    爬取校花网:

    # pip3 install requests
    import requests
    import re
    
    # 爬虫三部曲
    
    # 一 发送请求
    def get_page(url):
        print()
        index_res = requests.get(url)
        return index_res.text
    
    # 二 解析数据
    # 解析主页
    def parse_index(index_page):
        detail_urls = re.findall('<div class="items">.*?href="(.*?)"', index_page, re.S)
        # print(detail_urls)
    
        for detail_url in detail_urls:
            if not detail_url.startswith('http'):
                detail_url = 'http://www.xiaohuar.com' + detail_url
            yield detail_url
    
    # 解析详情页
    def parse_detail(detail_page):
        video_urls = re.findall('id="media".*?src="(.*?)"', detail_page, re.S)
    
        if video_urls:
            video_urls = video_urls[0]
            if video_urls.endswith('.mp4'):
                yield video_urls
    
        # print(video_urls)
    
    
    # 三 保存数据
    import uuid
    def save_video(video_url):
        try:
            res = requests.get(video_url)
            with open(r'D:	ankday01movies\%s.mp4' % uuid.uuid4(), 'wb') as f:
                f.write(res.content)
                f.flush()
    
        except Exception:
            pass
    
    
    if __name__ == '__main__':
        base_url = 'http://www.xiaohuar.com/list-3-{}.html'
        for line in range(5):
            index_url = base_url.format(line)
    
            index_page = get_page(index_url)
            detail_urls = parse_index(index_page)
            for detail_url in detail_urls:
                detail_page = get_page(detail_url)
                video_urls = parse_detail(detail_page)
                for video_url in video_urls:
                    save_video(video_url)
    普通爬取版
    import requests
    import re
    from concurrent.futures import ThreadPoolExecutor
    
    pool = ThreadPoolExecutor(50)
    
    # 爬虫三部曲
    
    # 一 发送请求
    def get_page(url):
        print('%s GET start ...' % url)
        index_res = requests.get(url)
        return index_res.text
    
    # 二 解析数据
    # 解析主页
    def parse_index(index_page):
        # 拿到主页的返回结果
        res = index_page.result()
        detail_urls = re.findall('<div class="items">.*?href="(.*?)"', res, re.S)
        # print(detail_urls)
    
        for detail_url in detail_urls:
            if not detail_url.startswith('http'):
                detail_url = 'http://www.xiaohuar.com' + detail_url
    
            pool.submit(get_page, detail_url).add_done_callback(parse_detail)
            # yield detail_url
    
    # 解析详情页
    def parse_detail(detail_page):
        res = detail_page.result()
    
        video_urls = re.findall('id="media".*?src="(.*?)"', res, re.S)
    
        if video_urls:
            video_urls = video_urls[0]
            if video_urls.endswith('.mp4'):
                pool.submit(save_video, video_urls)
    
        # print(video_urls)
    
    
    # 三 保存数据
    import uuid
    def save_video(video_url):
        try:
            res = requests.get(video_url)
            with open(r'D:	ankday01movies\%s.mp4' % uuid.uuid4(), 'wb') as f:
                f.write(res.content)
                f.flush()
                print('%s done ...' % video_url)
    
        except Exception:
            pass
    
    
    if __name__ == '__main__':
        base_url = 'http://www.xiaohuar.com/list-3-{}.html'
        for line in range(5):
            index_url = base_url.format(line)
            pool.submit(get_page, index_url).add_done_callback(parse_index)
    高并发版
    查询出来的页面要返回content
    yeild使用的缩进
  • 相关阅读:
    定位
    supervisor进程管理工具
    简单git使用命令
    django + Vue项目上线部署
    Vue配置浏览器头部图标和title
    vue打包项目后 谷歌浏览器可以打开,其他浏览器不行
    js反向解析爬取企**网站
    python常用排序算法
    python脚本demo
    request模块封装
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/10489748.html
Copyright © 2011-2022 走看看