Date: 2019-06-19

Author: Sun

urllib

​ 在Python 3以后的版本中,urllib2这个模块已经不单独存在(也就是说当你import urllib2时,系统提示你没这个模块),urllib2被合并到了urllib中,叫做urllib.request 和 urllib.error

urllib整个模块分为urllib.request, urllib.parse, urllib.error。

urllib是一个包含几个模块来处理请求的库。

分别是:

  • urllib.request 发送http请求
  • urllib.error 处理请求过程中,出现的异常。
  • urllib.parse 解析url
  • urllib.robotparser 解析robots.txt 文件

网页抓取

​ 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib.request库。

1. urlopen

定义:

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

功能:

像读文件一样读网页

案例1:

采用urllib抓取百度网页

# -*- coding: utf-8 -*-
__author__ = 'sun'
__date__ = '2019/6/19 9:54' #import urllib.request
from urllib import request # 向指定的url地址发送请求,并返回服务器响应的类文件对象
response = request.urlopen("http://www.baidu.com/") # 服务器返回的类文件对象支持Python文件对象的操作方法
# read()方法就是读取文件里的全部内容,返回字符串
html = response.read().decode('utf-8') # bytes ---》 str decode
# str --> bytes encode # 打印响应内容
print(html)

2. urlretrieve

`>>> ``help``(urllib.urlretrieve)`
urlretrieve(url, filename=None, reporthook=None, data=None) 

- 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
- 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
- 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。

功能:下载网页到文件

url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
urllib.urlretrieve(url,local)

下载百度网站,保存到本地文件

from urllib import request

baidu = request.urlretrieve('http://www.baidu.com','F:\\TX课堂\\授课内容\\第二部分-网络爬虫\\课件\\day02\\doc\\badu.html')

#如果urlretrieve不传文件名的话会自动生成,运行完程序可以删除
request.urlcleanup()
#urlcleanup
#清除urlretrieve产生的临时文件,及opener对象

扩展:

加入下载进度

