美文网首页
[Python3爬虫]requests库基本使用

[Python3爬虫]requests库基本使用

作者: 浩成聊技术 | 来源:发表于2018-05-23 21:14 被阅读16次

    1.request是什么

    Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。 ——requests中文文档

    这个解释也是够调皮的,可以理解为一个发起网络请求的python库

    2.requests安装

    pip3 install requests
    

    3.httpbin:测试 HTTP 请求及响应的网站

    http://httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。它用 Python + Flask 编写,是github上的一个开源项目。

    当访问网址并声明请求方式时:http://httpbin.org/get 返回值如下

    {"args":{},
    "headers":
    {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate",
    "Accept-Language":"zh,en-US;q=0.9,en;q=0.8","Connection":"close",
    "Cookie":"_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1",
    "Host":"httpbin.org","Upgrade-Insecure-Requests":"1",
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36"},"origin":"112.117.10.72","url":"http://httpbin.org/get"
    }
    

    包含Cookie和User-Agent信息

    4.requests基本用法

    requests对象基本属性
    import requests
    
    r=requests.get('https://www.baidu.com/')
    print(r.status_code) #状态码
    print(r.text) #网站内容
    print(r.cookies) #本地cookies信息
    
    get方法
    import requests
    
    r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888')
    data = {
    'name':'yhchdev',
    'password':'888'
    }
    r = requests.get("http://httpbin.org/get",params=data)
    print(r.status_code) #状态码
    print(r.text) #网站内容
    print(r.cookies) #本地cookies信息
    

    这里使用了上面介绍的httpbin作为测试网站,返回如下结果

    200
    {"args":
    {"name":"yhchdev","password":"888"},
    "headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close",
    "Host":"httpbin.org","User-Agent":"python-requests/2.9.1"},"origin":"112.117.10.72",
    "url":"http://httpbin.org/get?name=yhchdev&password=888"}
    
    <RequestsCookieJar[]>
    

    通过'params='参数传递了之前构造好的jason数据,

    伪造请求头

    User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

    而看上面的结果,"User-Agent":"python-requests/2.9.1",这等于告诉对方服务器,我是一个python程序发起的requests请求,等于告诉了对方服务器你是一个爬虫,由于爬虫会消耗一定的服务器资源,所以需要伪造一个请求头,否则有的网站会拒绝爬虫的访问

    import requests
    
    #r=requests.get('https://www.baidu.com/')
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36'
    }
    r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888')
    data = {
        'name':'yhchdev',
        'password':'888'
    }
    r = requests.get("http://httpbin.org/get",params=data,headers=headers)
    print(r.status_code) #状态码
    print(r.text) #网站内容
    print(r.cookies) #本地cookies信息
    

    返回结果

    200
    {"args":{"name":"yhchdev","password":"888"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36"},"origin":"112.117.10.72",
    "url":"http://httpbin.org/get?password=888&name=yhchdev"}
    

    <RequestsCookieJar[]>
    这样让对方误以为这是一个正常的请求,这个请求头不是编写的,是我从chrome浏览器,开发者工具那里复制过来的,url被自动构造成了传统的?传参了

    post请求

    post请求是向服务器发送一些数据,当然get也能就像上面的程序一样,但get仅限于发送少量信息,并且get传递的参数是通过URL传参的

    这个程序是我之前为别人投票发现,没有登录验证,做的一个通过post表单提交的方式,刷票

    #-- coding:utf-8 --
    
    import requests
    
    formdata = {"cvs":{"i":200223539,"t":"oh2piVp","s":200637556,"acc":"dxjjW5uC7FyLWtyrSLyYGaes9Rw9ilWu","r":"","c":{"cp":{"202381408":[201932143]}}}}
    
    
    headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36'}
    
    
    URL= "http://cn.mikecrm.com/handler/web/form_runtime/handleSubmit.php"
    
    
    for i in range(1,50):
        response=requests.post(URL,data=formdata,headers=headers)
        print (response.url)
        html = response.text
        print (html)
        print ("第 %d 个post请求提交成功"%(i))
    

    formdata是通过chrome开发者工具抓包分析得来的,提交我所勾选的选项后提交给服务器的数据,URL为投票的网址,同时也伪造了请求头,最后有没有投上去我是不知到哈哈,因为这个网站是通过cookies来判断用户有没有投票的,但是我这里是没有cookies的,因为伪造cookies在这里是没有意义的,因为一旦有了cookie便只能投一次票了

    二进制文件的爬取
    • 图片、视频、音频文件的爬取

    图片、视频、音频文件本质是二进制文件,要爬取它们获取他们的二进制就可以了,文本是通过text获取,二进制文件通过content来获取

    • python IO操作复习

    由于文件读写时都有可能文件不存在产生IOError,导致后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,使用try ... finally来实现:

    try:
        f = open('/path/to/file', 'r')
        print(f.read())
    finally:
        if f:
            f.close()
    

    但是每次都这样写太繁琐,所以,Python引入了with语句来自动调用close()方法:

    with open('/path/to/file', 'r') as f:
        print(f.read())
    

    这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

    二进制文件通过wb模式来写入文件;通过rb模式来读出二进制文件

    爬取一张美女图片@^@

    import requests
    
    headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36'}
    
    r=requests.get('http://mm.chinasareview.com/wp-content/uploads/2017a/07/07/01.jpg',headers=headers)
    with open('/home/yhch/pytest.jpg','wb') as f:
        f.write(r.content)
    

    如果不伪造请求头的话,爬取下来的图片是打不开的,也就是说服务器并没有返回图片给我

    运行效果,看波妹子

    picone.png

    相关文章

      网友评论

          本文标题:[Python3爬虫]requests库基本使用

          本文链接:https://www.haomeiwen.com/subject/syudjftx.html