测试之道--网络爬虫系列4(http协议请求实战)

  • 简单介绍下http请求的六种主要类型
    1)GET请求:通过url网址传递信息,可直接在url中填写要传递的信息,也可以由表单进行传递(此时表单中的信息会自动转化为url地址中的数据,通过url传递)。
    2)POST请求:可以向服务器提交数据,是一种比较主流且安全的数据传递方式,在登录时经常使用这种方式请求发送数据。
    3)PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
    4)DELETE请求:请求服务器删除一个资源。
    5)HEAD请求:请求获取相应的HTTP报头信息。
    6)OPTIONS请求:可以获得当前url所支持的请求类型。
    注意:除此之外还有TRACE请求、CONNECT请求(这两个主要用于诊断和测试),用的不多。

  • GET请求实战
    GET请求的的思路如下:
    1.构建满足GET请求的URL地址:
       url = “http://网址? 字段名1=字段内容1&字段名2=字段内容2”;
    2.以上面的url为参数构造Request对象req。
    3.通过urllib.request.urlopen(req)下载网页file。
    4.按需求进行后续处理,如读取网页内容、将网页内容写入本地文件等。

    注意,上面的过程有以下几点需要注意:
    (1)url中一般将字段内容与前面的分开,以百度get请求模仿百度搜索python为例:
             在搜索内容不含中文时,下面的方式构造url即可
             url0 = “http://www.baidu.com/s?wd=
             url1 = “python”
             url = url0+url1
             若要搜索”我喜欢python不骗你”,这样就要把中英文都分开(中文要进行编码):
             url0 = “http://www.baidu.com/s?wd=
             url1 = urllib.request.quote(“我喜欢”)
             url2 = “python”
             url3 = urllib.request.quote(“不骗你”)
             url = url0+url1+url2+url3

            完整代码如下:
            import urllib.request
            import ssl
            ssl._create_default_https_context = ssl._create_unverified_context
            url0 = “https://www.baidu.com/s?wd=
            url1=urllib.request.quote(“我喜欢”)
            url2 = “python”
            url3 = urllib.request.quote(“不骗你”)
            url = url0 + url1 + url2 +url3
            req = urllib.request.Request(url)
            file = urllib.request.urlopen(req)
            data = file.read()
            with open(‘~/ybp/get_request.html’, ‘wb’) as f:
                  f.write(data)
            经过测试url也可写成下面:url = “https://www.baidu.com/s?wd=“+urllib.request.quote(“我喜欢python不骗你”)
           但是写下面会报错
            url = urllib.request.quote(“https://www.baidu.com/s?wd=我喜欢python不骗你”)
            ValueError:unknown urltype:’http%3A//www.baidu.com/s%3Fwd%3D%E6%88%91%E5%96%9C%E6%AC%A2python%E4%B8%8D%E9%AA%97%E4%BD%A0’
这里写图片描述
- POST请求
我们在进行注册、登录等操作的时候,基本上都会遇到POST请求
实现思路:
(1)设置好URL网址
(2)构造表单数据,并使用urllib.parse.urlencode()对数据进行编码处理
(3)创建Request对象,参数包括URL地址和要传递的数据
(4)使用add_header()添加头信息模拟浏览器进行爬取
(5)使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递
(6)后续处理,比如读取网页内容、将内容写入文件等
import urllib.request
import urllib.parse
url = ‘http://www.iqianyue.com/mypost/
postdata =urllib.parse.urlencode({
“name”:”taylor_杨”,
“pass”:”123456”}).encode(‘utf-8’)
req = urllib.request.Request(url, postdata)
req.add_header(“User-Agent”,”Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36”)
data=urllib.request.urlopen(req).read()
fhandle = open(‘pst.html’, ‘wb’)
fhandle.write(data)
fhandle.close()
- 代理服务器设置
(1)使用proxy = urllib.request.ProxyHandler()设置代理服务器信息
(2)创建urllib.request.build_opener()创建opener对象,参数是代理服务器和相应urllib.request.HTTPHandler类
(3)为了方便,这一步我们安装opener,也即创建全局默认的opener对象,那么在使用urlopen时亦会使用我们安装的opener对象,所以下面我们才可以直接使用urllib.request.urlopen()
(4)此时我们就可以通过代理服务器成功爬取百度首页并保存在data中
有时候使用同一个IP去爬取同一个网站上的网页久了会被该网站服务器屏蔽,解决思路:瞒天过海,暗度陈仓(使用代理)
我们使用代理服务器去爬一个网站的时候,在对方网站上显示的是代理服务器的IP地址,而不是我们本机的真实IP,可以在网上直接百度搜索一些免费的代理服务器地址,如:http://yum.iqianyue.com/proxy,我们尽量找里面验证时间较短的,长的容易失效
如下面的代码运行报:ConnectionResetError: [Errno 54] Connection reset by peer,是代理问题,可能再次执行就好了或者更换代理就好了
这里写图片描述

注意:如果我们故意将代理服务器写错,一段时间后将会返回错误:
urllib.error.URLError: urlopen error [Errno 60] Operation timed out
所以,如果使用代理服务器进行网页爬取时,出现相应异常,需要考虑是否是代理IP失效了,如果是,换一个即可,实际爬取网页的时候我们可以准备多个代理IP,轮流进行爬取,若失效程序自动替换成其他代理IP(捕获异常并进行相应的处理即可)
- DebugLog实战
有时候我们希望边运行边打印调试日志,这时候需要开启DebugLog
开启思路如下:
(1)分别使用urllib.request.HTTPHandler()和urllib.request.HTTPSHandler()将debuglevel设置为1
(2)urllib.request.build_opener()创建opener对象,并使用上一步的值为参数
(3)urllib.request.install_opener()创建全局默认的opener对象,这样在使用urlopen()时会自动使用我们创建的opener对象。
代码如下:
import urllib.request
httphd = urllib.request.HTTPHandler(debuglevel=1)
httpshd = urllib.request.HTTPSHandler(debuglevel=1)
opener = urllib.request.build_opener(httphd,httpshd)
urllib.request.install_opener(opener)
data = urllib.request.urlopen(‘http://edu.51cto.com‘)
这里写图片描述
- 异常处理URLError
这里我们主要介绍两个url相关的异常类,一个是URLError类,第二个是他的一个子类HTTPError类
产生URLError的原因一般有以下几种可能:
(1)链接不上服务器
(2)远程URL不存在
(3)无网络
(4)触发了HTTPError
直接用
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值