zoukankan      html  css  js  c++  java
  • 1.1-Python爬虫案例演示urllib/requests

    Python爬虫urllib/requests

    1.urllib模块

    一个简单的Python爬虫框架-案例v1

    from urllib import request
    '''
    使用urllib.request请求一个网页内容,并把内容打印出来
    '''
    
    
    if __name__ == '__main__':
    
        url = "http://jobs.zhaopin.com/195435110251173.htm?ssidkey=y&ss=409&ff=03&sg=2644e782b8b143419956320b22910c91&so=1"
        # 打开相应url并把相应页面作为返回
        rsp = request.urlopen(url)
    
        # 把返回结果读取出来
        # 读取出来内容类型为bytes
        html = rsp.read()
        print(type(html))
    
        # 如果想把bytes内容转换成字符串,需要解码
        html = html.decode("utf-8")
    
        print(html)
    

    chardet 网页编码问题-案例v2

    '''
    利用request下载页面
    自动检测页面编码
    
    '''
    
    import urllib
    import chardet
    
    if __name__ == '__main__':
        url = 'http://stock.eastmoney.com/news/1407,20170807763593890.html'
    
        rsp = urllib.request.urlopen(url)
    
        html = rsp.read()
    
        #利用 chardet自动检测
        cs = chardet.detect(html)
        print(type(cs))
        print(cs)
    
    
        # 使用get取值保证不会出错
        html = html.decode(cs.get("encoding", "utf-8"))
        print(html)
    

    urlopen返回对象-案例v3

    import urllib
    
    if __name__ == '__main__':
        url = 'http://stock.eastmoney.com/news/1407,20170807763593890.html'
    
        rsp = urllib.request.urlopen(url)
    
        print(type(rsp))
        print(rsp)
    
    
        print("URL: {0}".format( rsp.geturl()))
        print("Info: {0}".format(rsp.info()))
        print("Code: {0}".format(rsp.getcode()))
    
        html = rsp.read()
    
    
        # 使用get取值保证不会出错
        html = html.decode()
    

    request.data的使用get-案例v4

    from urllib import request, parse
    
    '''
    掌握对url进行参数编码的方法
    需要使用parse模块
    '''
    
    if __name__ == '__main__':
    
        url = 'http://www.baidu.com/s?'
        wd = input("Input your keyword:")
    
    
        # 要想使用data, 需要使用字典结构
        qs = {
            "wd": wd
        }
    
        # 转换url编码
        qs = parse.urlencode(qs)
        print(qs)
    
        fullurl = url + qs
        print(fullurl)
    
        # 如果直接用可读的带参数的url,是不能访问的
        #fullurl = 'http://www.baidu.com/s?wd=大熊猫'
    
        rsp = request.urlopen(fullurl)
    
        html = rsp.read()
    
    
        # 使用get取值保证不会出错
        html = html.decode()
    
        print(html)
    

    request.post的使用-案例v5

    '''
    利用parse模块模拟post请求
    分析百度词典
    分析步骤:
    1. 打开F12
    2. 尝试输入单词girl,发现每敲一个字母后都有请求
    3. 请求地址是 http://fanyi.baidu.com/sug
    4. 利用NetWork-All-Hearders,查看,发现FormData的值是 kw:girl
    5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
    '''
    
    from urllib import request, parse
    # 负责处理json格式的模块
    import json
    
    '''
    大致流程是:
    1. 利用data构造内容,然后urlopen打开
    2. 返回一个json格式的结果
    3. 结果就应该是girl的释义
    '''
    
    baseurl = 'http://fanyi.baidu.com/sug'
    
    
    # 存放用来模拟form的数据一定是dict格式
    data = {
        # girl是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
        'kw': 'girl'
    }
    
    # 需要使用parse模块对data进行编码
    data = parse.urlencode(data).encode("utf-8")
    
    print(type(data))
    #  我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
    # request要求传入的请求头是一个dict格式
    
    headers = {
        # 因为使用post,至少应该包含content-length 字段
        'Content-Length':len(data)
    }
    
    
    # 有了headers,data,url,就可以尝试发出请求了
    rsp = request.urlopen(baseurl, data=data)
    
    json_data = rsp.read().decode('utf-8')
    print( type(json_data))
    print(json_data)
    
    
    # 把json字符串转化成字典
    json_data = json.loads(json_data)
    print(type(json_data))
    print(json_data)
    
    
    for item in json_data['data']:
        print(item['k'], "--", item['v'])
    

    request.data的使用:request.request类

    '''
    任务要求和内容跟V5 一样
    本案例只是利用Request来实现v5的内容
    
    利用parse模块模拟post请求
    分析百度词典
    分析步骤:
    1. 打开F12
    2. 尝试输入单词girl,发现每敲一个字母后都有请求
    3. 请求地址是 http://fanyi.baidu.com/sug
    4. 利用NetWork-All-Hearders,查看,发现FormData的值是 kw:girl
    5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
    '''
    
    from urllib import request, parse
    # 负责处理json格式的模块
    import json
    
    '''
    大致流程是:
    1. 利用data构造内容,然后urlopen打开
    2. 返回一个json格式的结果
    3. 结果就应该是girl的释义
    '''
    
    baseurl = 'http://fanyi.baidu.com/sug'
    
    
    # 存放用来模拟form的数据一定是dict格式
    data = {
        # girl是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
        'kw': 'girl'
    }
    
    # 需要使用parse模块对data进行编码
    data = parse.urlencode(data).encode("utf-8")
    
    #  我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
    # request要求传入的请求头是一个dict格式
    
    headers = {
        # 因为使用post,至少应该包含content-length 字段
        'Content-Length':len(data)
    }
    
    # 构造一个Request的实例
    req = request.Request(url=baseurl, data=data, headers=headers)
    
    # 因为已经构造了一个Request的请求实例,则所有的请求信息都可以封装在Request实例中
    rsp = request.urlopen(req)
    
    json_data = rsp.read().decode('utf-8')
    print( type(json_data))
    print(json_data)
    
    
    # 把json字符串转化成字典
    json_data = json.loads(json_data)
    print(type(json_data))
    print(json_data)
    
    
    for item in json_data['data']:
        print(item['k'], "--", item['v'])
    

    urllib.error:URLError产生的原因-案例v7

    '''
    URLError的使用
    '''
    
    from urllib import request, error
    
    
    if __name__ == '__main__':
    
        url = "http://www.baiiiiiiiiiidu.com"
    
        try:
    
            req = request.Request(url)
            rsp = request.urlopen( req )
            html = rsp.read().decode()
            print(html)
    
        except error.URLError as e:
            print("URLError: {0}".format(e.reason))
            print("URLError: {0}".format(e))
    
        except Exception as e:
            print(e)
    

    urllib.error:HTTPError-案例v8

    '''
    URLError的使用
    '''
    
    from urllib import request, error
    
    
    if __name__ == '__main__':
    
        url = "http:iiiiiiiiidu//www.baidu.com/welcome.html"
    
        url = "http://www.sipo.gov.cn/www"
        try:
    
            req = request.Request(url)
            rsp = request.urlopen( req )
            html = rsp.read().decode()
            print(html)
    
        except error.HTTPError as e:
            print("HTTPError: {0}".format(e.reason))
            print("HTTPError: {0}".format(e))
    
        except error.URLError as e:
            print("URLError: {0}".format(e.reason))
            print("URLError: {0}".format(e))
    
        except Exception as e:
            print(e)
    

    UserAgent:用户代理-案例v9

    
    '''
    访问一个网址
    更改自己的UserAgent进行伪装
    '''
    from urllib import request, error
    
    
    if __name__ == '__main__':
    
        url = "http://www.baidu.com"
    
        try:
    
            # 使用head方法伪装UA
            # headers = {}
            # headers['User-Agent'] = 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'
            # req = request.Request( url, headers=headers)
    
            # 使用add_header方法
            req = request.Request(url)
            req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36")
    
            # 正常访问
            rsp = request.urlopen( req )
            html = rsp.read().decode()
            print(html)
    
        except error.HTTPError as e:
            print(e)
        except error.URLError as e:
            print(e)
        except Exception as e:
            print(e)
    
        print("DONE>.............")
    
    

    ProxyHandler代理服务器处理-案例v10

    '''
    使用代理访问百度网站
    
    
    '''
    
    
    from urllib import  request, error
    
    
    if __name__ == '__main__':
    
        url = "http://www.baidu.com"
    
        # 使用代理步骤
        # 1. 设置代理地址
        proxy = {'http': '120.194.18.90:81' }
        # 2. 创建ProxyHandler
        proxy_handler = request.ProxyHandler(proxy)
        # 3. 创建Opener
        opener = request.build_opener(proxy_handler)
        # 4. 安装Opener
        request.install_opener( opener)
    
        # 现在如果访问url,则使用代理服务器
        try:
            rsp = request.urlopen(url)
            html = rsp.read().decode()
            print(html)
        except error.URLError as e:
            print(e)
        except Exception as e:
            print(e)
    
  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10015823.html
Copyright © 2011-2022 走看看