爬虫get请求与post请求处理
程序员文章站
2024-01-19 11:33:16
...
1、Get请求
get请求就是在url后面以拼接方式传参,但是如果参数是中文时需要转码处理,否则会报错。
比如我们访问豆瓣的官网,然后在搜索框中输入“电影”
关键字,可以看到浏览器中的请求为https://www.douban.com/search?q=电影
如果我们直接模拟上面的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))
省略...
2、Post请求
post请求是通过Request对象中的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.
错误
上一篇: GET请求与POST请求
下一篇: 【爬虫】1.get与post请求