上一篇介绍了request对象的基本用法,我们可以用创建Request对象的方法来,做更多的事,接下来我再总结一下其他应用。
网页请求方式有Get和Post两种(我也没学过,应该是),这一篇,来讲用爬虫实现Get和Post请求。
Get请求
有点基础的应该知道,Get就请求直接在网址后面加参数,所有的信息就在url里,哦,你没有基础,没事,打开百度,百度搜索就是用的Get请求
现在明白了这一点之后,我们还得再了解一件事,网页在传递消息时,不会给你发送个汉字或字母,他需要转码,那我们的爬虫也得完成这个功能。
怎么做呢?这就需要我们再引入urllib.parse中urlencode()函数,他需要一个字典作参数,输出一个类似上面的一个等式形式
import urllib.parse
get={'wd':'爬虫'}
word=urllib.parse.urlencode(get)
print(word)
#输出: wd=%E7%88%AC%E8%99%AB
word=urllib.parse.unquote(word)
#unquote()与urlencode()正好相反,用来解密
print(word)
#输出:wd=爬虫
有了这些储备,我们可以来构造一个get请求,
import urllib.request
import ssl
import urllib.parse
ssl._create_default_https_context=ssl._create_unverified_context
get={'wd':'爬虫'}
word=urllib.parse.urlencode(get) #编码
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"}
url="https://www.baidu.com/s"
url=url+'?'+word #Get请求是在网址后直接加‘?’,再加参数
req=urllib.request.Request(url=url,headers=headers)
res=urllib.request.urlopen(req)
text=res.read().decode()
print(text)
Ps: 百度应该是有了防爬虫机制,用这个程序爬出来会是百度安全验证的页面
Post请求
我们再来看Post请求,post请求会比get麻烦一点,post应该是上传一份表单,例如,豆瓣这个网页,https://movie.douban.com/j/chart/top_list?type=11&interval_id=100:90&start=0&limit=10,该接口为豆瓣的一个电影列表接口,为 post 请求,url 问号后面的为请求参数,结果如下:
现在我们需要模拟这个过程,如何来模拟这个表单呢?
同样,需要urlencode()函数,我们用一个字典来储存这些信息,分析一下上面的网址,在“?”后面是post的参数,“&”分割了每一个参数,所以有:
type:11
interval_id:100:90
start: 0
limit: 10
在介绍Request对象时我们知道,Request实例化时,接收一个data参数,默认是None,但当我们传入参数时,他就会用post方式传递参数了,接下来给出代码
import urllib.request
import ssl
import urllib.parse
ssl._create_default_https_context=ssl._create_unverified_context
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"}
url="https://movie.douban.com/j/chart/top_list?"
post={
"type":"11",
"interval_id":"100:90",
"start": "0",
"limit": "10"
}
data=urllib.parse.urlencode(post).encode('utf-8')
req=urllib.request.Request(url=url,data=data,headers=headers)
res=urllib.request.urlopen(req)
text=res.read().decode("utf-8")
print(text)
为什么有时在URL上能看到post数据?(引自博客园)
- GET方式是直接以链接形式访问,链接中包含了所有的参数,服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。
- POST则不会在网址上显示所有的参数,服务器端用Request.Form获取提交的数据,在Form提交的时候。但是HTML代码里如果不指定 method 属性,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。
- 表单数据可以作为 URL 字段(method="get")或者 HTTP POST (method="post")的方式来发送。
?分开与url分开。
- 表单数据可以作为 URL 字段(method=“get”)或者 HTTP POST (method=“post”)的方式来发送。