Python爬虫入门四urllib库的高级用法

1.设置headers

有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些 Headers 的属性。 首先,打开我们的浏览器,调试浏览器 F12,打开Network,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般是首先请求 HTML 文件,然后加载 JS,CSS 等等,经过多次请求之后,网页的骨架和肌肉全了,整个网页的效果也就出来了
在这里插入图片描述
拆分这些请求,我们只看一第一个请求,你可以看到,有个 Request URL,还有 headers,下面便是 response,图片显示得不全,小伙伴们可以亲身实验一下。那么这个头中包含了许许多多是信息,有文件编码啦,压缩方式啦,请求的 agent 啦等等。 其中,agent 就是请求的身份,如果没有写入请求身份,那么服务器不一定会响应,所以可以在 headers 中设置 agent, 例如下面的例子,这个例子只是说明了怎样设置的 headers,小伙伴们看一下设置格式就好。

import urllib  
import urllib2  url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'username' : 'cqc',  'password' : 'XXXX' }  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
request = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(request)  
page = response.read()

这样,我们设置了一个 headers,在构建 request 时传入,在请求时,就加入了 headers 传送,服务器若识别了是浏览器发来的请求,就会得到响应。 另外,我们还有对付” 防盗链” 的方式,对付防盗链,服务器会识别 headers 中的 referer 是不是它自己,如果不是,有的服务器不会响应,所以我们还可以在 headers 中加入 referer 例如我们可以构建下面的 headers

headers = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Referer':'http://www.zhihu.com/articles' }

同上面的方法,在传送请求时把 headers 传入 Request 参数里,这样就能应付防盗链了。 另外 headers 的一些属性,下面的需要特别注意一下:

  • User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
  • Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
  • application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
  • application/json : 在 JSON RPC 调用时使用 application/x-www-
  • form-urlencoded : 浏览器提交 Web 表单时使用 在使用服务器提供的 RESTful 或 SOAP 服务时,
  • Content-Type 设置错误会导致服务器拒绝服务

其他的有必要的可以审查浏览器的 headers 内容,在构建时写入同样的数据即可。

2.代理设置

urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个 IP 的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理,网站不知道是谁在捣鬼了, 下面一段代码说明了代理的设置用法

import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 
'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:opener = urllib2.build_opener(proxy_handler)
else:opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)
# urllib2.ProxyHandler
# urllib2.build_opener
# urllib2.install_opener
proxies = {'http': 'http://host:port'}
response = urllib.urlopen(url, proxies=proxies)
content = response.read()

3.Timeout设置

上一节已经说过 urlopen 方法了,第三个参数就是 timeout 的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响。 例如下面的代码,如果第二个参数 data 为空那么要特别指定是 timeout 是多少,写明形参,如果 data 已经传入,则不必声明。

import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)

4.使用HTTP的PUT和DELETE方法

http 协议有六种请求方法,get,head,put,delete,post,options,我们有时候需要用到 PUT 方式或者 DELETE 方式请求

  • PUT:这个方法比较少见。HTML 表单也不支持这个。本质上来讲, PUT 和 POST 极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT 通常指定了资源的存放位置,而 POST 则没有,POST 的数据存放位置由服务器自己决定。
  • DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如 amazon 的 S3 云服务里面就用的这个方法来删除资源。

如果要使用 HTTP PUT 和 DELETE ,只能使用比较低层的 httplib 库。

使用DebugLog

可以通过下面的方法把 Debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试,这个也不太常用,仅提一下

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')

效果

C:\Python27\python.exe H:/spiderexercise/spidertest/urllibtest.py
send: 'GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.baidu.com\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Bdpagetype: 1
header: Bdqid: 0x9260fc08000484e9
header: Cache-Control: private
header: Content-Type: text/html;charset=utf-8
...

以上便是一部分高级特性,前三个是重要内容,在后面,还有 cookies 的设置还有异常的处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程上下文、中断上下文及原子上下文

谈论进程上下文 、中断上下文 、 原子上下文之前,有必要讨论下两个概念: a -- 上下文 上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行时的环境; 具体来说就是各个变量和数据,…

HandlerThread用法

