欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫基础---urllib库的使用(获取网页信息)

程序员文章站 2022-03-02 20:26:19
...
  • 本文主要包括三个方面
    • 请求模块 urllib.request
    • 解析模块 urllib.parse
    • 异常处理模块 urllib.error

请求模块 urllib.request

1. urllib.request.urlopen
urllib.request.urlopen(url,data = None,timeout=None)
常见的三个参数–url,data,timeout

url参数

import urllib.request
response=urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))#用返回获取响应的内容

data参数

–get请求,不需要添加data参数(请求数据可以放在请求的url结尾)
–post请求,一定要注意对传递的数据进行url编码

import urllib.request
import urllib.parse

#对data参数进行编码
data=bytes(urllib.parse.urlencode(
    {'word':'hello'},encoding='utf-8',
    ) 
res=urllib.request.urlopen('http://www.baidum.com',data=data)

timeout参数

作用:有时候网络不稳定或者服务器异常,避免为了让程序一直等待,可以对请求进行超时设置

import urllib.request
res=urllib.request.urlopen('http://www.baidu.com',timeout=3)#timeout的单位为秒;若出现超时,会返回socket.timeout
print(res.read())

注意:
res.getheaders()—得到响应头
res.status—得到状态码
res.read()—-得到响应文本(二进制的bytes字节组)

2. urllib.request.Request
urllib.request.Request(url,data = None,headers = {},,method = None )

data 同上

headers参数

设置目的:进行的简单的反爬虫策略

#方法1--以字典键值对方式
import urllib.request
import urllib.parse

headers={'User-Agent':'xxxxx'}
url='http://httpbin.org/post'#一定要注意,通过post方式发出请求,所对应的url一定要能接受传递的参数
dic={'name':'xiaoming'}
data=bytes(urllib.parse.urlencode(dic),encoding='utf-8')#数据进行编码
req=request.Request(url=url,data=data,headers=headers,method='POST')#包装请求
res=urllib.request.urlopen(req)
print(res.read().decode('utf-8'))

#方法2--利用add_headers方法
import urllib.request
import urllib.parse
url='http://httpbin.org/post'
d={'name':'xiaoming'}
data=bytes(urllib.parse.urlencode(d),encoding='utf-8')#数据进行编码
req=request.Request(url=url,data=data,method='POST')
req.add_headers('User-Agent','xxxxx')#该方法可以自定义请求头字典,然后循环遍历
res=urllib.request.urlopen(req)
print(res.read().decode('uft-8))

3. urllib.request.ProxyHandler

作用:设置IP代理,模仿程序所发的多个请求来源于不同的IP地址(反爬策略之一)

import urllib.request

#建立proxy处理器对象
proxy_handler=urlllib.request.ProxyHandler(
{'http':'http://xxxx:port',
'https':'https:/xxxx:port',})
#创建opener实例,参数为proxy处理器对象
opener=urllib.request.build_opener(proxy_handler)
#使用代理ip的opener打开指定状态的URL
res=opener.open('http://httpbin.org/get')
print(res.read())

4. urllib.request.HTTPCookieProcessor

作用:cookie中保存来登录的信息,发出请求时携带cookie信息访问(http.cookiejar获取及储存cookie)

获取cookie

import http.cookiejar
import urllib.request

#建立cookiejar实例
cookie=http.cookiejar.CookieJar()
#建立cookie处理器对象
handler=urllib.request.HTTPCookieProcessor(cookie)
#创建opener实例,参数为handler
opener=urllib.request.build_opener(handler)
#使用open函数打开url
res=opener.open('http://www.baidu.com')
#输出在浏览器中的cookie信息
for item in cookie:
    print(item.name+'='+item.value)

存储cookie

import http.cookiejar
import urllib.request

filename='cookie.txt'
#建立cookiejar子类对象
cookie=http.cookiejar.MozillaCookieJar(filename)
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
res=opener.open('http://www.baidu.com')
#保存到文件
cookie.save(ignore_discard=True,ignore_expires=True)

从文件中获取cookie

import http.cookiejar,urllib.request

cookie=http.cookiejar.MozillaCookieJar()
cookie,load('cookie.txt',ignore_discard=True,ignore_expires=True)
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
res=opener.open('http://www.baidu.com')
print(res.read().decode('utf-8'))

解析模块 urllib.parse

1.urllib.parse.urlencode
urllib.parse.urlencode(query,doseq = False,safe =”,encoding =
None,errors = None,quote_via = quote_plus )

为post生成数据,如上

为url生成查询字符串

import urllib.request
import urllib.parse

params=urllib.parse.urlencode(
{"name":"sun","age":25})
base_url="http://www.baidu.com?"
print(base_url+params)
#打印结果
#http://www.baidu.com?name=sun&age=25

2.urllib.parse.urlparse
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True) 对url进行拆分

import urllib.parse

res=urllib.parse.urlparse('http://www.baidu.com')
print(res)
#返回的结果包括的协议名,域名,目录路径,参数等
# ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='')

3.urllib.parse.urljoin
对url进行拼接

res=urllib.parse.urljoin('http://www.baidu.com','FAQ.html')
print(res)
#http://www.baidu.com/FAQ.html

异常处理 urllib.error

1.urllib.error.URLError(基本异常)–一个属性
reason:即抓取异常时,只能的打印错误信息

2.urllib.error.HTTPError(URLError的子类)–三个属性
code:打印出现异常时的状态码
reason:打印解释此错误错误的字符串 headers:打印导致该问题的HTTP请求的HTTP响应标头

import urllib.error
import urllib.request

try:
    res=urllib.request.urlopen('http://www.baidu.com')
    print(res.read())
except urllib.error.URLError as e:
    print(e.reason)
except urllib.error.HTTPError as e:
    print(e.code)
相关标签: spider