关于User Agent,用户代理,简称UA。它是一个特殊的字符串,使得服务器能够识别客户使用的操作系统以及版本,CPU类型,浏览器版本。
浏览器内核,浏览器渲染引擎,浏览器语言,浏览器插件等。
url组成: 协议+主机+端口 + 路径+ 参数
例如: https:www.baidu.com
协议 hthttps ,主机 www.baidu.com, 端口和参数没有显示
常见端口号:
http 80, https 443, mysql 3306, oracle 1521, redis 6379,mongodb 27017
例如百度搜索编程语言:
**url地址:**https://www.baidu.com/s?wd=%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80&rsv_spt=1&rsv_iqid=0x91c63b620006e68f&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=ts_1&rsv_enter=1&rsv_sug3=7&rsv_sug1=5&rsv_sug7=100&rsv_sug2=1&rsv_btype=i&prefixsug=bianc%2520&rsp=1&inputT=3404&rsv_sug4=4090
我们只需要看前面的一部分地址:
https://www.baidu.com/s?wd=%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80
把这复制到浏览器Url ,看起来一样执行。
可以看出,/s为路径;参数为w,等号后的为参数的值。
测试代码:
import urllib.request
import urllib.parse
url =‘https://www.baidu.com/s?wd=python’
response = urllib.request.urlopen(url)
content = response.read().decode(‘utf8’)
print(content)
# 反爬的机制,返回的数据不是完整的
返回的数据:
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
Process finished with exit code 0
从返回数据看,数据不是完整的,说明存在反爬的。
解决方式:
请求对象的定制是为了解决反爬的一种手段,汉字转Unicode编码
queryName = urllib.parse.quote(“新冠肺炎”)
print(queryName) # %E6%96%B0%E5%86%A0%E8%82%BA%E7%82%8E
复制这个Url地址
https://www.baidu.com/s?wd=%E6%96%B0%E5%86%A0%E8%82%BA%E7%82%8E
与转换的unicode字符串一样的。所以通过这种方式转换。
传入UA参数和Url 地址的拼接
headers ={
‘User-Agent’:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36’
}
url_base =‘https://www.baidu.com/s?wd=’
queryName = urllib.parse.quote(“新冠肺炎”)
url = url_base + queryName
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode(‘utf8’)
print(content)
输出HTML正常!