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

来源:互联网 发布:中世纪2优化9教皇国 编辑:程序博客网 时间:2024/06/05 11:25
  • 简单介绍下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
直接用
这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2020年农民的土地怎么办 车停在停车场被划怎么办 专升本差两分怎么办 入职需要学士学位证怎么办 不喜欢写科研项目又没编制怎么办 易学堂密码忘了怎么办 易班手机号换了怎么办 易班登录不上怎么办 易到手机号换了怎么办 海外留学没有教育部认证怎么办 七过月宝宝便秘怎么办 6个月孩子便秘怎么办 6个月婴儿便秘怎么办 一个多月宝宝两天没拉大便怎么办 7个月宝宝便秘怎么办 9个月宝宝便秘怎么办 六个月宝宝严重便秘怎么办 公司调岗员工不同意怎么办 acca注册一直在审核怎么办 ieee ap二审被拒怎么办 文章投到假期刊怎么办 论文投了假网站怎么办 网上传了虚假的怎么办? 网上做兼职被骗了钱怎么办 通过支付宝扫码被骗了怎么办 支付宝扫二维码被骗怎么办 在is上被骗了怎么办 微信兼职被骗怎么办天涯论坛 公众号不给稿费怎么办 围绕服务改善民生提出怎么办 翰墨香林苑怎么办全产权 西城高铁联名卡怎么办 英语教学系统做题时超时了怎么办 sci被要求撤稿怎么办 论文投稿后初审通过想撤稿怎么办 河南大学读写译挂了怎么办 在职mba双证硕士怎么办户口 电脑开机了出现一些英文单词怎么办 不懂法语想读法语书怎么办 大鱼号文章需要修改怎么办 过了上诉期怎么办申诉