爬虫get请求与post请求处理

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.错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值