python之requests爬虫框架

news/2024/7/19 12:00:41 标签: python, 爬虫

目录

  • 知识准备
  • requests库相关参数解释
    • Requests库的7个主要方法
    • Response对象的属性
    • 控制访问参数
    • requests库的异常处理
  • 爬取网页的通用框架
  • 关键词提交接口
  • 升级版框架(虽然还是很丑陋0.0)

知识准备

在学习后面requests库之前,我们需要先了解一下http协议
在此之前呢,我们需要了解一下http协议,才能做好后面的工作
http即超文本传输协议,是基于一个“请求与响应”模式的,无状态的应用层协议。它采用url作为定位网络资源的标识符,url格式如下:

http://host[:port][path]
host:主机域名或ip地址
port:端口号,默认80
path:请求资源的路径

http协议对资源的操作

方法说明
GET请求获取URL位置的资源
HEAD请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST请求向URL位置的资源后附加新的数据
PUT请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE请求删除URL位置存储的资源

requests是用python编写的,使用Apache2 licensed 许可证的HTTP库,使用起来比urllib简洁很多。首先我们需要安装requests库,命令:

pip install requests

requests库相关参数解释

Requests库的7个主要方法

方法说明
requests.request()构造一个请求,支撑以下各方法的基础方法
requests.get()获取HTML网页的主要方法,对应于HTTP的GET
requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete()向HTML页面提交删除请求,对应于HTTP的DELETE

那么在这些方法中用的最多的就是get方法了。下面解释下这个方法

r = requests.get(url,kwargs)

r:表示返回一个包含服务器资源的response对象(也就是爬虫返回的对象)
url:准备爬取的页面
get:表示构造一个向服务器请求资源的request对象
Kwargs:访问控制参数,可选
还有一种通用格式,如下

requests.request(method,url,kwargs)

method就是请求的方法

Response对象的属性

属性说明
r.status_codeHTTP请求的返回状态,200表示连接成功,404表示失败
r.textHTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式
r.encoding如果header中不存在charset,则认为编码为ISO‐8859‐1 r.text根据r.encoding显示网页内容
r.apparent_encoding根据网页内容分析出的编码方式 可以看作是r.encoding的备选

控制访问参数

参数描述
params字典或字节序列,作为参数增加到url中
data字典,字节薛烈或文件对象,作为request的内容
jsonjson格式的数据,作为request的内容
headers字典,http定制头
cookies字典或cookiejar,request中的cookie
auth元组,支持http认证功能
files字典类型,传输文件
timeout设定超时时间,秒为单位
proxies字典类型,设定访问代理服务器,可以增加登录认证
allow_redirectsTrue/False,默认为True,重定向开关
streamTrue/False,默认为True,获取内容立即下载开关
verifyTrue/False,默认为True,认证ssl证书开关
cert本地ssl证书路径

requests库的异常处理

异常说明
requests.ConnectionError网络连接错误异常,如DNS查询失败、拒绝连接等 requests.HTTPError
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常
r.raise_for_status()如果不是200,产生异常requests.HTTPError

爬取网页的通用框架

import requests
def getHTMLtext(url):
        try:
            r=requests.get(url,timeout=30)
            r.raise_for_status() #如果状态不为200,引发httperror异常
            r.encoding=r.apparent_encoding
            return r.text
        except:
            return "产生异常"
if __name__=="__main__":
    url="http://www.baidu.com"
    print(getHTMLtext(url))

在这里插入图片描述

关键词提交接口

