Python-数据挖掘-请求伪装!伪装是非常重要的一环!

对于一些需要登录的网站,如果不是从浏览器发出的请求,是不能获得响应内容。这种情况,需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。伪装浏览器需要自定义请求报头,也就是在发送 Request 请求时,加入特定的 Headers。

添加特定的 Headers 的方式,只需要调用 Request.add_header() 即可。如果想要查看已有的 Headers,可以通过调用 Request.get_header() 查看。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import urllib.requesturl = "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。

  • 使用相关的 Handler 处理器创建特定功能的处理器对象。

  • 通过 urllib.request.build_opener() 方法使用这些处理器对象创建自定义到的 opener 对象。

  • 使用自定义的 opener 对象,调用 open() 方法发送请求。这里需要注意的是,如果程序中所有的请求都使用自定义的 opener,可以使用 urllib2.install_opener() 将自定义的 opener 对象定义为全局 opener,表示之后凡是调用 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,一个没有代理 IPhttpproxy_handler = urllib.request.ProxyHandler({"http": "47.104.14.43"})nullproxy_handler = urllib.request.ProxyHandler({})# 定义一个代理开关proxy_switch = Trueif 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())

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/88620139
今日推荐