先来补充点小知识:
什么是UA:
用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
UA的获取:
这里以谷歌浏览器为例,打开谷歌浏览器,F12打开检查框,依次点击图中红色标记处(如果发现信息不全就点击浏览器上的刷新按钮),最后黄线标记处就是你的浏览器的UA。
url的组成:
url的组成:
https://www.baidu.com/s?wd=梅西
http/https www.baidu.com 80/443 s wd=梅西 #
协议 主机 端口号 路径 参数 锚点
我们先用以下代码来爬取百度首页的网页源代码,不过,我们在这里将百度网址中‘http’改成‘https’:
import urllib.request
url = 'https://www.baidu.com' # http -> https
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
print(content)
最后控制台只能输出部分网页源代码。
为什么同样的代码,当网址是‘http’时,能爬取所有数据,而当网址是‘https’时,却只能爬取部分数据呢?这是因为https相较于http,它具有安全性的ssl加密传输协议,因此在这里我们遇到了“反爬”,以至于我们无法成功爬取所有数据 。
有一个方法是,利用UA来爬取数据。我们可以在urlopen方法中传入UA。那么如何传入UA到urlopen方法中呢?先来看下urlopen方法的源码:
黄色标记处可知,urlopen第一个参数传入的类型应该是一个字符串或一个Request对象。
因此,我们可以把我们的UA转换成Request对象来传入urlopen方法中。
转换的过程,要用到请求对象的定制。初步代码如下(传参之前):
# 请求对象的定制
request = urllib.request.Request()
我们来看看Request的源码,确定下传入参数的类型:
可知,传入的是可以是一个url和一个headers字典,于是我们把UA存入字典中:
headers = {
'User-Agent': '你获取的UA'
}
最终,完整代码如下:
import urllib.request
url = 'https://www.baidu.com'
headers = {
'User-Agent': '你获取的UA'
}
# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
运行成功后,就能爬取完整数据了。