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使用的缩进
  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/10489748.html
Copyright © 2011-2022 走看看