资讯专栏INFORMATION COLUMN

爬虫学习(二)基础阶段

xiaoqibTn / 2923人阅读

摘要:如果要添加该参数,并且如果它是字节流编码格式的内容,即类型,则需要通过方法转化。通过的格式将字典进行字节流的编码,将编码后的字节流数据传输到指定这里存在一个,要进行指定方式解码。第二个参数如果要传,必须传字节流类型的。

请求头中的内容:

Date: 标识 响应产生 的时间 。

Last-Modified: 指定资源的最后修改时间。

Content-Encoding: 指定 响应 内容的编码 。

Server: 包含服务器的信息,比如名称、版本号等。

Content-Type: 文档类型,指定返回的数据类型是什么,如 text/html代表返回 HTML文档,

application/x-javascript !J!U代表返回 JavaScript文件, image/jpeg则代表返回图片 。

Set-Cookie: 设置 Cookies。 响应头 中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookies中, 下次请求携带 Cookies请求。

Expires: 指定响应的过期时间 , 可以使代理服务器或浏览器将加载的内容更新到缓存。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。

1.urllib.request模块

request: 最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样,只需要给库方法传入 URL 以及额外的参数,就可以模拟实现这个过程了 ,同时它还带有处理授权验证( authenticaton )重定向( redirection)浏览器 Cookies 以及其他内容

error: 异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止 。

parse: 一个工具模块,提供了许多 URL处理方法,比如拆分,解析,合并等。

robotparser:主要是用来识别网站的 robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少 。

urllib.request.urlopen() 为最基本HTTP请求的方法

import urllib.request
response= urllib.request.urlopen("https://www.python.org") 
print(response.read().decode ("utf-8"))  //打印出网页的源代码
print(type(response))    //说明该对象类型为HTTPResponse类型。
print(response.status)    //200

print(response.getheaders()) //   
[("Server", "nginx"), ("Content-Type", "text/html; charset=utf-8"), ("X-Frame-Options", "DENY"), 
("Via", "1.1 vegur"), ("Via", "1.1 varnish"), ("Content-Length", "48995"), ("Accept-Ranges", "bytes"), 
("Date", "Mon, 13 May 2019 09:23:37 GMT"), ("Via", "1.1 varnish"), ("Age", "3595"), ("Connection", "close"), 
("X-Served-By", "cache-iad2139-IAD, cache-tyo19927-TYO"), ("X-Cache", "HIT, HIT"), 
("X-Cache-Hits", "1, 6071"), ("X-Timer", "S1557739417.434556,VS0,VE0"), ("Vary", "Cookie"), 
("Strict-Transport-Security", "max-age=63072000; includeSubDomains")]

print(response.getheader("Server"))    //nginx

HTTPResposne类型的对象,主要包含

read()、 readinto()、 getheader(name)、getheaders()、 fileno()等方法,以及 msg、 version、status、reason、debuglevel、closed等属性。

如果想给链接传递一些参数,该怎么实现呢?首先看一下urlopen()函数的 API:

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

data参数
data 参数是可选的。 如果要添加该参数,并且如果它是字节流编码格式的内容,即 bytes 类型, 则需要通过 bytes()方法转化。 另外,如果传递了这个参数,则它的请求方式就不再是 GET方式,而是POST方式。

import urllib

data = bytes(urllib.parse.urlencode({"word":"hello"}), encoding="utf8")    //通过utf8的格式将字典进行字节流的编码,
response= urllib.request.urlopen("http://httpbin.org/post", data=data)        //将编码后的字节流数据传输到指定URL
print(response.read().decode("utf-8"))//这里存在一个bug,要进行指定方式解码。

Result:

  {
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "word": "hello"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "10", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.6"
  }, 
  "json": null, 
  "origin": "171.81.189.140, 171.81.189.140", 
  "url": "https://httpbin.org/post"
}

• timeout参数
timeout参数用于设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。它支持HTTP,HTTPS,FTP请求。

import socket
import urllib


try:
    response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1)  //如果时间超过0.1S不响应就报错。
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print("TIME OUT!")

• 其他参数
除了data参数和timeout参数外,还有context参数,它必须是 ssl.SSLContext类型,用来指定SSL 设置。此外,cafile和 capath这两个参数分别指定 CA证书和它的路径,这个在请求 HTTPS链接时会有用。
cadefault参数现在已经弃用了,其默认值为 False。

2.Request类
import urllib.request

request = urllib.request.Request("https://python.org")
response = urllib .request.urlopen(request)
print(response.read().decode ("utf-8"))

