zoukankan      html  css  js  c++  java
  • 商业爬虫学习笔记day2

    1. get传参

    (1)url中包含中文报错解决方法

    urllib.request.quote("包含中文的url", safe = "string.printtable")

    (2)字典传参

    最终url由url和参数拼接而成,而参数(params)的类型为字典,所以拼接要将字典参数转化为字符串类型,如下:

    import urllib.request
    import urllib.parse
    import string
    
    def get_params():
        url = "http://www.baidu.com/s?"
    
        params = {
            "wd": "中文",
            "key": "zhang",
            "value": "san"
        }
        str_params = urllib.parse.urlencode(params)
        print(str_params)     #此处打印的结果为  wd=%E4%B8%AD%E6%96%87&key=zhang&value=san 
        final_url = url + str_params
        # 将带有中文的url 转译成计算机可以识别的url
        end_url = urllib.parse.quote(final_url, safe=string.printable)
        print(end_url)
        response = urllib.request.urlopen(end_url)
        data = response.read().decode("utf-8")
        print(data)
    get_params()

    2. post

    urllib.request.openurl(url, data = "服务器接收的数据")

    3.请求头:

    urlib.request.openurl(),查看源码可发现此方法并没有headers属性,所以得要自己定义一个请求对象,而这个对象中有headers属性

    request = urllib.request.Request(url)
    request_headers = request.headers # 获取到请求头的信息

    (1)创建请求对象:urllib.request.Request(url)

    (2)加User-Agent: 模拟真实的浏览器发送请求(若使用同一个User-Agent短时间发送多次请求,对方服务器就能察觉出是爬虫,所以可以定义一个User-Agent池,随机从中获取代理)

    import urllib.request
    import random
    
    def load_baidu():
    
        url = "http://www.baidu.com"
        user_agent_list = [
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
            "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50"
    
        ]
        #每次请求的浏览器都是不一样的
        random_user_agent = random.choice(user_agent_list)
        request = urllib.request.Request(url)
        #增加对应的请求头信息(user_agent)
        request.add_header("User-Agent",random_user_agent)
    
        #请求数据
        response = urllib.request.urlopen(request)
        #请求头的信息
        print(request.get_header("User-agent"))
    
    load_baidu()

    (3)request.add_header(动态添加head数据)

    (4)响应头response.header

    代码

    import urllib.request
    
    def load_baidu():
        url = "http://www.baidu.com"
        header = {
            # 浏览器的版本
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
            "Haha": "hehe"  # 无效,请求头中无此信息,在后面打印请求头也可看出无此项
        }
        # 创建请求对象
        request = urllib.request.Request(url)
        # print(request)
        # print(request.headers)
        # 动态去添加head的信息
        request.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
        # 请求网络数据(不在此处加请求头信息是因为此方法系统没有提供参数)
        response = urllib.request.urlopen(request)
        data = response.read().decode("utf-8")
    
        # 获取完整的url
        final_url = request.get_full_url()
        print(final_url)
        # 获取请求头的信息(所有header信息)
        request_headers = request.headers # 第一种方法
        print(request_headers)
        # 第二种方法,注意:首字母需要大写,其它字母都小写
        request_headers = request.get_header("User-agent")
        print(request_headers)
        with open("02header.html", "w", encoding="utf-8")as f:
            f.write(data)
    
    load_baidu()

    4. IP代理:

    若使用同一个IP短时间发送多个请求,被请求的服务器也能发现是爬虫,此时就要用不同的ip去发送请求,就涉及到IP代理

    (1)免费的IP:时效性差,错误率高

              付费的IP:贵花钱,也有失效不能用的

    (2)IP分类:

    透明:对方知道我们的真实IP

    匿名:对方不知道我们真实的ip,但知道你使用了代理

    高匿:对方不知道我们真实的IP,也不知道我们使用了代理

    5. handler

    (1)urllib.request.urlopen()方法中并没有添加代理的功能,需要我们自己定义这个功能,所以要讲下handler,由urlopen()方法的源码可知,其也是创建相应的handler,然后根据此handler创建opener,最后通过opener.open()发送请求

    代码:

    import urllib.request
    import urllib.request
    
    def handler_openner():
        #系统的urlopen并没有添加代理的功能所以需要我们自定义这个功能
        #urlopen为什么可以请求数据 handler处理器
        #自己的oppener请求数据
        # urllib.request.urlopen()
        url = "https://blog.csdn.net/m0_37499059/article/details/79003731"
        #创建自己的处理器
        handler = urllib.request.HTTPHandler()
        #创建自己的oppener
        opener=urllib.request.build_opener(handler)
        #用自己创建的opener调用open方法请求数据
        response = opener.open(url)
        # data = response.read()
        data = response.read().decode("utf-8")
        with open("02header.html", "w", encoding="utf-8")as f:
            f.write(data)
    
    handler_openner()

    (2)创建对应的处理器(handler)

    1. 代理处理器:ProxyHandler

    2. 利用ProxyHandler创建opener:

    3. opener.open(url)就可以请求数据

    具体代码如下

    import urllib.request
    
    def proxy_user():
    
        proxy_list = [
            {"https":""},
            # {"https":"106.75.226.36:808"},
            # {"https":"61.135.217.7:80"},
            # {"https":"125.70.13.77:8080"},
            # {"https":"118.190.95.35:9001"}
        ]
        for proxy in proxy_list:
            print(proxy)
            #利用遍历出来的ip创建处理器
            proxy_handler = urllib.request.ProxyHandler(proxy)
            #创建opener
            opener = urllib.request.build_opener(proxy_handler)
    
            try:
                data = opener.open("http://www.baidu.com",timeout=1)
    
                haha = data.read()
                print(haha)
            except Exception as e:
                print(e)
    
    
    proxy_user()
  • 相关阅读:
    Android四:sqllite
    Android三-AsyncTask
    Android二-.9.png
    【SQL Server】系统学习之三:逻辑查询处理阶段-六段式
    Android一 流
    【SQL Server】系统学习之二:索引优化
    【SQL Server】系统学习之一:表表达式
    【wp之二 页面布局】
    Asp.net三种事务处理
    vs2008 启动IE浏览器 出现DW20.exe占用大量cpu 服务器iis 异常调试
  • 原文地址:https://www.cnblogs.com/jj1106/p/11210408.html
Copyright © 2011-2022 走看看