您的位置:首页 > 理论基础 > 计算机网络

03精通Python网络爬虫——HTTP协议请求实战

2018-03-09 00:05 651 查看
运行环境Python3.6.4

如果要进行客户端与服务器之间的消息传递,我们可以使用HTTP协议请求进行。

HTTP协议请求分为6种类型:

1. GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。如果使用表达进行传递,表单中的信息会自动转为URL地址中的数据,通过URL地址传递。

2. POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,比如在登录时,经常使用POST请求发送数据。

3. PUT请求:请求服务器存储一个资源,通常指定存储的位置。

4. DELETE请求:请求服务器删除一个资源。

5. HEAD请求:请求获取对应的HTTP报头信息。

6. OPTIONS请求:可以获取当前URL所支持的请求类型。

此外还有TRAC请求和CONNECT请求等,TRACE请求主要用于测试或诊断。

这里主要介绍GET请求和POST请求。

一、GET请求实战

实现在百度上查询一个关键词,以下代码在谷歌学术上不行

使用GET请求思路如下:

1. 构建对应的URL地址,格式为:”http://网址?字段名1 = 字段内容1&字段名2 = 字段内容2“

2. 以对应的URL为参数,构建Request对象;

3. 通过urlopen()打开构建的Request对象。

4. 按需求进行后续的处理操作,比如读取网页的内容,将内容写入文件等。

import urllib.request
url = "http://www.baidu.com/s?wd=" #将要爬取的网址赋值给变量url
key = "肝癌"#定义查询关键词
key_code = urllib.request.quote(key)#编码关键词
url_all = url + key_code#构建URL
req = urllib.request.Request(url_all)#创建一个Request对象并赋值给req变量,格式为:urllib.request.Request(url地址)
#模拟成浏览器
req.add_header("User-Agent","Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36")#使用add_header()函数添加对应的User-Agent信息,格式为:Request对象名.add_header(字段名,字段值)
data = urllib.request.urlopen(req).read()#模仿为浏览器去打开、爬取网址并读取赋值给变量data.此时是具有头信息的打开操作
fhandle = open("D:/Python35/myweb/part4/7.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
fhandle.write(data) #用write()函数将data的数据写入变量fhandle
fhandle.close() #用close()函数关闭该文件


二、POST请求实战

我们在进行注册、登陆等操作的时候,基本都会遇到POST请求,实现爬虫自动登陆,不过自动登陆CSDN失败

使用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/"
#构建表单数据,格式为字典形式,即{字段名1:字段值1,字段名2:字段值2,...}
postdata = urllib.parse.urlencode({
"name" : "ceo@iqianyue.com",  #","不能省
"pass" : "aA123456"
}).encode('utf-8') #将数据使用urlencode编码处理后,使用encode()设置为utf-8编码
req = urllib.request.Request(url,postdata)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
data = urllib.request.urlopen(req).read()
fhandle = open("D:/Python35/myweb/part4/8.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
fhandle.write(data) #用write()函数将data的数据写入变量fhandle
fhandle.close() #用close()函数关闭该文件


本文中另外两个问题还有待解决,如何爬取谷歌学术上的论文?如何自动登陆CSDN?

声明:本文是学习笔记,参考书籍为《精通Python网络爬虫》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息