zoukankan      html  css  js  c++  java
  • 001 爬虫的基本概念以及urllib的request和parse

    1.http的请求方式:
    get请求
    优点:比较便捷
    缺点:不安全、长度有限制
    post请求
    优点:比较安全、数据整体没有限制、可以上传文件
    put
    delete(删除一些信息
    发送网络请求(可以带一定的数据给服务器)
    head(请求头)
    Accept:文本格式
    Accept-Encoding:编码格式
    Connection:长链接/短链接
    Cookie:缓存
    Referer:表示从哪个页面跳转的
    Uer-Agent:浏览器和用户信息
    2.爬虫的分类
    通用爬虫:
    使用搜索引擎:百度、谷歌、雅虎
    优点:开放性、速度快
    缺点:目标不明确
    聚焦爬虫:(主要内容)
    优点:目标明确、对用户的需求非常明确、返回的内容很固定
    增量式: 翻页:从第一页请求到最后一页
    Deep: 深度爬虫——静态数据 html和css
    动态数据:js代码 加密js
    robots: 是否允许其他爬虫(通用爬虫)进行爬取
    3.爬虫的工作过程:
        1、确认爬取的目标网站
    2、使用python(java/GO)代码发送请求获取数据 3、解析获取到的数据
    获取新的目标(url)
    递归第一步
    爬自己想要的数据
    4、数据持久化
    python3(自带):
           · urllib.request
    · urlopen:
    · get传参
    · post
    · handle处理器的自定义
    · urlError
      requests(第三方)
      
    数据解析:xpath bs4
      数据存储
    from urllib import request
    
    def load_data():
        url = "http://www.baidu.com/"
        # 发送get的http请求
        # respense: http相应的对象
        response = request.urlopen(url)
        # 读取内容 read()是bytes类型
        data = response.read().decode()
        # 将数据写入文件
        with open('baidi.html', 'w', encoding='utf-8') as fp:
            fp.write(data)
    
        # python爬取的类型
        # 字符串类型  编码用encode
        # bytes类型   解码用decode
    
    load_data()
    使用urlopen获取网站

    4、request传参的两种方式

      1. 使用字符串传参

    from urllib import request, parse
    import string
    
    def get_method_params():
        # 目标字符串
        # url = "https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD"
        # 拼接字符串
        url = "https://www.baidu.com/s?wd="
        str_name = '你好'
        # python 是解释性语言 只支持ASCII 0-127 不支持中文
    
        final_url = url + str_name
        print(final_url)  # https://www.baidu.com/s?wd=你好
        # 将包含汉字的网址进行转义
        new_url = parse.quote(final_url, safe=string.printable)
        print(new_url)  # https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
    
        # 发送网络请求
        response = request.urlopen(new_url)
        print(response.read().decode())
    
    get_method_params()
    使用parse解析带有中文的传参地址
      2. 使用字典传参
    from urllib import request, parse
    
    def get_params():
        url = 'http://www.baidu.com/s?'
        params = {
            'wd': '你好',
        }
    
        # urllib中封装的把字典型转化成字符串
        str_params = parse.urlencode(params)
        new_url = url + str_params
    
        response = request.urlopen(new_url)
        content = response.read().decode()
        print(content)
    
    get_params()
    使用parse的urlencode字典传参

     5、用urllib改变User-Agent和IP地址

    如果频繁使用相同的User-Agent和IP,很有可能会被封。

    因此,可以通过修改IP和User-Agent来继续爬取数据。

    from urllib import request, parse
    
    def load_baidu():
        url = 'http://www.baidu.com'
        # 添加请求头的信息
        header = {
            # 浏览器版本
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
        }
    
        # 创建请求对象
        req = request.Request(url, headers=header)
    
        response = request.urlopen(req)
    
    
        # 查看响应头
        print(response.headers)
        # 打印User-Agent
        print(req.get_header('User-agent'))
    
    load_baidu()
    查看User-Agent信息
    from urllib import request
    import random
    def load_baidu():
        url = 'https://www.baidu.com'
    
        user_agent_list = [
            'Mozilla / 5.0(Windows NT 6.1;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 39.0.2171.71Safari / 537.36',
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
        ]
        # 选择不同的user-agent访问
        random_user_agent = random.choice(user_agent_list)
    
        req = request.Request(url)
        # 动态的增加相应头信息
        req.add_header("User-Agent", random_user_agent)
    
        # 请求数据
        response = request.urlopen(req)
        print(req.get_header('User-agent'))
        
    
    load_baidu()
    修改User-Agent的信息
    from urllib import request
    
    def create_proxy_handler():
        url = 'https://www.cnblogs.com/1906859953Lucas/p/9027165.html'
    
        # 添加代理
        proxy = {
            "http": "47.94.57.119:80"
        }
        # 创建代理的处理器
        proxy_handler = request.ProxyHandler(proxy)
        # 创建opener
        opener = request.build_opener(proxy_handler)
        # 用代理IP发送请求
        print(opener.open(url).read().decode())
    
    create_proxy_handler()
    修改IP地址

     6、对带有cookie的请求进行爬取

    对于需要登录的网页,需要提交cookie才能爬取到数据。

    这时,要在headers中添加Cookie

    其中,HTTP模块包含一些关于cookie的模块,可以自动使用cookie

      · CookieJar 

        - 管理存储cookie,向传参的http请求添加cookie

        - cookie存储在内存中,CookieJar实例回收后cookie将消失

      · FileCookieJar

        - 使用文件管理cookie

        - filename是保存cookie的文件

    from urllib import request
    
    url = 'http://i.cnblogs.com/'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
        'Cookie': '_ga=GA1.2.354663732.1553064338; __gads=ID=70555d8fa3a5e67c:T=1553064339:S=ALNI_Mbx26PA9IrbE68RrpzRjWAcJx2Gpg; _gid=GA1.2.1311232371.1554609564; .CNBlogsCookie=2AE31A6CAF7A1A36F741AAB3345858E1E900E0C2D13AF61C4F748D146073B7627E992D1AC628A98918787CE309A0C75175A9E7CC5661DCBCC813A5B79B337D260FD25F164440C00356EEFC079281CC9AD75067A7; .Cnblogs.AspNetCore.Cookies=CfDJ8JcopKY7yQlPr3eegllP76Nvjpfi50EnZRhyTBGZTMAsFzhKQhymiEKK3Tef6eB-cDHAebfBmKaqf6nDbSKSYHRFtWueRRdH-h5h62lO3KA0XTcHio2I8X-yiqMvIN3tq59NLHAZpnbmeQ9gfpAdmVqowdjtauYklDJGRBArG21wtRhpXrO5siBPD6uBO366GHYtSEqKN2KHbeOu01Sj6fpaBRQrK7SLABHv5uYJZhHstUqfbFdbTTX0IV_UFZKJqrQ3H_BrhgcQkpRGuRh-1CFK2wDdVqAJFA77QpHTGKYtvW0gJqSD4Lp9MARGcRMxfQ; SERVERID=04ead23841720026ba009cb4f597ec8c|1554690895|1554690169'
    }
    
    req = request.Request(url, headers=headers)
    response = request.urlopen(req)
    data = response.read()
    
    # 保存到文件中,验证数据
    with open('01cook.html', 'wb') as fp:
        fp.write(data)
    Cookie认证
    from urllib import request, parse
    from http import cookiejar
    """
    获取“个人中心”页面
    1、用代码登录
    2、自动带着cookie 去请求个人中心
    """
    
    # 代码登录步骤:
    # 1 登录的网址
    # 2 登录的参数
    # 3.发送登录请求
    url = 'http://iclass.ncut.edu.cn/iclass/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
        'Cookie': 'javascriptEnabled=true; LOGIN=3137313539303130323235; SCREEN_NAME=566d3857595565766e456c3645644d5a44486a4b64513d3d; 0ca7f72ea52b0a619ac85f97d67c3401=0mj8s9v7flnaeta7a40pk2dau2',
    }
    
    # 利用cookiejar自动保存cookie
    login_form_data = {
        'login': '17159010225',
        'password': '******',
    }
    # 发送登录请求POST
    cook_jar = cookiejar.CookieJar()
    # 定义处理器
    cook_handler = request.HTTPCookieProcessor(cook_jar)
    # 根据处理器生成opener
    opener = request.build_opener(cook_handler)
    
    # 带着参数 发送post请求
    login_request = request.Request(url, headers=headers, data=parse.urlencode(login_form_data).encode('utf-8'))
    opener.open(login_request)
    
    center_url = 'http://iclass.ncut.edu.cn/iclass/'
    center_request = request.Request(center_url, headers=headers)
    response = opener.open(center_url)
    data = response.read()
    
    # 保存到文件中,验证数据
    with open('02cook.html', 'wb') as f:
        f.write(data)
    实现登录功能
    7、报错的问题
    from urllib import request, error
    
    url = 'https://home.cnblogs.com/gg/'
    try:
        response = request.urlopen(url)
        print(response.read().decode())
    except error.HTTPError as e:
        print(e)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)
    HTMLError和URLError





  • 相关阅读:
    Linux系统 Docker RabbitMQ容器集群部署
    Linux系统 SSH免密登入
    ubuntu server 乱码
    简单总结在github上托管工程
    在线编译系统之nodejs执行shell
    Ubuntu中软件安装与卸载
    ubuntu软件安装
    “cannot find module ‘npmlog’….”的错误
    关于事件的一点小总结
    mongodb基本操作
  • 原文地址:https://www.cnblogs.com/abc23/p/10664914.html
Copyright © 2011-2022 走看看