# http协议请求
# 如果进行客户端与服务器之间的信息传递,我们0可以用HTTP协议请求进行
# 对于HTTP请求 主要分六种类型,各类型的作用如下
"""
1) GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的 信息,
也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,
通过URL地址传递。
2)POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,
比如在登录时,经常使用POST请求发送数据。
3)PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
4)DELETE请求:请求服务器删除一个资源。
5 ) HEAD请求:请求获取对应的HTTP报头信息。
6) OPTIONS请求:可以获得当前URL所支持的请求类型。
"""
#(1)get请求
# https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1
# &tn=48021271_15_hao_pg&wd=hello&fenlei=256
# 可以发现,对应的査询信息是通过URL传递的,这里说采用的是HTTP请求中 的GET方法,
# 我们将该网址提取出来就行分析,
# 该网址为:https://www.baidu.com/ s?ie=utf8&wd=hello&tn=87048150_dg,
# 字段ie的值为utf8,代表的是编码信息,而字段wd 为hello
# ,所以字段wd应该存储的就是用户带检索的关键词。根 据我们的猜测,简化一下该网址,
# 可以简化为:https://www.baidu.com/s?wd=hello,
# 此时只 包含了对应的wd字段,即待检索关键词字段,将该网址复制到浏览器中,刷新一下,
# 发现 该网址也能够出现关键词为“hello”的搜索结果。
# 由此可见,我们在百度上査询一个关键词时,会使用GET请求进行,
# 其中关键性字段是wd,网址的格式是:"https://www.baidu.com/ s?wd=关键词"
# 实际案例
import urllib.request
keywd = "hello"
url = "http://www.baidu.com/s?wd=" + keywd
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
fhandle = open("G:python爬虫精通Python网络爬虫源码书中源码/2.html", "wb")
fhandle.write(data)
fhandle.close()
# 接下来,我们将详细分析一下上面的代码。首先定义要査询的关键词,并赋 给keywd变量,
# 然后按照分析出来的URL格式,构造了对应的URL并赋值给对应的url变 量,
# 随后,使用urllib.request.Request()构建了一个Request对象并赋给变量req,
# 通过urllib. request.urlopen()打开对应的Request对象,
# 此时,由于网址中包含了 GET请求信息,所以会 以GET请求的方式获取该页面,
# 随后读取该页面的内容并赋值给data变量,
# 再将爬取到的 内容写入"G:python爬虫精通Python网络爬虫源码书中源码/2.html”网页文件中。
# 第二
# 注意
# 上面的代码有不完善的地方,如果我们要检索的关键词是中文,
# 如“韦玮老师”,若还 以上面的代码去执行,则会出现如下错误。
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-13:
# ordinal not in range(128)
import urllib.request
url = "http://www.baidu.com/s?wd="
key = "爬虫"
key_code = urllib.request.quote(key)
url_all = url + key_code
req = urllib.request.Request(url_all)
data = urllib.request.urlopen(req).read()
fh = open("G:python爬虫精通Python网络爬虫源码书中源码/3.html", "wb")
fh.write(data)
fh.close()
"""
通过以上实例我们可以知道,如果要使用GET请求,思路如下:
1 )构建对应的URL地址,该URL地址包含GET请求的字段名和字段内容等信息,并
且URL地址满足GET请求的格式,即“http://网址?字段名1=字段内容1&字段名2=字 段内容2”。
2)以对应的URL为参数,构建Request对象。
3 )通过urlopen()打开构建的Request对象。
4)按需求进行后续的处理操作,比如读取网页的内容、将内容写入文件等。
以上,我们为大家通过实例讲解了爬虫中如何使用GET请求,并总结了爬虫中使用 GET请求的基本步骤和思路。
"""
# (2)POST请求
# 我们在进行注册、登录等操作的时候,基本上都会遇到POST请求,
# 接下来通过实例来分析如何通过爬虫来实现POST请求。
# 由于登录需要用到Cookie的知识,所以关于如何登录这一块的内容,学完了 Cookie的知识之后,
# 再为大家详细介绍,在此,我们仅需要知道如何使用爬虫通过 POST表单传递信息即可。
# POST表单的测试网页,供学习时做测试使用,
# 网址为: http://www.iqianyue.com/mypost/打开对应网址,发现有一个表单
"""
姓名:【___________】
密码:【___________】
【单击提交】
"""
# 那么怎样通过爬虫自动实现这个传递过程呢?
# 因为这里所采用的传递方法是POST方法,所以如果要使用爬虫自动实现,我们要构造 POST请求,
# 实现的思路如下:
# 1)设置好URL网址。
# 2)构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理。
# 3)创建Request对象,参数包括URL地址和要传递的数据。
# 4)使用add_header()添加头信息,模拟浏览器进行爬取。
# 5 )使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递。
# 6)后续处理,比如读取网页内容、将内容写入文件等。
# 首先,需要设置好对应的URL地址,分析该网页,在单击提交之后,会传递到当前面进行处理,
# 所以处理的页面应该是http://www.iqianyue.com/mypost/,
# 所以,URL应该设置为 http://www.iqianyue.com/mypost/"
# 然后我们需要构建表单数据,在该网页上右击“査看页面源代码”,找到对应的form表单部分,
# 可以发现,表单中的姓名对应的输入框中,name属性值为“name”,密码对应的输入框中,name属性值为“pass”,
# 所以,我们单位构造的数据中会包含两个字段,字段名分别是 “name”、“pass”,
# 字段值设置为对应的我们要传递的值。
# 格式为字典形式,即:
# {字段名1:字段值1,字段名2:字段值2,-}
# 所以,我们要构造的数据可以为("name":"ceo@iqianyue.com", "pass":"aA123456"},
# 将要传递的姓名设置为**ceo@iqianyue.com",要传递的密码设置为了 “aA123456”。
# 设置好数据之后,需要使用urllib.parse.urlencode对数据进行编码处理。
# 然后,我们还需要创建Request对象,参数包括URL地址和要传递的数据。
# 可以这样创建:req=urllib.request.Request (url 地址,传递的数据)。
# 接下来,可以使用add_header()添加头信息,模拟浏览器进行爬取,
# 并且使用urllib. request.urlopen()打开对应的Request对象,
# 完成信息的传递并进行后续处理等,这一部分内 容我们之前提过,这里不再赘述。
# 实例如下:
import urllib.request
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
data = urllib.request.urlopen(req).read()
fhandle = open("G:python爬虫精通Python网络爬虫源码书中源码/5.html", "wb")
fhandle.write(data)
fhandle.close()