运行环境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网络爬虫》