网络请求之urllib.request的使用(Get方式)

时间:2024-07-17 19:01:35

urllib.request用于打开和读取url,模拟浏览器发送一个http请求,并获取响应结果。

urllib.request.urlopen的语法格式:

urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)

参数说明:
  • url
    url参数是str类型的地址,也就是访问的url,例如:https://image.baidu.com
  • data
    默认值为None,urllib判断参数data是否为None从而区分请求方式。或参数data为None,则代表请求方式为Get,反之则为Post。参数data以字典形式存储数据,并将参数data由字典类型转换成字节类型完成Post请求。
返回对象

urlopen函数,返回的结果,是一个http.client.HTTPResponse对象

Get方式爬取数据

import urllib.request

response=urllib.request.urlopen("https://image.baidu.com")
result=response.read()
print(result)

查看打印的部分内容(因为百度的页面数据太多了)

b'<!DOCTYPE html>\n<html lang="">\n  <head>\n    <meta charset=utf-8>\n    <meta http-equiv=X-UA-Compatible content="IE=edge">\n    <meta name=viewport content="width=device-width,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0">\n    <title>\xe5\x9b\xbe\xe6\x90\x9c\xe9\xa6\x96\xe9\xa1\xb5</title>\n   

发现titile居然是一堆十六进制的乱码,只说明我们代码里还没有处理字符集,这时候就需要去浏览器中打开网址:https://image.baidu.com,查看源代码的字符集了,发现字符集是“utf-8”
修改代码重新爬取试试:

import urllib.request

response=urllib.request.urlopen("https://image.baidu.com")
result=response.read().decode("utf-8") #decode就是处理编码格式的
print(result)

输出的内容这才对:

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset=utf-8>
    <meta http-equiv=X-UA-Compatible content="IE=edge">
    <meta name=viewport content="width=device-width,viewport-fit=cover,initial-scale=1,maximum-scale=1,user-scalable=0">
    <title>图搜首页</title>
    ...
    </head>
</html> 

所以呢,总结起来,爬虫的时候,一定要分析目标页面的编码,避免返工改一些无聊的bug,当然程序员防御性编程这无话可说