import requests
keyword = input("请输入搜索的关键词:")
try:
    kv = {'wd':keyword}
    r = requests.get("http://www.baidu.com/s?",params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(r.text)
except:
    print("爬取失败")

升级版框架(虽然还是很丑陋0.0)

# RequestsFrame.py
import requests
kv={'user-agent':'Mozilla/5.0'}
ls = ['get','head','post','put','patch','delete']
url=''
method=''
number=0
def requestmethod():
        global method
        method=input("请选择请求的方法(默认为get):")
        if method =='':
            method='get'
        elif method in ls:
            method=method
        else:
            print("方法错误")
            exit()
        return method
def requesturl():
        global url
        data = input("请输入要爬取的url:")
        if data[0:4] in ['HTTP','http']:
            url=data
        else:
            url='http://'+data
        return url
def display():
        global number
        try:
            number = input("请输入要爬取页面的字节数(默认all):")
            if number != '':
                number = int(number)
            else:
                number = None
            return number
        except:
            print("输入错误")
            exit()
def getHTMLtext():
        try:
            r=requests.request(method,url,timeout=30,headers=kv)
            r.raise_for_status()  #如果状态不为200,引发httperror异常
            r.encoding=r.apparent_encoding
            return r.text[0:number]
        except:
            return "请求状态异常"
if __name__=="__main__":
        requestmethod()
        print("爬取的网页为:{}".format(requesturl()))
        display()
        print(getHTMLtext())

还有很多地方可以补充,有想法可以加进去哦


http://www.niftyadmin.cn/n/1043537.html

相关文章

PHP下中文编码各种格式间的转换类

类源代码原作者是Hessian(solarischan21cn.com),我合并了一下原来的Sample脚本,同时修改了一下类文件,为类构造函数增加了一个参数以便用户可以方便的在使用的时候设置配置文件路径,这样就可以把这个类包放置在任何可以被访问到的…

Citrix 服务器虚拟化之三十二 XenConvert

Citrix 服务器虚拟化之三十二 XenConvert 简介: Citrix XenConvert 是用于实现物理到虚拟(P2V)转换的工具,可将工作负载从运行 Windows 的服务器或桌面计算机转换到 XenServer 中的虚拟机、虚拟设备 、虚拟磁盘或连接到Provis…

spark 写tidb_优秀的数据工程师,怎么用 Spark 在 TiDB 上做 OLAP 分析

作者:RickyHuo本文转载自公众号「大道至简bigdata」原文链接:优秀的数据工程师,怎么用 Spark 在 TiDB 上做 OLAP 分析TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多…

jmeter no data to display

前言,问题 jmeter 对图形界面支持的很好,但是在无图形界面下做出的结果可能不那么好看。 所以在linux服务器上使用jmeter 做并发测试时:我们是在GUI环境下把jmx文件生成,然后上传上去,用命令来完成测试,测完…

Windows Server 2012 R2超级虚拟化之一 第二代虚拟机

WindowsServer 2012 R2超级虚拟化之一 第二代虚拟机 在WindowsServer2012 R2的Hyper-V中包含两个的虚拟机版本。分别为 第1代虚拟机提供与以前版本的Hyper-V虚拟机相同的虚拟硬件。 第2代虚拟机提供了以下新功能:(逼近VMware的…

python 配置数据库

编辑setting.py DATABASES { default: { ENGINE: django.db.backends.mysql,//mysql数据库 NAME: qkl,//数据库名 USER:root,//数据库用户名 PASSWORD:root,//数据库密码 }}转载于:https://www.cnblogs.com/linuxpp/p/7472732.html

java哪个软件编程好学吗_编程学习:Java和Python相比哪个好学?区别分析

Python和Java是现在互联网中比较热门的两种编程语言,各有各的优点。首先,对于人工智能、深度学习,机器学习等这些有浓厚兴趣的朋友就去学Python,对于Web开发,软件开发比较在行的话建议去学Java。那对于这两种语言来说&…

Windows Server 2012 R2超级虚拟化之二 增强的用户体验

WindowsServer 2012 R2超级虚拟化之二 增强的用户体验 在Windows Server2012 R2的Hyper-V中出现了一个新功能增强的会话模式,这个功能将虚拟机连接会话的本地资源重定向。当你与虚拟机进行交互时,它提供的功能是类似的远程桌面连…