【爬虫】Urllib让我们的 python 假装是浏览器

在 Python 这个内置的 Urllib 库中,有这么 4 个模块:

  1. request,request模块是我们用的比较多的,就是用它来发起请求,所以我们重点说说这个模块。
  2. error,error模块呢,就是当我们在使用 request 模块遇到错了,就可以用它来进行异常处理。
  3. parse,parse模块就是用来解析我们的 URL 地址的,比如解析域名地址啦,URL指定的目录等。
  4. robotparser,这个用的就比较少了,它就是用来解析网站的 robot.txt

了解了 urllib 之后,我们就用 python 代码来模拟请求吧!

urllib.request

首先我们导入 urllib 的请求模块:

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))

我们通过 request 模块的 urlopen 方法,直接用 Get 请求方式请求百度了,那么返回的内容就是和浏览器一样的。
request 的 urlopen 方法,可以传入的参数主要有 3 个
urllib.request.urlopen(url, data=None, [timeout, ]*)
第一个 url 就是我们请求的链接,比如我们刚刚就请求百度。

第二个参数 data,就是专门给我们 post 请求携带参数的,比如我们在登录的时候,可以把用户名密码封装成 data 传过去,在这里的 data 的值我们可以用 byte 的类型传递。

第三个参数 timeout 就是设置请求超时时间,如果等好久服务器都没有给我们返回数据,我们就不鸟他了!这就是 request 的 urlopen 主要用法。

如果我们要欺骗服务器说我们是浏览器或者手机请求的呢?这个时候我们需要添加请求头信息,也就是我们上次说的 request header。那么,这个时候,就该让 request 模块中的 Request 方法出场了,这个 Request 方法的参数多一些:
urllib.request.Request(url, data=None, headers={}, method=None)
我们除了定义 url 和 data 之外,我们还可以定义请求头信息,urlopen 默认是 Get 请求当,我们传入参数它就为 Post 请求了,而 Request 可以让我们自己定义请求的方式,这样我们就可以使用 Request 来封装我们的请求信息。
通过设定headers参数可以冒充某个设备浏览器:

headers = {
    
    
    #假装自己是浏览器
    'User-Agent':' Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}

记得请求参数要转unicode码:

from urllib import request,parse
dict = {
    
    
    'return_url':'https://zhihu.com/',
    'user_name':'[email protected]',
    'password':'123456789',
    '_post_type':'ajax',
}
data = bytes(parse.urlencode(dict),'utf-8')

然后我们就可以封装 request 了:

req = request.Request(url,data=data,headers=headers,method='POST')

最后发送请求:

response = request.urlopen(req)
print(response.read().decode('utf-8'))

猜你喜欢

转载自blog.csdn.net/weixin_42468475/article/details/132309946