Python-数据传输-urllib库
对于一些需要登录的网站,如果不是从浏览器发出的请求,是不能获得响应内容。这种情况,需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。伪装浏览器需要自定义请求报头,也就是在发送 Request 请求时,加入特定的 Headers。
添加特定的 Headers 的方式,只需要调用 Request.add_header() 即可。如果想要查看已有的 Headers,可以通过调用 Request.get_header() 查看。
import urllib.request
url = "http://www.baidu.com/"
user_agent = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Trident/5.0)"}
request = urllib.request.Request(url, headers=user_agent)
request.add_header("Connection", "keep-alive")
response = urllib.request.urlopen(request)
print(response.code)
html = response.read()
print(html)
一、代理服务器
很多网站会检查某一个段时间某个 IP 的访问次数,如果同一 IP 访问过于频繁,那么该网站会禁止来自该 IP 的访问。
这种情况,可以使用代理服务器,每隔一段时间换一个代理。如果某个 IP 被禁止,可以换成其它 IP 继续爬取数据。
① 定义 opener
opener 是 urllib.request.OpenerDirector 类的对象,urlopen 就是模块构建的一个 opener,但是它不支持代理、Cookie 等其它的 HTTP/HTTPS 高级功能。如果设置代理,不能使用自带的 urlopen,而是要自定义opener。
import urllib.request
# 构建一个 HTTPHandler 处理器对象,支持处理 HTTP 请求
http_handler = urllib.request.HTTPHandler()
# 调用 urllib2.build_opener() 方法,创建支持处理 HTTP 请求的 opener 对象
opener = urllib.request.build_opener(http_handler)
# 构建 Request 请求
request = urllib.request.Request("http://www.baidu.com/")
# 调用自定义 opener 对象的 open() 方法,发送 request 请求
response = opener.open(request)
# 获取服务器响应内容
print(response.read())
② 设置代理服务器
可以使用 urllib.request 中的 ProxyHandler() 方法来设置代理服务器。
使用自定义 opener 来设置代理服务器:
import urllib.request
# 构建了两个代理 Handler,一个有代理 IP,一个没有代理 IP
httpproxy_handler = urllib.request.ProxyHandler({"http": "47.104.14.43"})
nullproxy_handler = urllib.request.ProxyHandler({})
# 定义一个代理开关
proxy_switch = True
if proxy_switch:
opener = urllib.request.build_opener(httpproxy_handler)
else:
opener = urllib.request.build_opener(nullproxy_handler)
request = urllib.request.Request("http://www.baidu.com/")
response = opener.open(request)
print(response.read())