python爬虫学习笔记(三)

8 篇文章 0 订阅
3 篇文章 0 订阅

上一篇介绍了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”)的方式来发送。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值