爬虫笔记(三)——HTTP协议请求实战

如果要进行客户端与服务器端之间的消息传递,我们可以使用HTTP协议请求进行。 HTTP协议请求主要分为6种类型,各类型的主要作用如下:

  • GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,通过URL地址传递。
  • POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,比如在登录时,经常使用POST请求发送数据。
  • PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
  • DELETE请求:请求服务器删除一个资源。
  • HEAD请求:请求获取对应的HTTP报头信息。
  • OPTIONS请求:可以获取当前URL所支持的请求类型。

除此之外,还有TRACE请求与CONNECT请求等。 接下来,将通过实例讲解HTTP协议请求中的GET请求和POST请求,这两种请求相对来说用的最多。

一、GET请求

        有时想在百度上查询一个关键词,我们会打开百度首页,并输入该关键词进行查询,那么这个过程怎样使用爬虫自动实现呢? 我们首先需要对查询过程进行相应的分析,可以打开百度首页,然后输入想检索的关键词,比如输入“csdn”,然后按回车键,我们观察一下URL的变化,此时URL变成:

https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=0&rsv_idx=1&tn=baidu&wd=csdn&rsv_pq=cdc30efa00029c9b&rsv_t=e241AFVDq43ScKqi0aFl08%2FxnDF88zRnCiCbbkMScYi203XzFo4fq84osuU&rqlang=cn&rsv_enter=1&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsp=0&rsv_sug9=es_1_0&rsv_sug4=1232&rsv_sug=4

可以看出字段ie是utf-8,代表编码信息,而字段wd为csdn,刚好是我们要查询的信息。若我们将网址简化成https://www.baidu.com/s?wd=cadn,也可得到同样的页面。

由此可见,我们在百度上查询一个关键字时,会使用GET请求,其中关键性字段是wd,网址格式为:https://www.baidu.com/s?wd=关键词。如果关键词上有中文等字符,一定要编码。具体代码如下:

import urllib.request

url = "https://www.baidu.com/s?wd="
keyword = "csdn"
url = url + keyword
req = urllib.request.Request (url)
req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')
data = urllib.request.urlopen(req).read()
fhandle = open('/home/wl/csdn.html','wb')
fhandle.write(data)
fhandle.close()

此时,我们用浏览器打开刚才保存的csdn.html文件,我们就可以看到我们刚才爬取的网页结果,如下图:


如果keyword包含中文字符如“csdn博客”,我们就要进行编码。

keyword_code = urllib.request.quote(keyword)

二、post请求

        我们在进行注册、登录等操作的时候,基本上都会遇到POST请求,接下来我们就为大家通过实例来分析如何通过爬虫来实现POST请求。 在此,我们示例一下如何使用爬虫通过POST表单传递信息。 给大家提供一个POST表单的测试网页,做测试使用,网址为:http://www.iqianyue.com/mypost/

然后我们需要构建表单数据,在该网页上右击“查看网页源代码”,找到对应的form表单部分,然后进行分析。

可以发现,表单中的姓名对应的输入框中,name属性值为”name”,密码对应的输入框中,name属性值为”pass”,所以,我们构造的数据中会包含两个字段,字段名分别是”name”,”pass’。字段值设置我们要传递的信息。格式为字典形式,即: {字段名1:字段值1,字段名2:字段值2,…..}

import urllib.request
import urllib.parse

url = "http://www.iqianyue.com/mypost/"
postdata = urllib.parse.urlencode({'name':'wanglong','pass':'223'}).encode('utf-8')
req = urllib.request.Request (url,postdata)
req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')
data = urllib.request.urlopen(req).read()
fhandle = open('/home/wl/post.html','wb')
fhandle.write(data)
fhandle.close()


猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/81059493