一、随时随地爬取一个网页下来

  怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等。Chrome F2可以看到网页源码。

css用于网页背景,控件位置,文本粗细等样式布局,js(javascript)相对于静态的css是一种动态的概念,可以跟用户交互,例如单击后弹窗,文本提示,日期控件等,html主要用于信息的展示,文字

图片,链接等,这是我们要爬取的内容。现在我们使用Python的Urllib库写个脚本开始爬取网页。

二、Python Urllib库的基本使用

1)urllib.request.urlopen()方法

 import urllib.request

 response = urllib.request.urlopen('http://www.baidu.com/')
print(response.read())
response = urllib.request.urlopen('http://www.baidu.com/')
urlopen方法传递了一串字符串"http://www.baidu.com/",这个参数代表请求的目标链接地址,结果返回一个urllib.response对象。


2)Urllib.request.Request()对象

 import urllib.request

 request = urllib.request.Request('http://www.baidu.com/')

 response = urllib.request.urlopen(request)

 print(response.read())
request = urllib.request.Request('http://www.baidu.com/')
response = urllib.request.urlopen(request)

urlopen()方法不仅支持传递url字符串,还支持一个urllib.request.Request对象。对于Python urllib.request模块的urlopen()方法,官方有这样一句话Open the URL url, which can be either a string or a Request object.
   意思是说urlopen可以接受字符串格式的url或者一个Request对象(具体请移步官方文档,urllib.request
   这里声明了一个Request对象,并作为参数传递给urlopen方法。


3)GET和POST请求方式

POST请求方式

 import urllib.request
import urllib.response
import urllib.parse params = {"t": "b", "w": "Python urllib"}
params = urllib.parse.urlencode(params) # urlencode会将dict格式参数拼接并编码 w=Python+urllib&t=b
data = params.encode('ascii') # 字符串转换为字节(bytes)b'w=Python+urllib&t=b
request = urllib.request.Request('http://zzk.cnblogs.com/s', data=data)
response = urllib.request.urlopen(request)
print(response.read())

GET请求方式

 import urllib.request
import urllib.response
import urllib.parse params = {"t": "b", "w": "Python urllib"}
params = urllib.parse.urlencode(params) # urlencode会将dict格式参数拼接并编码 w=Python+urllib&t=b
url = "http://zzk.cnblogs.com/s?%s" % params # 参数urlencode编码并拼接到请求url后面
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
print(response.read())

4)响应内容编码

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com/')
print(response.read().decode('utf-8'))

response.read()返回byte字节格式数据,无法直接读懂,需要进行编码,通常使用UTF-8进行编码。通过字符串的decode('utf-8')方法进行解码,上面的代码调整为response.read().decode('utf-8'),这样我们就能像在浏览器上

一样看懂返回的信息。

三、Python Urllib库的高级使用

1)请求头Headers

 import urllib.request
import urllib.response
import urllib.parse params = {"t": "b", "w": "Python urllib"}
params = urllib.parse.urlencode(params) # urlencode会将dict格式参数拼接并编码 w=Python+urllib&t=b
data = params.encode('ascii') # 字符串转换为字节(bytes)b'w=Python+urllib&t=b
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
request = urllib.request.Request('http://zzk.cnblogs.com/s', data=data, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
request = urllib.request.Request('http://zzk.cnblogs.com/s', data=data, headers=headers)

Headers是字典类型,比较常见的请求头是User-Agent,可以认为是浏览器的一个身份认证,一些HTTP服务器只会接受来自浏览器的请求,例如“Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110                 Safari/537.36,如果不为指定User-Agent,请求会默认带上Python Urllib的User Agent  “Python-urllib/2.6” ,有可能请求会被服务器拒绝。

可以通过传递字典类型的请求头Headers,还可以通过request对象的方法add_header(key,val)设置请求头,

request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')

还有Request.full_url、Request.get_full_url()、Request.get_header()、Request.has_header()等实用的属性和方法 (详细请查看官方Request Object)

2)代理设置Proxy和HTTP Authentication

 import urllib.request
import urllib.response
import urllib.parse proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password(realm='realm', uri='http://wwww.example.com:3128/', user='username', passwd='password') opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
urllib.request.build_opener(opener)
response = urllib.request.urlopen('http://www.baidu.com') # 向代理服务器www.example.com:3128发送请求,代理服务器接收请求并转发请求给www.baidu.com服务器
print(response.read().decode('utf-8'))

HTTP代理本质上是一个Web应用,它和其他普通Web应用没有根本区别。HTTP代理收到请求后,根据Header中Host字段的主机名和Get/POST请求地址综合判断目标主机,建立新的HTTP请求并转发请求数据,并将收到的响应数据转发给客户端。如果请求地址

