python 3.x 爬虫基础

python 3.x 爬虫基础---http headers详解

python 3.x 爬虫基础---Urllib详解

前言

  爬虫也了解了一段时间了希望在半个月的时间内结束它的学习,开启python的新大陆,今天大致总结一下爬虫基础相关的类库---Urllib

Urllib

官方文档地址:https://docs.python.org/3/library/urllib.html

urllib提供了一系列用于操作URL的功能。

Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库,其主要包括一下模块:

urllib.request 请求模块

urllib.error 异常处理模块

urllib.parse url解析模块

urllib.robotparser robots.txt解析模块

urllib.request

 urlopen

通过案例可以看出urlopen,会返回一个二进制的对象,对这个对象进行read()操作可以得到一个包含网页的二进制字符串,然后用decode()解码成一段html代码。

urlopen参数如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

常用参数:

  url:访问的地址,一般不只是地址。

  data:此参数为可选字段,特别要注意的是,如果选择,请求变为post传递方式,其中传递的参数需要转为bytes,如果是我们只需要通过 urllib.parse.urlencode 转换即可:

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding=  'utf8')
response = urllib.request.urlopen('http://xxxxx', data=data)
print(response.read().decode('utf-8'))

  timeout:设置网站的访问超时时间

其他参数:

  context 参数:它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。

  cafile 和 capath 两个参数:是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用。

  cadefault 参数:现在已经弃用了,默认为 False

urlopen返回对象提供方法:

  read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作。

  info():返回HTTPMessage对象,表示远程服务器返回的头信息。

  getcode():返回Http状态码。

  geturl():返回请求的url。

import urllib.request
response = urllib.request.urlopen('http://python.org/')
print("查看 response 的返回类型:",type(response))
print("查看反应地址信息: ",response)
print("查看头部信息1(http header):\n",response.info())
print("查看头部信息2(http header):\n",response.getheaders())
print("输出头部属性信息:",response.getheader("Server"))
print("查看响应状态信息1(http status):\n",response.status)
print("查看响应状态信息2(http status):\n",response.getcode())
print("查看响应 url 地址:\n",response.geturl())
page = response.read()
print("输出网页源码:",page.decode('utf-8'))

 Request

import urllib.request
headers = {'Host': 'www.xicidaili.com',
           'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
           'Accept': r'application/json, text/javascript, */*; q=0.01',
           'Referer': r'http://www.xicidaili.com/', }
req = urllib.request.Request(r'http://www.xicidaili.com/nn/', headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)

通过代码我们可以看出urlopen不再是传递url了,而是一个 request。这样一来我们不带把请求独立成一个对象,而且能更加灵活方便的配置访问参数,这是爬虫http必不可少的一步。

Request参数如下:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

常用参数:  

  url:访问的地址。

  data:此参数为可选字段,其中传递的参数需要转为bytes,如果是字典我们只需要通过 urllib.parse.urlencode 转换即可:

   headers:http相应headers传递的信息,构造方法:headers 参数传递,通过调用 Request 对象的 add_header() 方法来添加请求头。python 3.x 爬虫基础---http headers详解,可参考此文章。

其他参数:

  origin_req_host :指的是请求方的 host 名称或者 IP 地址。

  unverifiable :用来表明这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。如果没有权限,这时 unverifiable 的值就是 True 。

  method :用来指示请求使用的方法,比如 GET , POST , PUT 等

 ProxyHandler(ip代理)

以上做些简单的demo是没有问题的,但是如果想让你的爬虫更加强大,那么 rulllib.request.ProxyHandler 设置代理你一定要知道,网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问,所以这个时候需要通过设置代理来爬取数据

ef Proxy_read(proxy_list, user_agent_list, i):
    proxy_ip = proxy_list[i]
    print('当前代理ip:%s'%proxy_ip)
    user_agent = random.choice(user_agent_list)
    print('当前代理user_agent:%s'%user_agent)
    sleep_time = random.randint(,)
    print('等待时间:%s s' %sleep_time)
    time.sleep(sleep_time)
    print('开始获取')
    headers = {'User-Agent': user_agent,'Accept': r'application/json, text/javascript, */*; q=0.01',
                'Referer': r'https://www.cnblogs.com'
                }
    proxy_support = request.ProxyHandler({'http':proxy_ip})
    opener = request.build_opener(proxy_support)
    request.install_opener(opener)
    req = request.Request(r'https://www.cnblogs.com/kmonkeywyl/p/8409715.html',headers=headers)
    try:
        html = request.urlopen(req).read().decode('utf-8')
    except Exception as e:
        print('******打开失败!******')
    else:
        global count
    count +=
    print('OK!总计成功%s次!'%count)

以上代码是前段时间写的刷新页面的但是没有达到想要的效果,不过里面有用到 request.ProxyHandler({'http':proxy_ip}) 。其中 urllib.request.build_opener()  方法来利用这个处理器构建一个 Opener ,那么这个 Opener 在发送请求的时候就具备了认证功能了。 request.install_opener(opener) 方法打开链接,就可以完成认证了。

 HTTPCookieProcessor(cookie操作)