依然是用 urlopen()方法来发送这个请求,只不过该方法的参数不再是 URL, 而是一个 Request 类型的对象。通过构造这个数据结构,一方面我们可以将请求独立成一个对象,另 一方面可更加丰富和灵活地配置参数 。

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

第一个参数url用于请求URL,这是必传参数,其余可选。

第二个参数 data 如果要传,必须传 bytes (字节流)类型的。如果它是字典,可以先用 urllib.parse模块里的urlencode()编码。将字典里面所有的键值转化为query-string格式(key=value&key=value),并且将中文转码。

第三个参数 headers是一个字典,它就是请求头,我们可以在构造请求时通过 headers参数直 接构造,也可以通过调用请求实例的 add_header()方法添加。

添加请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是Python-urllib,我们可以通过修改它来伪装浏览器 。 比如要伪装火狐浏览器,你可以把它设置为 :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:66.0) Gecko/20100101 Firefox/66.0

第四个参数 origin_req_host指的是请求方的host名称或者IP地址。

第五个参数 unverifiable表示这个请求是否是无法验证 的,默认是 False,意思就是说用户没有足够权限来选择接收这个请求的结果。 例如,我们请求一个 HTML文档中的图片,但是我 们没有向动抓取图像的权限,这时unverifiable 的值就是True。

第六个参数 method是一个字符串 ,用来指示请求使用的方法,比如 GET、 POST和 PUT等

from urllib import parse,request    

url = "http://httpbin.org/post"
headers = {
"User-Agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
"Host" :"httpbin.org"
}

dict={
"name":"Gremey"
}
data= bytes(parse.urlencode(dict), encoding="utf-8")

#req = request.Request(url=url, data=data, headers=headers, method="POST")
//上面是直接写好headers传递参数传递给对象,下面是多带带的通过对象的方法传递
req=request.Request(url=url, data=data, method="POST")
req.add_header("User-Agent","Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)")
response = request.urlopen(req)
print(response.read().decode("utf-8"))

3. 高级用法

在上面的过程中,我们虽然可以构造请求,但是对于一些更高级的操作(比如 Cookies处理 、 代理设置等),该如何处理?
就需要更强大的工具 Handler 登场了。简而言之,我们可以把它理解为各种处理器,有专门处理登录验证的,有处理 Cookies 的,有处理代理设置的。利用它们,我们几乎可以做到 HTTP请求中所有的事。
urllib .request 模块里的 BaseHandler类,它是所有其他 Handler 的父类,它提 供了最基本的方法,例如 default_open()、 protocol_request()等。

接下来,就有各种 Handler 子类继承这个 BaseHandler类,举例如下 。

HITPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出 HTTPError类型的异常。

HTTPRedirectHandler:用于处理重定向。

HTTPCookieProcessor: 用于处理 Cookies。

ProxyHandler:用于设置代理 , 默认代理为空 。

HπPPasswordMgr:用于管理密码,它维护了用户名和密码的表。

HTTPBasicAuthHandler: 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。

另一个比较重要的类就是 OpenerDirector,我们可以称为 Opener。 我们之前用过 urlopen()这个方法,实际上它就是urllib为我们提供的一个Opener。
那么,为什么要引人Opener 呢?因为需要实现更高级的功能。之前使用的 Request 和 urlopen() 相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求,但是现在不一样了,我们需要实现更高级的功能,所以需要深入一层进行配置,使用更底层的实例来完成操作,所以这里就用到了Opener。
Opener可以使用 open()方法,返回的类型和urlopen()如出一辙。 那么,它和 Handler 有什么关 系呢?简而言之,就是利用 Handler来构建 Opener。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43914.html

相关文章

  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • 史上最详细Python学习路线-从入门到精通,只需90天

    摘要:针对的初学者,从无到有的语言如何入门,主要包括了的简介,如何下载,如何安装,如何使用终端,等各种开发环境进行开发,中的语法和基本知识概念和逻辑,以及继续深入学习的方法。 ...

    gghyoo 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 我是如何零基础自学转行人工智能的(附十问十答)

    摘要:我的决定是学人工智能,当时对这个比较感兴趣。从机器学习学到深度学习再学回机器学习。面试,成功地去公司从事机器学习深度学习方面的基础工作。这个系列不仅仅以学习为目的,目的是为了达到机器学习的工作入门标准。 每个字都是经验所得,都是站在一个零基础的人的角度写的,纯手打+网上优秀资源整合,希望大家能每个字都认真看。 接下来文章会侧重在以下几方面 1、零基础如何进行人工智能的自学(以找工作为目...

    IamDLY 评论0 收藏0

发表评论

0条评论

xiaoqibTn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<