• 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)
    
  • 相关阅读:
    ZooKeeper入门(二)Java API开发实战
    mysql 通过存储过程添加分表和分表的字段
    Mysql 事务隔离级别以及相关概念
    一个替代npm和cnpm的方案:pnpm
    【速学】TypeScript学习记录
    true和false,truthy和Falsy
    resolve的意思是解析、解决、决定,assign是指派、赋值的意思
    更换node版本一定要记得删掉nodemodules
    【换平台】从admin来看React转Vue
    【typescript】写给JS老鸟的TS速成教程
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10015823.html
Copyright © 2020-2023  润新知