爬虫基础高级篇
来源:互联网 发布:数据营销策略 编辑:程序博客网 时间:2024/05/21 21:01
示例
import urllib2request = urllib2.Request("http://www.baidu.com") response = urllib2.urlopen(request)print response.read()
POST和GET数据传送
数据传送分为POST和GET两种方式,两种方式有什么区别呢?
最重要的区别是GET方式是直接以链接形式访问,链接中包含了所有的参数,当然如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。POST则不会在网址上显示所有的参数,不过如果你想直接查看提交了什么就不太方便了。
POST方式:
import urllibimport urllib2values = {"username":"111","password":"222"}data = urllib.urlencode(values) url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"request = urllib2.Request(url,data)response = urllib2.urlopen(request)print response.read() 或者:import urllibimport urllib2values = {}values['username'] = "111"values['password'] = "222"data = urllib.urlencode(values) url = "http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"request = urllib2.Request(url,data)response = urllib2.urlopen(request)print response.read()
GET方式:
至于GET方式我们可以直接把参数写到网址上面,直接构建一个带参数的URL出来即可。
import urllibimport urllib2values={}values['username'] = "111"values['password']="222"data = urllib.urlencode(values) url = "http://passport.csdn.net/account/login"geturl = url + "?"+datarequest = urllib2.Request(geturl)response = urllib2.urlopen(request)print response.read()
设置Headers
有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性。
import urllib import urllib2 url = 'http://www.server.com/login'user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {'username' : '111', 'password' : '222' } headers = { 'User-Agent' : user_agent } data = urllib.urlencode(values) request = urllib2.Request(url, data, headers) response = urllib2.urlopen(request) page = response.read()
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 设置错误会导致服务器拒绝服务Referer:对付”反盗链”的方式.服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应.
Proxy(代理)的设置
urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理,网站君都不知道是谁在捣鬼了.
代理的设置用法:
import urllib2enable_proxy = Trueproxy_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)
TimeOut设置
urlopen方法的第三个参数就是timeout的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响。
import urllib2response = urllib2.urlopen('http://www.baidu.com', timeout=10)或:import urllib2response = urllib2.urlopen('http://www.baidu.com',data, 10)
使用DebugLog
通过下面的方法把 Debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试。
import urllib2httpHandler = 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')
URLError
URLError可能产生的原因:
1.网络无连接,即本机无法上网2.连接不到特定的服务器3.服务器不存在
用try-except语句来包围并捕获相应的异常
import urllib2requset = urllib2.Request('http://www.xxx.com')try: urllib2.urlopen(requset)except urllib2.URLError, e: print e.reason
HTTPError
HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。 101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。 102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 200:请求成功 处理方式:获得响应的内容,进行处理 201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到 202:请求被接受,但处理尚未完成 处理方式:阻塞等待 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL 302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL 304:请求的资源未更新 处理方式:丢弃 400:非法请求 处理方式:丢弃 401:未授权 处理方式:丢弃 403:禁止 处理方式:丢弃 404:没有找到 处理方式:丢弃 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
示例:
import urllib2 req = urllib2.Request('http://blog.csdn.net/cqcre')try: urllib2.urlopen(req)except urllib2.HTTPError, e: print e.code print e.reasonimport urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')try: urllib2.urlopen(req)except urllib2.HTTPError, e: print e.codeexcept urllib2.URLError, e: print e.reasonelse: print "OK" 还可以用hasattr属性提前对属性进行判断import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')try: urllib2.urlopen(req)except urllib2.URLError, e: if hasattr(e,"code"): print e.code if hasattr(e,"reason"): print e.reasonelse: print "OK"
0 0
- 爬虫基础高级篇
- 网络爬虫基础篇
- 网页爬虫基础篇
- 爬虫基础-网站篇
- 爬虫-python基础篇
- 把玩之python爬虫urllib2高级篇
- Python爬虫之基础篇
- 爬虫入门讲解:基础篇
- python爬虫-->爬虫基础
- python爬虫高级功能
- 爬虫基础
- 爬虫基础
- 爬虫基础。
- 爬虫基础
- 爬虫基础
- 爬虫基础
- 爬虫基础-- 正则基础
- 爬虫搜索基础篇(一)
- Java-字符串
- CTSC2017游记
- div+css 第一天
- kafka消息队列运维工具和相关安装目录文件总结
- PPAPI插件开发指南
- 爬虫基础高级篇
- 使用MyBatis-Spring类库进行mybatis与spring整合
- 贫民窟的hadoop日志---hadoop基本搭建
- UVA,10765 Doves and bombs
- 用一个例子解释什么是回调函数
- POJ4002Alice's mooncake shop
- Mysql数据库索引
- SpringMVC处理模型数据(2)
- 二分贪心总结