zoukankan      html  css  js  c++  java
  • requests模块使用

    爬虫介绍

    https://www.cnblogs.com/xiaoyuanqujing/p/11805679.html

    #爬虫简单来说指,网络蜘蛛
    
    #爬虫本质,;模拟浏览器发送请求(使用的模块requests,selenium)>>>下载网页>>>提取需要的数据(使用的模块bs4,xpath,re)>>>保存数据(文件,excel,mysql,redis,mongodb)
    
    #发送请求,请求地址(使用浏览器,抓包工具),请求头,请求体,请求方法
    
    #拿到响应,拿到响应体(格式:json,xml,html(bs4,xpath)),加密的未知格式(需要解密)
    
    #保存数据,Mongodb(json格式数据)
    
    #性能高一些(多线程、多进程、协程),只针对python语言的cpython解释器(GIL,同一时刻只能有一个线程在执行)
    	io 密集型:用线程
    	计算密集型:用进程
    	
    #scrapy框架处理了性能
    

    requests模块使用

    #安装 pip install requests
    
    #图片防盗链 referer
    
    #使用
    	import requests
    
    #常用的请求方式,request.get()和request.post()
    
    #基于GET请求
    
    #1基本请求
    res = requests.get('https://www.cnblogs.com/linqiaobao/')
    # print(res.text)#打印出返回的文本内容
    
    #2带参数的GET请求->params
    
    #在?后自己拼接参数,请求头将自己伪装成浏览器,否则百度不会返回正常的页面内容
    res = requests.get('https://www.baidu.com/s?ie=UTF-8&wd=python',
                       headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})
    
    # print(res.text)
    
    #如果查询关键字有中文或其他特殊符号,需要进行url编码
    from urllib.parse import urlencode
    wd='妹子图'
    encode_res = urlencode({'k':wd},encoding='utf-8')
    keyword = encode_res.split('=')[1]
    # print(keyword)
    
    #拼接url
    url = f'https://www.baidu.com/s?wd={wd}&pn=1'
    
    res = requests.get(url,
                       headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})
    
    # print(res.text)
    
    
    #3带参数的GET请求->headers
    
    #通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常用的有用的的请求头有:
        # HOST
        # Referer #根据该参数判断请求来源
        # User_Agent #客户端信息
        # Cookie #包含了Cookie信息,但requests模块有单独的参数来处理它,headers={}内不要放它
    
    #4带参数的GET请求->cookies
    
    # 如登录gitee,登录后就可以从浏览器获取cookies,使用cookies就可以无需用户名和密码了
    Cookies ={'gitee-session-n':'am1vZGMwQStYKzBSV2VqNkV3Y2ExYWlSbEp3aXd1YUFZWFYrcE5OY01jcEtaUEVQSjN1RnpwTkVYdU5DakNYSnVydWlpMHlyd0wxbVpBd3lueGZheG1mcW5CQ1VBTkJyZVVJZnlveFJEYmptZHhURVNUOWNFSzZHdVhyVjY0M3NxUm1LZG54U0ZlditjdkJKVi9mUGliYkErMzdlamd2dDR1SFNyYmN5NENKMTZZdzJvdXZmSGVSaXkrUGtCQVZ1eFhEUU9nMkVoZ0ZmbmpQNGwydHBYMFZjSzBmTkR1bjNDZkc4RHhCUGhtUGlwaVVZMVJmUW01NGt5dlRicnBLWFRIRW9HVUhMSmVZZnM5c0hkamo4VlM0dXB5bmdoZlFXeENFRnpUN2JGeVRjZjdRWEFQSkVwaUFVbE9vNkdwdndYMmFQaElseHZRZCs4clR3VVRTSnN4YXRsc2lEUTFGd0dKZitMbk5HNUQ0PS0teDlQYWs2WllXUHhpTVIzdVhwNjcxQT09--d441f4ee1d62ddd98f9db1ff1446b271ff036494	'}
    
    res = requests.get('https://gitee.com/',cookies=Cookies)
    
    # print('个人主页' in res.text)#主页
    
    
    #基于POST请求
    
    #发送post请求,携带数据(urlencoded和json)
    
    res=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
    print(res.text)
    
    res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
    print(res.text)
    
    
    # 5 自动携带cookie
    
    session=requests.session()
    res=session.post('http://127.0.0.1:8000/index/')  # 假设这个请求登录了
    res1=session.get('http://127.0.0.1:8000/order/')  # 现在不需要手动带cookie,session会帮咱处理
    
    # 6 response对象
    
    respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
    # print(respone.text)  # 响应的文本
    # print(respone.text())  # 响应的文本转成二进制
    print(respone.content)  # 响应体的二进制
    
    
    print(respone.status_code)  # 响应状态码
    print(respone.headers)    # 响应头
    print(respone.cookies)   # cookie
    print(respone.cookies.get_dict()) #  把cookie转成字典
    print(respone.cookies.items())  # key和value
    
    print(respone.url)        # 请求的url
    print(respone.history)   #[]放重定向之前的地址
    
    print(respone.encoding)  # 响应的编码方式
    
    respone.iter_content()  # 图片,视频,大文件,一点一点循环取出来
    for line in respone.iter_content():
        f.write(line)
    
    # 7 编码问题
    res=requests.get('http://www.autohome.com/news')
    
    # 一旦打印出来出现乱码问题
    
    # 方式一
    res.encoding='gb2312'
    
    # 方式二
    res.encoding=res.apparent_encoding
    print(res.text)
    
    
    # 8 解析json
    import json
    respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
    print(type(respone.text))  # 响应的文本
    print(json.loads(respone.text))
    print(respone.json())  # 相当于上面那句话
    print(type(respone.json()))  # 相当于上面那句话
    
    
    # 9 高级用法之ssl(了解)
    import requests
    respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
    print(respone.status_code)
    
    # 使用证书,需要手动携带
    
    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)
    
    # 9 高级用法之ssl(了解)
    import requests
    respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
    print(respone.status_code)
    # 使用证书,需要手动携带
    
    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)
    
    # 10 高级用法:使用代理
    
    respone=requests.get('http://127.0.0.1:8000/index/',proxies={'http':'代理的地址和端口号',})
    # 代理,免费代理,收费代理花钱买
    # 代理池:列表放了一堆代理ip,每次随机取一个,再发请求就不会封ip了
    # 高匿和透明代理?如果使用高匿代理,后端无论如何拿不到你的ip,使用透明,后端能够拿到你的ip
    # 后端如何拿到透明代理的ip,  后端:X-Forwarded-For
    respone=requests.get('https://www.baidu.com/',proxies={'http':'27.46.20.226:8888',})
    print(respone.text)
    
    
    # 11 超时设置
    import requests
    respone=requests.get('https://www.baidu.com',
                         timeout=0.0001)
    
    
    # 12 认证设置(你见不到了)
    import requests
    r=requests.get('xxx',auth=('user','password'))
    print(r.status_code)
    
    
    # 13 异常处理
    import requests
    from requests.exceptions import * #可以查看requests.exceptions获取异常类型
    
    try:
        r=requests.get('http://www.baidu.com',timeout=0.00001)
    except ReadTimeout:
        print('===:')
    except Exception as e:
        print(e)
    
    
    # 14 上传文件
    res=requests.post('http://127.0.0.1:8000/index/',files={'myfile':open('a.jpg','rb')})
    print(res.text)
    

    模拟登录网站

    #网站地址http://www.aa7a.cn/
        import requests
        session=requests.session()
        data = {
            'username': '616564099@qq.com',
            'password': 'lqz123',
            'captcha': 'zdu4',#验证码
            'remember': 1,
            'ref': 'http://www.aa7a.cn/user.php?act=logout',
            'act': 'act_login',
        }
        rest = session.post('http://www.aa7a.cn/user.php',data=data)
        print(rest.text)
        # 拿到cookie
        cookie=rest.cookies
        print(cookie)
    
        # 携带着cookies,表示登录了,页面中会有我们的用户信息616564099@qq.com
        rest1=session.get('http://www.aa7a.cn/index.php')
        print('616564099@qq.com' in rest1.text)
    

    爬取梨视频

    #网站地址https://www.pearvideo.com/
        import requests
        import re
    
        res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
    
        # print(res.text)
        re_video='<a href="(.*?)" class="vervideo-lilink actplay">'#正则匹配视频地址
        video_urls=re.findall(re_video,res.text)#去res.text找视频地址
        # https://www.pearvideo.com/
        # print(video_urls)
    
        for video in video_urls:
            url='https://www.pearvideo.com/'+video
            print(url)
            # 向视频详情发送get请求
            res_video=requests.get(url)
            # print(res_video.text)
            # break
            re_video_mp4='hdUrl="",sdUrl="",ldUrl="",srcUrl="(.*?)",vdoUrl=srcUrl,skinRes'
            video_url=re.findall(re_video_mp4,res_video.text)[0]
            print(video_url)
            video_name=video_url.rsplit('/',1)[-1]
            print(video_name)
            res_video_content=requests.get(video_url)
            with open(video_name,'wb') as f:
                for line in res_video_content.iter_content():
                    f.write(line)
    
  • 相关阅读:
    Jmeter接口自动化-5-提取JSON响应中数组的长度
    Redis系列讲解
    jQuery.Autocomplete实现自动完成功能(详解)
    js中获得当前时间是年份和月份
    搭建SSH框架所需Jar包及其解释
    JS中把字符串转成JSON对象的方法
    JBPM数据库表说明
    java的System.getProperty()方法可以获取的值
    Mybatis3.2.3+mysql第一个例子(入门)
    多线程学习
  • 原文地址:https://www.cnblogs.com/linqiaobao/p/13508713.html
Copyright © 2011-2022 走看看