上一篇介绍了爬虫的基本用法,用来简单的爬取了一个网站,我们直接用网址就访问了一个网站,但这样是很不好的,有的网站这样也进不去,打个比方,就像我们知道某个人的家庭住址,我们想找她的时候直接就闯了进去,也没说我们是谁,也没和他说我们要来找他,这样可以吗?当然不行!所以我们访问网站时还应该把我们伪装一下,伪装成一个浏览器,这样我们就算是个正常用户了。
我们怎么来伪装呢?要执行更复杂的操作,我们需要给urlopen传入一个requst对象而不是一个简单的网址,
import urllib.request #引入库
req=urllib.request.Request("https://www.baidu.cn") #创建request对象
response=urllib.request.urlopen(req) #访问网页
text=response.read().decode() #解码
print(text)
而要实现我们伪装成浏览器的目的,我们还需要给request对象一个User-Agent的报头,这个User-Agent,是每个浏览器都有的一个东西,你可以按F12,在开发者工具的network里找到。
再说request对象,他可以接收多个参数
url(网址),
data(用来传递post参数,默认空),
header(是一个字典,包含了需要发送的HTTP报头的键值对,默认空,一些我们要改动的就是这部分)。
我们可以找一个user-agent试试,打开浏览器,随便打开一个网页,在开发者工具(可以F12,QQ浏览器这样好像不行,或者右键,检查)里,找到network,往下找找能看见一个user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
这是一份完整的代码:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
#引入了ssl模块,用于取消代理
user="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
req=urllib.request.Request("https://www.baidu.com",headers={"User-Agent":user})
response=urllib.request.urlopen(req)
text=response.read().decode()
print(text)
Ps:在传参数的时候推荐使用关键参数传参(即写出参数的名字,如Request(url=‘XXX’,headers=XXX)),不然容易出错,毕竟你不可能记住所有参数的顺序