是绝对地址,HTTP代理采用该地址中的Host,否则使用Header中的HOST字段。

3)超时设置Timeout

方法一、设置单个请求超时时间:

 import urllib.request

 timeout = 2  # set timeout 2 seconds
response = urllib.request.urlopen('http://www.baidu.com/', timeout=timeout)
print(response.read().decode('utf-8'))

方法二、设置全局请求超时时间:

 import urllib.request
import urllib.parse
import urllib.error
import socket socket.setdefaulttimeout(60) # 设置全局超时时间 params = {"t": "b", "w": "Python urllib"}
params = urllib.parse.urlencode(params) # urlencode会将dict格式参数拼接并编码 w=Python+urllib&t=b
url = "http://zzk.cnblogs.com/s?%s" % params # 参数urlencode编码并拼接到请求url后面
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

四、Python Urllib库的实际应用

1)请求失败重试

 # 请求失败,默认重试2次
def download(url, user_agent='wswp', num_retries=2):
if url is None:
return None
print('Downloading:', url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
request = urllib.request.Request(url, headers=headers)
try:
html = urllib.request.urlopen(request).read().decode('utf-8')
except urllib.error.URLError as e:
print('Downloading Error:', e.reason)
html = None
if num_retries > 0:
if hasattr(e, 'code') and 500 <= e.code < 600:
# retry when return code is 5xx HTTP erros
return download(url, num_retries - 1)
return html

Python爬虫基础之Urllib的更多相关文章

  1. 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)

    一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...

  2. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  3. python爬虫-基础入门-python爬虫突破封锁

    python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...

  4. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  5. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  6. Python爬虫基础之requests

    一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前 ...

  7. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  8. Python爬虫基础之认识爬虫

    一.前言 爬虫Spider什么的,老早就听别人说过,感觉挺高大上的东西,爬网页,爬链接~~~dos黑屏的数据刷刷刷不断地往上冒,看着就爽,漂亮的校花照片,音乐网站的歌曲,笑话.段子应有尽有,全部都过来 ...

  9. python 爬虫基础知识一

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...

随机推荐

  1. ORA-01578 data block corrupted 数据文件损坏 与 修复 (多为借鉴 linux)

    好吧,先说说造成崩溃的原因: 使用redhat 5.9 Linux 作为数据库服务器, 周五数据库正在使用中,硬关机造成数据库文件部分损坏(周一上班时,应用程序启动不起来,查看日志文件时,发现一个数据 ...

  2. mysql 5.7 json

    项目中使用的mysql5.6数据库,数据库表一张表中存的字段为blob类型的json串数据.性能压测中涉及该json串处理效率比较低,开发人员提到mysql5.7版本后json串提供了原生态的json ...

  3. CodeForces 280B Maximum Xor Se

    题目链接:http://codeforces.com/contest/280/problem/B 题目大意: 给定一个由n个数组成的一个序列,s[l..r] (1 ≤ l < r ≤ n)代表原 ...

  4. 其它综合-CentOS7 忘记root密码

    CentOS7 忘记root密码 长时间不用的 CentOS 机器再次开机的时候忽然忘记了密码,总不能就重装一台吧,还有好多服务在机器上,于是决定重置root的密码. 如果是已经开启的机器,需要进行关 ...

  5. Tensorflow集成接口TensorLayer、Keras

    https://www.zhihu.com/question/50030898 https://zhuanlan.zhihu.com/p/25296966 https://www.jiqizhixin ...

  6. stop()在animate中的用法

    stop 是jQuery中用于控制页面动画效果的方法.运行之后立刻结束当前页面上的动画效果.stop在新版jQuery中添加了2个参数:第一个参数的意思是是否清空动画序列,也就是stop的是当前元素的 ...

  7. 动态dp学习笔记

    我们经常会遇到一些问题,是一些dp的模型,但是加上了什么待修改强制在线之类的,十分毒瘤,如果能有一个模式化的东西解决这类问题就会非常好. 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y ...

  8. beam 的异常处理 Error Handling Elements in Apache Beam Pipelines

    Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...

  9. COGS 2353 2355 2356 2358 有标号的DAG计数

    不用连通 枚举入度为0的一层 卷积 发现有式子: 由$n^2-i^2-(n-i)^2=2*i*(n-i)$ 可得$2^{i*(n-i)}=\frac{{\sqrt 2}^{(n^2)}}{{\sqrt ...

  10. (四)窗口mainwindow

    常用控件: lable: 可以放文本,图片,动态图片,链接 Text Edit: 富文本编辑框:多行文本,HTML,图片 Line Edit:  只能放一行 Plain Edit: 只能显示多行文本 ...