网站中通过cookie进行判断权限是很常见的。那么我们可以通过 urllib.request.HTTPCookieProcessor(cookie)  来操作cookie。使用Cookie和使用代理IP一样,也需要创建一个自己的opener。在HTTP包中,提供了cookiejar模块,用于提供对Cookie的支持。 http.cookiejar功能强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

获取cookie( CookieJar)

import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
   print(item.name+"="+item.value)

保存cookie(MozillaCookieJar)

filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

使用cookie

import http.cookiejar, urllib.request
cookie = http.cookiejar.MozillaCookieJar()
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

其中FileCookieJar、MozillaCookieJar、LWPCookieJar约为保存cookie信息,只是保存格式不同。我们在进行操作cookie时使用对应的格式即可。

urllib.error

  用 try-except来捕捉异常,主要的错误方式就两种 URLError(错误信息)和HTTPError(错误编码).

try:
    data=urllib.request.urlopen(url)
    print(data.read().decode('utf-8'))
except urllib.error.HTTPError as e:
    print(e.code)
except urllib.error.URLError as e:
    print(e.reason)

urllib.parse

 urlparse

将对应的URL解析成六部分,并以元组的数据格式返回来。

import urllib.parse
o = urllib.parse.urlparse('http://www.cnblogs.com/kmonkeywyl/')
print(o)

参数

result = urlparse('url',scheme='https')解析协议 可以去掉http://

result = urlparse('url',scheme='http')

result = urlparse('url',allow_fragments=False) url带有查询参数

result = urlparse('url',allow_fragments=False) url不带有查询参数

 urlunparse

拼接url

from urllib.parse
data = ['http','www.baidu.com','index.html','user','a=1','comment']
print(urllib.parse.urlunparse(data))

 urljoin

用来拼接url的方法 或者叫组合方法,url必须为一致站点,否则后面参数会覆盖前面的host

from urllib.parse import urljoin
print(urljoin('http://www.baidu.com','FAQ.html'))
print(urljoin('http://www.badiu.com','https://www.baidu.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html','http://www.baidu.com/FAQ.html'))
print(urljoin('www.baidu.com#comment','?category=2'))

这个在这个就不过多的介绍了,有兴趣的可以去看资料。

python 3.x 爬虫基础---Urllib详解的更多相关文章

  1. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  2. python 3.x 爬虫基础---正则表达式

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...

  3. python 3.x 爬虫基础---Requersts,BeautifulSoup4(bs4)

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...

  4. python 3.x 爬虫基础---http headers详解

    前言 上一篇文章 python 爬虫入门案例----爬取某站上海租房图片 中有对headers的讲解,可能是对爬虫了解的不够深刻,所以老觉得这是一项特别简单的技术,也可能是简单所以网上对爬虫系统的文档 ...

  5. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

  6. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  7. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  8. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  9. kafka实战教程(python操作kafka),kafka配置文件详解

    kafka实战教程(python操作kafka),kafka配置文件详解 应用往Kafka写数据的原因有很多:用户行为分析.日志存储.异步通信等.多样化的使用场景带来了多样化的需求:消息是否能丢失?是 ...

随机推荐

  1. JAVA之JDBC的简单使用(Mysql)

    JDBC增删查改 昨天七七八八的关于Mysql的配置 和 基本使用也算是初步解决了,今天 抽空看了JAVA的JDBC(JAVA DATA BASE CONNECTION)我也不知道我全称拼写对对不对

  2. sql 中文转拼音首字母

    http://blog.csdn.net/zhanglong_longlong/article/details/46772571 --可支持大字符集20000个汉字! create function ...

  3. IOS学习笔记27—使用GDataXML解析XML文档

    http://blog.csdn.net/ryantang03/article/details/7868246

  4. 解析MYsql explain执行计划extra列输出

    EXPLAIN Extra 列信息: explain Extra列输出包含了关于mysql如何解决query的额外信息,特别是出现Using filesort 和 using temporary时,应 ...

  5. 分布式CAP原理

    根据维基百科定义[CAP] 根据定理,一个分布式系统最多只能满足其中两项, 不可能同时满则C-A-P三项 首先说一下对各项原则的理解 (1)一致性C: 单机环境下, 数据只有一份,所有的客户端访问的是 ...

  6. js中this详解

    this对象是在闭包一节中提到的,书上的原话是:"this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对 ...

  7. 修改Weblogic jdk版本

    找到 F:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin setDomainEnv.cmd

  8. php等比例压缩图片

    <?php function resizeImage($im,$maxwidth,$maxheight,$name,$filetype) { $pic_width = imagesx($im); ...

  9. Effective Java 第三版——28. 列表优于数组

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. python3 第四章 - 输入与输出

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. print('hello, world') 输入以上代码,执行后输出: hello, world 事实上,任何基本类型都可 ...