爬虫urllib、正则

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 方法:**替换匹配成功的指定位置字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值