urllib库的使用和URLError

21 篇文章 0 订阅
3 篇文章 0 订阅

urllib库的使用和URLError

使用urllib.request.urlopen()打开网页

import urllib.request
file=urllib.request.urlopen("http://www.baidu.com")

使用file.read()读取所有网页信息或者file.readline()读取一行

data=file.read()
dataline=file.readline()

也可以使用file.readlines()读取,会得到每行内容组成的列表

其余用法

  • urllib.request.urlcleanup ()可以清理缓存
  • file.info()得到当前环境信息
  • file.getcode()得到网页状态码
  • file.geturl()得到当前爬取的网页名称
  • urllib.request.quote()用于对不标准字符网页编码
  • urllib.request.unquote()上面的反过程

浏览器模拟——headers属性

当爬取一些网页的时候,会出现403错误,因为有防止爬取的反爬虫机制。

可以通过设置headers信息模拟浏览器登录爬取
通过浏览器查看headers,如下:
这里写图片描述

Referer: https://blog.csdn.net/weixin_38312031/article/details/80870261
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36

其中,User-Agent对应的就是模拟浏览器需要的信息

方法一

使用build_opener()修改报头

import urllib.request

url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
headers=("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).readlines()

方法二

使用urllib.request.Request()下的add_header()实现浏览器模拟

import urllib.request

url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
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/67.0.3396.62 Safari/537.36")
data=urllib.request.urlopen(req).read()
print(data)

超时设置

访问一个网页,如果长时间未响应,则认为页面超时,无法打开网页。
设置timeout

import urllib.request
url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
for i in range(1,100):
    try:
        file=urllib.request.urlopen(url,timeout=1)
        data=file.read()
        print(len(data))
    except Exception as e:
        print("异常:"+e)    

HTTP协议请求

六种协议请求

六种协议:
- GET请求:GET请求在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,表单中的信息会转化为URL地址中的数据,通过URL地址传递
- POST请求:可以向服务器提交数据,是主流的比较安全的数据传递方式。
- PUT请求:请求服务器存储一个资源,通常要指定存储的位置
- DELETE请求:请求服务器删除一个资源
- HEAD请求:请求获取对应的HTTP报头信息
- OPTIONS请求:获得当前URL支持的请求类型

GET请求实例

百度搜索爬虫,可以看到网页如下:
这里写图片描述
其中网页链接:

https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd=爬虫

可以看到关键字就是wd=后的东西,所以可以使用https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd=关键字进行GET请求得到要的数据

import urllib.request
key="hello"
url="https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd="+key
file=urllib.request.urlopen(url)
data=file.read()

POST请求

比如网页要提交的姓名框对应的name属性值为“name”,密码对应的输入框中name属性值为“password”,这样我们需要构建的数据就要包括这两个字段值
这里写图片描述

设置代理服务器

当一直使用一个ip去爬取同一个网站上的网页时,容易被服务器屏蔽,这个时候可以使用代理服务器

登录网页http://www.xicidaili.com/,可以看到很多的免费代理ip
这里写图片描述

举例:使用ip地址222.185.23.130,端口6666

def use_proxy(proxy_addr,url):
    import urllib.request
    proxy=urllib.request.ProxyHandler({"http":proxy_addr})
    opener=urllib.request.build_opener(proxy,urrlib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    data=urllib.request.urlopen(url).decode("utf-8")
    return data

proxy_addr="222.185.23.130:6666"
data=use_proxy(proxy_addr,"http://www.baidu.com")

使用debuglog模式

在使用urllib.request.HTTPHandler和urllib.request.HTTPSHandler时,设置参数 redebuglevel=1即可

这样可以在代码跑的过程中输出对应的log调试日志

异常处理–URLError

主要的两个类:URLError类和其子类HTTPERROR
举例:

import urllib.request
import urllib.error

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

URLError主要有以下三种情况:

  • 连接不上服务器
  • 远程URL不存在
  • 无网络
  • 触发了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 Server Error 服务器内部错误
  • 501 Not Implemented 服务器不支持实现请求所需要的功能
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值