php抓取网页指定内容(和服务器之间被用到的方法是:GET和POST。)

优采云 发布时间: 2021-12-14 20:35

  php抓取网页指定内容(和服务器之间被用到的方法是:GET和POST。)

  在客户端和服务器之间的请求-响应中,最常用的两种方法是:GET 和 POST。

  从指定资源获取请求数据;

  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

  帖子获取的内容不能仅仅依靠URL获取,需要提交一些额外的信息。

  这种信息在不同的网页中发挥着不同的作用。例如,在天气查询网页中,您可能需要输入城市信息;在登录某些网页时,它也是帐号和密码的载体。

  发布请求:

  ① 地址栏中不会出现数据

  ② 数据大小没有上限

  ③ 有请求体

  ④ 如果请求正文中有中文,将使用 URL 编码!

  关于 post 请求的其他一些注意事项:

  通常,提交数据的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编码,posts可以有多种编码方式;

  4)get 请求参数会完全保留在浏览器历史记录中,post 不会(私密浏览);

  5) 对于参数的数据类型,get只接受ASCII字符,post没有限制;

  6) Get请求的url传入的参数长度有限制,post没有;

  7)get 的安全性不如 post,因为参数直接暴露在 url 中,不能用于传输敏感信息;

  8) url中放置了Get参数,请求体中放置了post参数;

  注意:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线