菜菜之Urllib&URLErr

Urllib库是python提供的一个用于操作URL的模块,在爬取网页时,需要经常用到这个库,一般来说,url标准库只会允许一部分ASCII字符,如数字、字母、部分符号等,而其他的有的字符,比如汉字,是不符合URL标准的,因此需要对URL进行编码才可以解决。由于urlopen()不支持一些HTTP的高级功能,所以我们要修改报头,可以使用urllib.request.build_opener()进行,同时也可以使用rullib.request.Request()下的add_header()实现浏览器模拟
在程序实现中难免发生异常,因此应该多用import urlerrortry except结构

PS:文末附常用打开文件的模式列表、以及python如何在代码中换行的几种方式

Urllib库:

Urllib是python内置的HTTP请求库
包括以下模块
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse 解析模块
urllib.robotparser robots.txt解析模块
附不错的urllib库解释
[https://www.cnblogs.com/zhaof/p/6910871.html]

使用urllib.request进行操作

在这里插入图片描述
爬取百度。
注:读取文件常见的有三种方式:
file.read()读取文件的全部内容,把读取的内容赋给一个字符串变量。
file.readlines()读取文件的全部内容,读取的内容赋给一个列表变量(推荐)。
file.readline()读取文件一行内容

使用text,open()+'w’覆盖写入文档
.write()写入内容
在电脑中写入一个html文档
在电脑中写入一个html文档。

使用urllib.request里的urlretrieve()函数将对应信息直接写入本地文档

在这里插入图片描述
注:写入绝对路径的时候,只能用/而不能用\,会报错。
该函数写入时会产生缓存,可使用urllib.request.urlcleanup()清除缓存。

浏览器的模拟–headers属性

有的网页并不允许爬取,会出现403错误,有的网页会进行一些反爬虫设置。因此可以设计一些header信息,模拟成浏览器来访问这些网站。
可以通过baidu网页的打开,按F12,打开里面的network,点击百度的搜索操作,找右侧network一栏,找到 User-Agent一栏 ,copy,如下列内容:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400
可以使用两种爬虫模拟浏览器访问网页。
1、使用build_opener()修改报头
发现照着书有bug ,以后再补

import urllib.request
url="http://blog.csdn.net/weiwei_pig/article/details/51178226"
headers=("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36\
         (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()

2、使用add_header()添加报头
测验无bug

import urllib.request
url="http://blog.csdn.net/weiwei_pig/article/details/51178226"
req=urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/9.6.12513.400')
data=urllib.request.urlopen(req).read()
fhandle=open("E:/PyDev/pythonWeb/3.html","wb")
fhandle.write(data)
fhandle.close()

超时设置

有时候访问网页网页会长时间未响应,那么系统会判断网页超时,即无法打开网页,有时候我们需要需要根据自己的需求来设置超时的时间值。比如,可以将timeout值设置为1

import urllib.request
for i in range(1,100):
    try:
        file=urllib.request.urlopen("http://yum.iqianyue.com",timeout=1)
        data=file.read()
        print(len(data))
    except Exception as e:
        print("出现异常-->"+str(e))

HTTP协议请求

1、GET请求
爬取中文的get请求

import urllib.request
from pywin.scintilla.keycodes import key_code_to_name
url="http://www.baidu.com/s?wd="
key="韦玮老师"
key_code=urllib.request.quote(key)
print(key_code)
url_all=url+key_code
req=urllib.request.Request(url_all)
print(req)
data=urllib.request.urlopen(req).read()
fh=open("E:/PyDev/pythonWeb/5.html","wb")
fh.write(data)
fh.close()

ps:爬取英文的GET请求比中文简单,可以省去中文编码那一步
#urllib.rquest.quote()
爬取网页需要获得URL、keyword、urllib.requet.Request()发出请求链接,并且将链接读取,urllib.request.open(urlwd).read(),写入
2、POST请求
使用爬虫通过POST表单传递信息
在这里插入图片描述

3、PUT请求
4、DELETE请求
5、HEAD请求
6、OPTIONS请求

代理服务器设置

有时使用同一个IP去爬取同一个网站的网页,久了之后会被服务器屏蔽。代理服务器可以很好的解决此问题
可以百度代理服务器,尽量找到验证时间比较短的代理服务器
代码见书本

DebugLog

https://blog.csdn.net/qq_32252917/article/details/79074219
handler类型的用法

URLError处理

一个小小的实例,书上说会出现forbidden可是实际实验发现可以打开ye,并没有出现403错误…orz

  import urllib.request
    import urllib.error
    try:
        s=urllib.request.urlopen("http://blog.csdn.net")
        print(s)
    except urllib.error.URLError as e:
        print(e.code)
        print(e.reason)

改进之后:

import urllib.request
import urllib.error
try:
    s=urllib.request.urlopen("http://blog.baidusss.net")
except urllib.error.URLError as e:
    if hasattr(e,"code"):
        print(e.code)
    if hasattr(e,"reason"):
        print(e.reason)

一般来说,产生URLError的原因有以下几种可能:
1、连接不上服务器
2、远程URL不存在
3、无网络
4、触发了HTTPError
常见的状态码及含义:
200 OK 一切正常
301 Moved Permanently 重新定向到新的URL 永久性
302 Found 重新定向到临时的URL
304 Not Modified 请求的资源未更新
400 Bad Request 非法请求
401 Unauthorized 未经授权
403 Forbidden 禁止访问
404 Not Found 没有找到对应界面
500 Internal Sever Error 服务器内部出现错误
501 Not Implemented 服务器不支持实现所需要的功能

模式 描述 t 文本模式 (默认)。 x 写模式,新建一个文件,如果该文件已存在则会报错。 b 二进制模式。

  • 打开一个文件进行更新(可读可写)。 U 通用换行模式(不推荐)。 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

Python中一般是一行写完所有代码,如果遇到一行写不完需要换行的情况,有两种方法:
1.在该行代码末尾加上续行符“ \”(即空格+\); test = ‘item_one’ \ ‘item_two’ \ ‘tem_three’ 输出结果:‘item_oneitem_twotem_three’
2.加上括号,() {} []中不需要特别加换行符: test2 = ('csdn ’ ‘cssdn’) 输出结果:csdn cssdn

if…and: if (where there is a will and there is a way) 多次未输出结果

test3 =(‘Hello’ ’ ’ ‘world’) 输出结果:Hello world

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值