zoukankan      html  css  js  c++  java
  • 爬虫基础(1):urllib库

    urllib库

    urllib库是python中的一个基本网络请求库。用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据。

    在python3中所有的网络请求相关函数都集中在urllib.request模块下面

    urlopen函数

    向服务器发起请求

    urlopen函数的参数

    1. url 目标地址
    2. data 如果有这个参数,将变为post请求
    3. 返回值 http.client.HTTPResponse对象,其中含有下面几个方法:
      • read(size) size为空则读取所有
      • readline() 读取一行
      • readlines() 读取多行
      • getcode() 读取状态值
        基本的使用:
    from urllib import request
    res = request.urlopen("http://www.baidu.com")
    print(res.read())
    

    urlretrieve函数

    这个函数可以方便的将网页的一个文件保存到本地。

    urlretrieve函数的参数

    1. url 目标地址
    2. 下载路径
      基本使用
    from urllib import request
    request.urlretrieve("http://www.baidu.com","index.html") #下载百度首页到index.html
    

    urlencode函数

    用于完成url中中文以及特殊字符的编码和解码

    基本使用:

    from urllib import parse
    params = {
        "name": "张三",
        "age": 14,
        "地址": "上海市海河大道1544弄3号楼302"
    }
    res = parse.urlencode(params)
    print(res)
    
    

    执行结果:
    age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302

    在百度上搜索刘德华

    from urllib import request
    from urllib import parse
    
    # request.urlopen("http://www.baidu.com/s/?wd=刘德华") #直接这样请求会报错
    url = "http://www.baidu.com/s/?"
    # 定义参数字典
    params = {
        "wd": "刘德华"
    }
    # 参数转码
    qs = parse.urlencode(params)
    # url拼接
    url += qs
    # 发送请求
    res = request.urlopen(url)
    print(res.read())
    

    parse_qs函数

    将已经编码的url进行解码
    基本使用

    from urllib import parse
    qs = "age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302"  
    res = parse.parse_qs(qs)
    print(res)
    

    执行结果
    {'name': ['张三'], 'age': ['14'], '地址': ['上海市海河大道1544弄3号楼302']}

    urlparse 和 urlsplit函数

    用于将url各个部分进行分割

    基本使用

    from urllib import parse
    url = "http://www.baidu.com/s/?wd=python"
    
    res = parse.urlsplit(url)
    print(res)
    res = parse.urlparse(url)
    print(res)
    

    执行结果:
    SplitResult(scheme='http', netloc='www.baidu.com', path='/s/', query='wd=python', fragment='')
    ParseResult(scheme='http', netloc='www.baidu.com', path='/s/', params='', query='wd=python', fragment='')

    可以发现两个结果基本相同,唯一不同的是urlsplit()函数返回结果没有params属性

    request.Request类

    如果需要在请求中添加header信息,则必须用request.Request类实现
    基本使用:

    # 通过构造请求头 获取拉勾网的招聘信息
    from urllib import request
    from urllib import parse
    url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
        'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        "Cookie": "_ga=GA1.2.620765502.1560083999; _gid=GA1.2.758158058.1560083999; user_trace_token=20190609203959-b18d608c-8ab3-11e9-a228-5254005c3644; LGUID=20190609203959-b18d64d3-8ab3-11e9-a228-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAAAIAACBI2C1935D6770E19BC5BE4390354414026; X_HTTP_TOKEN=b6c2ab256a325419948821065120ec66a55a5e4b49; _gat=1; LGSID=20190610090729-1e5547bf-8b1c-11e9-a22c-5254005c3644; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGRID=20190610090729-1e5549e6-8b1c-11e9-a22c-5254005c3644; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560084000,1560090525,1560128850; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560128850; TG-TRACK-CODE=index_search; SEARCH_ID=60cd24c737344a6f98c48dd4fc94c39c"
    }
    
    data = {
        "first": "true",
        "pn": 1,
        "kd": "python"
    }
    
    
    req = request.Request(url, headers=headers, data=(
        parse.urlencode(data)).encode("utf-8"), method="POST")
    resp = request.urlopen(req)
    print(resp.read().decode("utf-8"))
    

    ProxyHandler代理

    因为爬虫爬取信息频率过高,容易被服务器的检测机制通过ip地址判定为恶意访问,通过更换代理ip是预防这种情况的有效手段。

    基本使用:

    from urllib import request
    
    # 不使用代理
    req = request.Request("http://httpbin.org/ip")
    resp = request.urlopen(req)
    print(resp.read())
    
    
    # 使用代理
    # 1.构建handler
    handler = request.ProxyHandler({"http": "175.23.43.193:8080"})
    # 2.使用handler构建opener
    opener = request.build_opener(handler)
    # 3. 使用opener发送请求
    resp = opener.open("http://httpbin.org/ip")
    print(resp.read())
    

    执行结果

    b'{
      "origin": "101.88.45.142, 101.88.45.142"
    }
    '
    b'{
      "origin": "175.23.43.193, 175.23.43.193"
    }
    '
    

    小练习 使用urllib登录人人网并访问个人主页

    代码:

    from urllib import request
    from http.cookiejar import CookieJar
    from urllib import parse
    # 1.人人网登录
    # 创建cookiejar对象
    cookiejar = CookieJar()
    # 创建httpcookieprocess对象
    handler = request.HTTPCookieProcessor(cookiejar=cookiejar)
    # 创建opener
    opener = request.build_opener(handler)
    # 使用opener发送登录请求,需要传递用户名和密码
    headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    }
    data = {
        "email": "970138074@qq.com",
        "password": "pythonspider"
    }
    data = parse.urlencode(data)
    url = "http://www.renren.com/PLogin.do"
    req = request.Request(url, data=data.encode("utf-8"), headers=headers)
    opener.open(req)
    
    # 2.访问个人主页
    dapeng_url = "http://www.renren.com/880151247/profile"
    resp = opener.open(dapeng_url)
    res = resp.read().decode("utf-8")
    
    with open("renren.html", "w") as f:
        f.write(res)
    

    通过opener携带cookie

    cookiejar.save() 保存cookie 到本地以及从本地加载cookie

    # 保存cookie到本地
    cookiejar = MozillaCookieJar('cookie.txt')
    handler = request.HTTPCookieProcessor(cookiejar)
    opener = request.build_opener(handler)
    resp = opener.open("http://httpbin.org/cookies/set?corse=python")
    
    cookiejar.save(ignore_discard=True)  # 该参数设置保存即将过期的cookie
    
    
    # 加载本地的cookie
    cookiejar = MozillaCookieJar('cookie.txt')
    cookiejar.load(ignore_discard=True)
    handler = request.HTTPCookieProcessor(cookiejar)
    opener = request.build_opener(handler)
    resp = opener.open("http://httpbin.org/cookies")
    
    cookiejar.save(ignore_discard=True)  # 该参数设置保存即将过期的cookie
    for cookie in cookiejar:
        print(cookie)
    
  • 相关阅读:
    Windows逆向分析入门(六)——实战篇(用户信息)
    Windows逆向分析入门(五)——工具篇
    Windows逆向分析入门(四)——代码篇
    Windows逆向分析入门(三)——方法篇
    Windows逆向分析入门(二)——原理篇
    Windows逆向分析入门(一)——总篇
    WeTool的实现原理是什么呢?
    处理器如何实现原子操作
    如何保证对象在线程内唯一
    渣渣写算法之队列
  • 原文地址:https://www.cnblogs.com/asia9847/p/10996332.html
Copyright © 2011-2022 走看看