php抓取网页指定内容(和服务器之间被用到的方法是:GET和POST。)
优采云 发布时间: 2021-12-14 20:35php抓取网页指定内容(和服务器之间被用到的方法是: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参数;
注意: