前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-数据挖掘-请求伪装

Python-数据挖掘-请求伪装

作者头像
小团子
发布2019-07-18 15:09:12
9640
发布2019-07-18 15:09:12
举报
文章被收录于专栏:数据云团数据云团

Python-数据传输-urllib库

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

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

代码语言:javascript
复制
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。

  • 使用相关的 Handler 处理器创建特定功能的处理器对象。
  • 通过 urllib.request.build_opener() 方法使用这些处理器对象创建自定义到的 opener 对象。
  • 使用自定义的 opener 对象,调用 open() 方法发送请求。这里需要注意的是,如果程序中所有的请求都使用自定义的 opener,可以使用 urllib2.install_opener() 将自定义的 opener 对象定义为全局 opener,表示之后凡是调用 urlopen,都将使用自定义的 opener。
代码语言:javascript
复制
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 来设置代理服务器:

代码语言:javascript
复制
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())
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档