python网页数据抓取(和服务器之间被用到的方法是:GET和POST。)
优采云 发布时间: 2022-02-06 08:24python网页数据抓取(和服务器之间被用到的方法是:GET和POST。)
客户端和服务器之间最常用的两种请求-响应方法是:GET 和 POST。
GET - 从指定资源请求数据;
POST - 将要处理的数据提交到指定的资源;
两者比较:
2、我们来看看这两种捕获方式的异同;
(1)获取方法
GET 方法是最常用和最简单的,默认的 HTTP 请求方法是 GET。
一般用于我们从服务器获取数据,无需其他转换直接输入URL即可,即所有需要请求的信息都收录在URL中。
* 没有请求正文
* 数据必须在1K以内!
* GET请求数据会暴露在浏览器的地址栏中
有关获取请求的其他一些说明:
常用操作:
① 如果浏览器地址栏直接给出URL,那么一定是GET请求;
②点击页面上的超链接也必须是GET请求;
③ 提交表单时,表单默认使用GET请求,但可以设置为POST;
get请求是在url后面拼接传递参数,但是如果参数是中文的,需要转码,否则会报错。
比如我们访问豆瓣官网,在搜索框中输入关键词“电影”:
可以看到浏览器中的请求是/search?q=movie
如果我们直接模拟上面的url请求,会报如下错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-15: ordinal not in range(128)
原因是在使用浏览器访问的时候会自动帮我们转码参数,而现在我们使用代码访问,所以需要我们自己处理。
from urllib.request import urlopen
from urllib.request import Request
from random import choice
# 1.爬取站点访问地址
url = "https://www.douban.com/search?q=电影"
# 2.模拟多个浏览器的User-Agent(分别为Chrome、Firefox、Edge)
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
]
# 3.随机设置请求头信息
headers = {
"User-Agent": choice(user_agents)
}
# 4.将请求头信息封装到Request对象中
req = Request(url, headers=headers)
# 5.发送请求并打印返回值
print(urlopen(req).read().decode())
修改,然后引入urlencode函数对url的参数进行转码,就可以正常访问了;
省略..
from urllib.parse import urlencode
# 1.爬取站点访问地址
args = {'q': '电影'}
url = "https://www.douban.com/search?{}".format(urlencode(args))
省略...
从这些可以看出get方法获取的内容是稳定的(即每个人打开某个网页时获取的信息都是一样的),但是使用post的时候需要输入具体的信息,所以获得的网页将是具体的。我们会解决的。
仅仅通过文字描述可能并不容易理解。建议大家在入门的时候看一些配套视频,加深对基本概念的印象,然后在实际操作中更好的理解每一步的含义。
这里推荐免费学习公开课,点击下方跳转
(2)发布方法
post用于向服务器发送数据以创建/更新资源。
通过 post 发送到服务器的数据存储在 HTTP 请求的请求体中:
POST /test/demo_form.php HTTP/1.1
Host: w3school.com.cn
name1=value1&name2=value2
post获取的内容不能仅通过URL获取,还需要提交一些额外的信息。
这种信息在不同的网页中发挥着不同的作用。例如,在查询天气的网页中,可能是输入城市信息;在登录某些网页时,它也是账号和密码的载体。
发帖请求:
① 数据不会出现在地址栏
② 数据大小没有上限
③ 有请求体
④ 如果请求正文中有中文,将使用 URL 编码!
关于发布请求的其他一些说明:
一般HTTP请求提交数据需要编码成URL编码格式,然后作为URL的一部分,或者作为参数传递给Request对象。
特别点:
Request请求对象中有一个data参数,post请求通过Request对象中的data属性传递参数来存储请求体数据。
data 是一个字典,其中收录匹配的键值对。
我们在这里模拟一个登录请求:
from urllib.request import urlopen
from urllib.request import Request
from random import choice
from urllib.parse import urlencode
# 1.url与参数处理
url = "https://www.douban.com/"
args = {
'name': 'abcdef123456',
'password': '123456'
}
# 2.模拟多个浏览器的User-Agent(分别为Chrome、Firefox、Edge)
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
]
# 3.随机设置请求头信息
headers = {
"User-Agent": choice(user_agents)
}
# 4.将请求头信息封装到Request对象中
req = Request(url, headers=headers, data=urlencode(args).encode())
# 5.发送请求并打印返回值
print(urlopen(req).read().decode())
如果没有添加encode()函数,会报错:
TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.
发帖请求做百度翻译:
import urllib.request as ur
import urllib.parse as up
import json
word= input('请输入要翻译的英语:')
data={
'kw':word
}
data_url = up.urlencode(data)
request = ur.Request(url='https://fanyi.baidu.com/sug',data=data_url.encode('utf-8'))
reponse = ur.urlopen(request).read()
ret = json.loads(reponse)
#print(ret)
translate = ret['data'][0]['v']
print(translate)
3、总结:
Get请求和Post请求的区别
1)get 在浏览器回滚时是无害的,post 会再次提交请求;
2)get生成的url地址可以采集(标注),但不能post;
3)get请求只能是url编码,post可以多种方式编码;
4)get请求参数会完全保存在浏览器历史中,post不会(隐身浏览);
5) 对于参数的数据类型,get只接受ASCII字符,post没有限制;
6)Get请求的url中传入的参数长度有限制,post没有;
7)get比post安全,因为参数直接暴露在url中,不能用来传递敏感信息;
8)get参数放在url中,post参数放在请求体中;
注意: