urllib库的使用和URLError

urllib库的使用和URLError

  • urllib库的使用和URLError
    • 其余用法
    • 浏览器模拟——headers属性
      • 方法一
      • 方法二
    • 超时设置
    • HTTP协议请求
      • 六种协议请求
      • GET请求实例
      • POST请求
    • 设置代理服务器
    • 使用debuglog模式
    • 异常处理–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请求实例

百度搜索爬虫,可以看到网页如下:
urllib库的使用和URLError_第1张图片
其中网页链接:

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”,这样我们需要构建的数据就要包括这两个字段值
urllib库的使用和URLError_第2张图片

设置代理服务器

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

登录网页http://www.xicidaili.com/,可以看到很多的免费代理ip
urllib库的使用和URLError_第3张图片

举例:使用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 服务器不支持实现请求所需要的功能

你可能感兴趣的:(python,整理,爬虫)