urllib
**request:**他是最基本的HTTP请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,然后敲击回车键一样,使用的时候只需要给库方法传入相关的url和相关的参数即可。
**error:**异常处理模块,如果出现请求错误,我们可以使用这个模块来捕获异常,然后进行重试或者其他操作,保证程序不会意外终止。
parse: 这是一个工具模块,提供了许多url的处理方法,比如拆分,解析,合并等等.
**url:**设置目标url
**data:**如果设置该参数,则请求默认为post请求
**timeout:**用于设置超时时间,单位为秒
**context:**必须是一个ssl.SSLContext类型,用来指定SSL设置,忽略未认证的CA证书。
**URLError:**来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
产生的原因主要有:
*没有网络连接
*服务器连接失败
*找不到指定的服务器
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
专门用来处理HTTP请求错误,比如未认证,页面不存在等
有三个属性:
* code:返回HTTP的状态码
* reason:返回错误原因
* headers:返回请求头
urlopen方法的使用# 导入urllib.request 库
import urllib.request
向指定的url发送请求,并返回服务器响应的类文件对象
response = urllib.request.urlopen("http://www.baidu.com")
print(type(response))
类文件对象支持文件对象的操作方法,
如read()方法读取文件全部内容,返回
字符串(注意我们在使用read()获取响应
结果的时候,执行一次后,下次在执行就没有数据了)
html = response.read()
#打印响应结果(betys类型)
print (html)
打印状态码
print (response.status)
获取响应头
print (response.getheaders())
获取响应头信息
print (response.getheader('Server'))
#获取响应结果原因
print (response.reason)
parse.urlencode():将字典类型的参数转为url编码格
parse.parse_qs():将url编码格式的字符串转化为字典类型
parse.quote()将中文字符转为url编码的字符
parse.unquote()将url编码的字符转换为中文字符
parse.urljoin将不完整的url参照基类url,拼接完整
from urllib import parse
#parse.urlencode():将字典类型的参数转为url编码格
data = {
‘username’:‘xxx’,
‘password’:‘abc’
}
data = parse.urlencode(data)
print(data)
#parse.parse_qs():将url编码格式的字符串转化为字典类型
data = parse.parse_qs(data)
print(data)
#中文
#parse.quote()将中文字符转为url编码的字符
#wd=%E7%BE%8E%E5%A5%B3
wd="美女"
wd = parse.quote(wd)
print(wd) #%E7%BE%8E%E5%A5%B3
#parse.unquote()将url编码的字符转换为中文字符
wd = parse.unquote(wd)
print(wd) #美女
#parse.urljoin将不完整的url参照基类url,拼接完整
base_url = 'http://www.baidu.com/?wd=xxx'
sub_url = '?page=1&pagesize=10'
full_url = parse.urljoin(base_url,sub_url)
print(full_url) #http://www.baidu.com/?page=1&pagesize=10
Request
import urllib.request
headers = {"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",}
#url作为Request()方法的参数,构造并返回一个Request对象
request = urllib.request.Request(url="http://www.baidu.com",headers=headers) # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
response = urllib.request.urlopen(request)
#将获取到的页面源码,转为字符串
html = response.read().decode('utf-8')
print (html)
urllib get请求
from urllib import request
#发起请求
#url,目标url地址
#date = None,默认为none,表示是一个get请求,反之为post请求
#headers = {}:请求头
headers = {
'User_Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}
req = request.Request(
'https://www.baidu.com',
headers=headers
)
#timeout=socket.GLOBAL_DEFAULT_TIMEOUT,设置请求超时时间
#certificate verify failed 证书错误
#context = None,表示忽视ssl认证
import ssl
context = ssl._create_default_https_context()
#response = request.urlopen(url='https://www.baidu.com',timeout=10,context=context)
response = request.urlopen(
req,timeout=10,
context=context
)
code = response.code
content = response.read()
headers = response.headers
print(code,len(content),headers)
urllib post请求
拉钩网post请求
from urllib.parse import urlencode
from urllib import request,error
def lagouSpider():
keyword = 'java'
# 构建url发起请求
req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
#构建post请求的表单数据
form_data = {
'first': 'false',
'pn': '1',
'kd': keyword,
}
#将表单数据转为url编码格式的二进制数据
data_trandfrom = urlencode(form_data).encode('utf-8')
#构建一个请求头
req_header = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput=',
}
#构建一个request对象
req = request.Request(url=req_url,data=data_trandfrom,headers=req_header)
try:
#发起请求
response = request.urlopen(req)
print(response.status)
#做一个判断,请求成功,在这里做数据的处理
if response.status == 200:
html = response.read().decode('utf-8')
print('请求成功',html)
except error.HTTPError as err:
print('请求出错',err.code,err.reason,err.headers)
except error.URLError as err:
print('请求出错', err.reason)
if name == ‘main’:
lagouSpider()
urllib设置代理
代理的作用:
1.突破自身IP访问限制,访问一些平时不能访问的站点。
2.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
3.**隐藏真实IP:**上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。
urllib设置cookie
Cookie
是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie原理
HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性
cookiejar库 和 HTTPCookieProcessor处理器在Python处理
Cookie,一般是通过cookiejar模块和 urllib模块的HTTPCookieProcessor处理器类一起使用。
ookiejar模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
正则
. 匹配除换行之外的任意字符
\d 匹配数字0-9 => [0-9] => ^\D
\D 匹配非数字
\s 匹配空白字符(空格 \n \r \t)
\S 匹配非空白字符
\w 匹配单词字符[a-zA-Z0-9_]
\W 匹配非单词字符
^ 以……开头
$ 以……结尾
[0-9a-z] :表示匹配数字0-9,字母a-z
[^a-z] :不匹配a-z之间的字符
- 匹配*号前的字符任意次数
- 匹配+号前的字符至少一次
?匹配?号前的字符0-1次
#多字符匹配,非贪婪模式 (abcdeabcde)
*?
+?
??
| 或
() 分组
compile 方法: 将正则表达式的字符串形式编译为一个 Pattern 对象
**match 方法:**从起始位置开始匹配符合规则的字符串,单次匹配,匹配成功,立即返回Match对象,未匹配成功则返回None
**search 方法:**从整个字符串中匹配符合规则的字符串,单次匹配,匹配成功,立即返回Match对象,未匹配成功则返回None
**findall 方法:**匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表
**finditer 方法:**匹配所有合规则的字符串,匹配到的字符串放到一个列表中,匹配成功返回
**split 方法:**根据正则匹配规则分割字符串,返回分割后的一个列表
**sub 方法:**替换匹配成功的指定位置字符串