区分Handler和HandlerThreadHandler实例可以在主线程创建,也可以在子线程创建。在子线程中创建时通过Looper,以下示例: public class MainActivity extends AppCompatActivity { HandlerThread handlerThread; Override protected v…

PHP快速排序及其时间复杂度

<?phpfunction quickSort(&$arr, $l, $r) {if (count($arr)<2 || $l>$r) return;$tmp_l $l;$tmp_r $r;$privot $arr[$r];while($tmp_l<$tmp_r) {while($arr[$tmp_l] < $privot && $tmp_l<$tmp_r) $tmp_l; //内部没有$tmp_l <$tmp_r的判断…

Python爬虫入门五URLError异常处理

本节在这里主要说的是 URLError 还有 HTTPError&#xff0c;以及对它们的一些处理 1.URLError 首先解释下 URLError 可能产生的原因&#xff1a; 网络无连接&#xff0c;即本机无法上网连接不到特定的服务器服务器不存在 在代码中&#xff0c;我们需要用 try-except 语句来…

Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型

提到 sysfs 文件系统 &#xff0c;必须先需要了解的是Linux设备模型&#xff0c;什么是Linux设备模型呢&#xff1f; 一、Linux 设备模型 1、设备模型概述 从2.6版本开始&#xff0c;Linux开发团队便为内核建立起一个统一的设备模型。在以前的内核中没有独立的数据结构用来让内…

Python爬虫入门六Cookie的使用

为什么要使用 Cookie 呢&#xff1f; Cookie&#xff0c;指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09; 比如说有些网站需要登录后才能访问某个页面&#xff0c;在登录之前&#xff0c;你想抓取某个页面内容…

有得必有失

上次也说道Ruby on Rails 是一个很不错的框架。本人也想去研究一翻&#xff0c;我已经不再替别人写程序了。 当编程变成一门兴趣的时候&#xff0c;而不是吃饭的依据。我觉得我需要跟着我的心走。 1&#xff1a;我现在的工作环境是在LINUX下&#xff0c;我一次次的折腾mono好吧…

mybatis下log4j使用

1. log4j jar包&#xff08;mvnrepository&#xff09; 2. log4j.properties文件 log4j.properties内容&#xff1a; log4j.rootLoggerDEBUG, stdout, logfile    log4j.appender.stdoutorg.apache.log4j.ConsoleAppender    log4j.appender.stdout.layoutorg.apache…

Python爬虫入门七正则表达式

已经搞定了怎样获取页面的内容&#xff0c;不过还差一步&#xff0c;这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢&#xff1f;下面就开始介绍一个十分强大的工具&#xff0c;正则表达式 1.了解正则表达式 正则表达式是用来匹配字符串非常强大的工具&#xff0c;在其…

Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统

一、什么是Linux设备文件系统 首先我们不看定义&#xff0c;定义总是太抽象很难理解&#xff0c;我们先看现象。当我们往开发板上移植了一个新的文件系统之后&#xff08;假如各种设备驱动也移植好了&#xff09;&#xff0c;启动开发板&#xff0c;我们用串口工具进入开发板&a…

CSS 如何让Table的里面TD全有边框 而Table的右左边框没有

比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px solid; //显示右边框为1px&#xff0c;如果不想显示就为0pxBORDER-TOP: #f9f9f9 0px solid; //显示上边框为1px&#xff0c;如果不想显示就为0pxBORDER-LEFT: #f9f9f…

情人节,教大家使用css画出一朵玫瑰花。

情人节到了&#xff0c;给大家来一朵高端的玫瑰花。 在网上看到的一个canvas实现的玫瑰花&#xff0c;效果很好&#xff0c;但是代码被压缩过&#xff0c;也没有注释&#xff0c;看的云里雾里的。 今天我教大脚用CSS来实现一朵玫瑰花。 先看效果 首先我们画出一个花瓣 1、画出一…

Python爬虫利器一Requests库的用法

之前我们用了 urllib 库&#xff0c;这个作为入门的工具还是不错的&#xff0c;对了解一些爬虫的基本理念&#xff0c;掌握爬虫爬取的流程有所帮助。入门之后&#xff0c;我们就需要学习一些更加高级的内容和工具来方便我们的爬取。那么这一节来简单介绍一下 requests 库的基本…

Windows窗口样式

windows样式有很多种&#xff0c;不同的windows&#xff0c;windows控件接受不同的样式。如Combo box接受下以样式&#xff1a;WS_CHILD AlwaysWS_VISIBLE UsuallyWS_DISABLED RarelyWS_VSCROLL To add vertical scrolling for the list box in the combo boxWS_HSCROL…

Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

一、VFS 虚拟文件系统基础概念 Linux 允许众多不同的文件系统共存&#xff0c;并支持跨文件系统的文件操作&#xff0c;这是因为有虚拟文件系统的存在。虚拟文件系统&#xff0c;即VFS&#xff08;Virtual File System&#xff09;是 Linux 内核中的一个软件抽象层。它通过一些…

初识 es6

es6 可能出来已经有一段时间了&#xff0c;但是我到今天才发现他的好&#xff0c;却不是很了解他&#xff0c;也不知道各个浏览器的兼容性怎么样&#xff1f;今天就把他们都弄明白。 新增命令 let ES6新增了let命令&#xff0c;用来声明变量。它的用法类似于var&#xff0c;但是…

Python爬虫利器四PhantomJS的用法

大家有没有发现之前我们写的爬虫都有一个共性&#xff0c;就是只能爬取单纯的 html 代码&#xff0c;如果页面是 JS 渲染的该怎么办呢&#xff1f;如果我们单纯去分析一个个后台的请求&#xff0c;手动去摸索 JS 渲染的到的一些结果&#xff0c;那简直没天理了。所以&#xff0…

从零开始学习Hadoop--第1章 Hadoop的安装

Hadoop的安装比较繁琐&#xff0c;有如下几个原因&#xff1a;其一&#xff0c;Hadoop有非常多的版本&#xff1b;其二&#xff0c;官方文档不尽详细&#xff0c;有时候更新脱节&#xff0c;Hadoop发展的太快了&#xff1b;其三&#xff0c;网上流传的各种文档&#xff0c;或者…

vim使用—实现程序的自动补齐(C语言)

使用过Source Insight的人一定对它的自动补全功能印象深刻&#xff0c;在很多的集成开发环境中&#xff0c;也都支持自动补全。vim做为一个出色的编辑器&#xff0c;这样的功能当然少不了。至于如何实现程序自动补全&#xff0c;网上教程很多。这里&#xff0c;我将自己配置过程…

8、JDBC入门整理

JDBC入门 l 导jar包&#xff1a;驱动&#xff01; l 加载驱动类&#xff1a;Class.forName(“类名”); l 给出url、username、password&#xff0c; l 使用DriverManager类来得到Connection对象&#xff01; 1 什么是JDBC(接口,实现为驱动) JDBC&#xff08;Java DataBase…