前面学习了Urllib模块里面最最基本的GET和POST操作。现在做个简单的例子,比如我打算爬http://www.oschina.net/ 的页面
如果使用一样的方法
import urllib.request
url = "http://www.oschina.net/"
data = urllib.request.urlopen(url).read()
他会抛出以下异常
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
这是因为这个网站做了一个反爬的设置,禁止非浏览器访问。绕过这个限制很容易,我们自己加工一个Header让服务器认为我们是通过浏览器访问的就好了。
按F12,选择network,刷新页面,然后看看Request Header里面的User-Agent
把这段内容拷贝下来,我们就可以自己编辑了。
Urllib里面有2个方法可以自己添加header。
Method 1:通过build_opener()实现
import urllib.request
url = "http://www.oschina.net/"
header=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[header]
data=opener.open(url).read()
fp=open('c:\\temp\\tt.html','wb')
fp.write(data)
fp.close()
Method 2: 通过 Request()实现
import urllib.request
url = "http://www.oschina.net/"
r=urllib.request.Request(url)
r.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")
data=urllib.request.urlopen(r).read()
fp=open('c:\\temp\\tt.html','wb')
fp.write(data)
fp.close()
两种方法都可以实现浏览器伪装。执行一下,就可以成功地爬取这个网站的页面了。