python 爬虫基础之urllib 库详解

70人阅读 评论(0) 收藏 举报
分类:
一:爬虫的基本流程:
发起请求,即发送一个request,请求可以包含额外的信息,等待服务器的响应
获取响应的内容,所获取的页面的内容类型可能有HTML,json或者二进制数据
解析响应的内容,如果是HTML可以用正则表达式来解析,或者用解析库来解析,json类型可以转换为json对象解析。
保存数据,文本或者数据库

二:请求网站的一些库

1.

(1):urllib库(python中内置的HTTP请求库),其中urllib库在python2 和python3中是有区别的。
在urllib库中,主要有四个方法:
urllib.request这是在python3 中的表示方法,在python2中是urllib.open,作用是发送request请求和获取request的结果{是最基本的请求库}
urllib.error:"异常处理模块"
urllib.parse:"URL解析模块"

urilib.robotparser:"robots.txt解析莫莫模块"

(2):urllib库中的一些方法的代码实例

#urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
#这个是urllib.request.urlopen函数的参数。
import urllib.request
response=urllib.request.urlopen("http://www.baidu.com")#这是get请求,就一个url参数。
print(type(response))
print(response.getheader("Date"))#函数的作用是返回请求数据的response headers中的数据,数据是字典的格式,输入键值可以获得其中的值。
print(response.getheaders())#这个不用输入键值可以获取所有的respon headers数据。
print(response.status)#返回的是状态码。
print(response.read().decode('utf-8'))
#<class 'http.client.HTTPResponse'>这个是response的类型。它主要包含的方法有
# read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和
#  msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性

(3):上一步中参数只有一个url,但我们发现其实参数还有好多,但常用的是前三个,我们还可以传递其它的内容,比如 data (附加参数), timeout (超时时间)等等。

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

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
在这里我们传递了一个参数 word ,值是 hello 。它需要被转码成 bytes (字节流)类型。其中转字节流采用了 bytes() 方法,第一个参数需要是 str (字符串)类型,需要用 urllib.parse.urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8 。
提交的网址是 httpbin.org ,它可以提供 HTTP 请求测试。 http://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数

(4):timeout方法

import urllib.request
response = urllib.request.urlopen('http://httpbin.org', timeout=0.1)
print(response.read())
#urllib.error.URLError: <urlopen error timed out>报错了时间超时了.

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')

这个是用异常处理来体现timeout方法的.在这里我们请求了 http://httpbin.org/get 这个测试链接,设置了超时时间是0.1秒,然后捕获了 urllib.error.URLError 这个异常,然后判断异常原因是超时异常,就得出它确实是因为超时而报错,打印输出了 TIME OUT .

2.

urllib.request.Request的使用。

由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。


首先我们用一个实例来感受一下 Request 的用法:

import urllib.request
request=urllib.request.Request("http://www.baidu.com")
response=urllib.request.urlopen(request)
print(response.read().decode("utf-8"))
#其实这个方法的结果和之前的直接用urlopen的结果是一样的。

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

下面我们看一下 Request 它的一些参数

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

其中url是必须选的,其余都是可选的。

data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-
Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11
origin_req_host 指的是请求方的 host 名称或者 IP 地址。
unverifiable 指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True 。

method 是一个字符串,它用来指示请求使用的方法,比如 GET , POST , PUT 等等。

下面举一个例子理解一下:

import urllib.request
import urllib.parse
url="http://httpbin.org/post"
dict={"name":"Mrsun"}
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
header={'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    "host":'httpbin.org'}
request=urllib.request.Request(url=url,headers=header,data=data,method="POST")
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

运行结果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "word": "hello"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Content-Length": "10", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
  }, 
  "json": null, 
  "origin": "222.173.104.238", 
  "url": "http://httpbin.org/post"
}
你会发现我们把一些成功的设置了header和data,method等参数。



查看评论

python——urllib模块

http://blog.csdn.net/lxlzhn/article/details/10474281 1. 简述 这里说的urllib模块,是urllib*模块,包括了urllib、urll...
  • woshizoe
  • woshizoe
  • 2014-01-26 16:06:27
  • 566

urllib库的简单使用 && 一个简单的Python爬虫示例

urllib库的简单使用 && 一个简单的Python爬虫示例本篇文章,介绍urllib.request库的简单使用以及注意的问题。最后实现一个Python爬虫的示例。本文是基于Python3.6.2...
  • qq_33689414
  • qq_33689414
  • 2017-11-08 15:24:47
  • 559

Python爬虫二(Urllib库的基本使用和高级用法)

转载:静觅 » Python爬虫入门三之Urllib库的基本使用 转载:静觅 » Python爬虫入门四之Urllib库的高级用法 1.分分钟扒一个网页下来 怎样扒网页呢?其...
  • freeking101
  • freeking101
  • 2017-03-01 22:13:09
  • 1065

python爬虫(一)urllib库基本使用

注,以下内容均为python3.5.*代码学习爬虫,首先有学会使用urllib库,这个库可以方便的使我们解析网页的内容,本篇讲一下它的主要用法解析网页#!/usr/bin/env python3 # ...
  • baidu_35085676
  • baidu_35085676
  • 2017-03-16 18:03:32
  • 928

python爬虫模块安装

urllib和urllib2 python2.x里urllib2库,在python3.x里,urllib2改名为urllib,被分成一些子模块:urllib.request, urllib.pars...
  • qiqiaiairen
  • qiqiaiairen
  • 2016-05-24 19:45:35
  • 2771

python爬虫之urllib库的使用

1.爬取百度的源码 爬网页就是根据URL来获取它的网页信息,源码里面有HTML代码,加JS、CSS,其中最重要的部分在HTML代码中 截取了一小段的运行结果 2.分析代码 首先从urllib....
  • finna_xu
  • finna_xu
  • 2017-03-28 21:54:09
  • 595

python2.7爬虫学习笔记(一)---Urllib库的使用

扒一个网页 构造Request post和get数据传送 设置headers Proxy(代理)的设置 Timeout设置 URLError异常处理 cookie的使用...
  • SirM2z
  • SirM2z
  • 2015-06-03 20:14:13
  • 8179

Python爬虫—1入门_1_python内置urllib库的初级用法

1、构造request并请求页面 import urllib2 url = "http://www.126.com/" request = urllib2.Request(url) respo...
  • scorpion_zs
  • scorpion_zs
  • 2017-04-06 19:17:23
  • 177

pyhon爬虫学习日记1_urllib-mac系统

系统:Mac sierra 版本:10.12.6  必备知识:最好具备python的基础知识,我已经有这个基础了,所以不知道没有会不会有很大影响 python基础我个人是在http://www.run...
  • yokan_de_s
  • yokan_de_s
  • 2017-09-12 12:15:22
  • 434

urllib库使用详解

通过这篇文章为大家介绍崔庆才老师对Python——urllib库的讲解本文共有约1200字,建议阅读时间8分钟,并且注重理论与实践相结合用电脑观看的可以点击阅读原文即可跳转到CSDN网页方便操作目录:...
  • Arise007
  • Arise007
  • 2018-03-01 08:25:40
  • 103
    个人资料
    持之以恒
    等级:
    访问量: 2471
    积分: 344
    排名: 22万+
    文章分类
    文章存档