from urllib import  request
import os
def Schedule(a,b,c):
'''''
a:已经下载的数据块
b:数据块的大小
c:远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100 :
per = 100
print('%.2f%%' % per) url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
#local = url.split('/')[-1]
#local = os.path.join('/data/software','Python-2.7.5.tar.bz2')
local = os.path.join('F:\\TX课堂\\授课内容\\第二部分-网络爬虫\\课件\\day02\\doc','Python-2.7.5.tar.bz2')
request.urlretrieve(url,local,Schedule)

3. Request对象

class Request:
def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# url是网址,data数据,header头消息,origin_req_host相当于referrer,method请求的方法(如get,post)

需要添加headers头信息,urlopen不支持,需要使用Request

案例:访问简书网站信息

# -*- coding: utf-8 -*-
__author__ = 'sun'
__date__ = '2019/6/19 9:54' from urllib import request
from urllib.request import Request url = 'https://www.jianshu.com'
# 增加header
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36',
}
req = Request(url,headers=headers) #多一层封装
# or req.add_header("Connection", "keep-alive")
response = request.urlopen(req)
html = response.read().decode('utf-8') # read()方法就是读取文件里的全部内容,返回字符串
#在urllib里面 判断是get请求还是post请求,就是判断是否提交了data参数
print(f'method:{req.get_method()}')
code = response.getcode() #返回码
resp_url = response.geturl()
resp_head_info = response.info()
print("#####################")
print(f"response code:{code}, url:{resp_url}")
print(f"head_info:{resp_head_info}")

4. urllib.error

urllib.error可以接收有urllib.request产生的异常。urllib.error中常用的有两个方法,URLError和HTTPError。URLError是OSError的一个子类,

HTTPError是URLError的一个子类,服务器上HTTP的响应会返回一个状态码,根据这个HTTP状态码,我们可以知道我们的访问是否成功。

URLError

URLError产生原因一般是: 网络无法连接、服务器不存在等。

例如访问一个不存在的url

import urllib.error
from urllib import request
requset = urllib.request.Request('http://www.usahfkjashfj.com/') #无效url
try:
urllib.request.urlopen(requset).read()
except urllib.error.URLError as e:
print(e.reason)
else:
print('success')

5. 设置代理

(1)UA代理

USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
user_agent = random.choice(USER_AGENTS) headers = {
'User-Agent': user_agent
}

(2)IP代理

当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

# -*- coding: utf-8 -*-
__author__ = 'sun'
__date__ = '2019/6/19 9:54' from urllib import request
from urllib.request import Request from urllib.error import URLError from urllib.request import ProxyHandler, build_opener url = 'http://httpbin.org/get'
#url = 'http://www.baidu.com' proxy = '39.134.108.89:8080'
# 参数是字典,键名是协议类型,健值是代理
proxy_handler = ProxyHandler({
'http': 'http://' + proxy,
'https': 'https://' + proxy
})
# Opener已经设置好代理了
opener = build_opener(proxy_handler)
try:
response = opener.open(url)
# 运行结果是一个JSON
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)

client --------> server

IP proxy

client ----> proxy ----> server

URLLib库使用的更多相关文章

  1. python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨

    python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...

  2. urllib库初体验以及中文编码问题的探讨

    提出问题:如何简单抓取一个网页的源码 解决方法:利用urllib库,抓取一个网页的源代码 ------------------------------------------------------- ...

  3. Python爬虫入门 Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

  4. Python爬虫入门:Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...

  5. Python2/3中的urllib库

    urllib库对照速查表 Python2.X Python3.X urllib urllib.request, urllib.error, urllib.parse urllib2 urllib.re ...

  6. 芝麻HTTP:Python爬虫入门之Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

  7. python爬虫 - Urllib库及cookie的使用

    http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...

  8. Urllib库的使用

    一.任务描述   本实验任务主要对urllib库进行一些基本操作,通过完成本实验任务,要求学生熟练掌握urllib库的使用,并对urllib库的基本操作进行整理并填写工作任务报告. 二.任务目标 1. ...

  9. 对于python爬虫urllib库的一些理解(抽空更新)

    urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib库中,所有和网 ...

  10. (爬虫)urllib库

    一.爬虫简介 什么是爬虫?通俗来讲爬虫就是爬取网页数据的程序. 要了解爬虫,还需要了解HTTP协议和HTTPS协议:HTTP协议是超文本传输协议,是一种发布和接收HTML页面的传输协议:HTTPS协议 ...

随机推荐

  1. PAT 1075. PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submittions. Th ...

  2. Spring Cloud系列(二) 介绍

    Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...

  3. 洛谷—— P1784 数独

    https://www.luogu.org/problem/show?pid=1784 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字 ...

  4. HDU 2224 The shortest path

    The shortest path Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. POJ 3207

    还是那句话,做2SAT题时,找出矛盾点基本上可解了.这道题也是这样 题意是说给出一个圆上的 n 个点(0~n-1编号),然后在指定的 m 对点之间各连一条线(可以在圆内,也可以在圆外,可以是曲线,这点 ...

  6. Android Studio怎样删除module

    当你想在Android Studio中删除某个module时,大家习惯性的做法都是选中要删除的module.右键去找delete.可是 在Android Studio中你选中module,右键会发现没 ...

  7. mysql选择上一条、下一条数据记录,排序上移、下移、置顶

    1.功能须要 完毕列表排序上移,下移,置顶功能.效果例如以下图所看到的: 2设置思路 设置一个rank为之间戳,通过选择上移,就是将本记录与上一条记录rank值交换,下移就是将本条记录与下一条记录ra ...

  8. 【cocos2d-x 3.7 飞机大战】 决战南海I (十二) 游戏结束场景

    游戏结束的时候,要显示分数.还要可以选择是返回主场景还是退出游戏 // 退出游戏 void menuCloseCallback(cocos2d::Ref* pSender); // 返回主界面 voi ...

  9. SQL SEVER 元年是1900年

    用SQL语句求 本月第一天,怎么写? 可以这样写: SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0); 按照日期函数DATEDIFF的定义,第二个参数是开始日 ...

  10. hdoj--1045--Fire Net(二分图)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...