python网页数据抓取(和服务器之间被用到的方法是:GET和POST。)

优采云 发布时间: 2022-02-06 08:24

  python网页数据抓取(和服务器之间被用到的方法是: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参数放在请求体中;

  注意:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线