开始复习爬虫,这里做了一个utllib和正则的小总结,了解一下就好
在Python中有很多库可以用来抓取网页,urllib就是其中的一个库,就是用来抓取网页的,
urllib有几个主要的模块------->request模块,它是urllib最基本的http请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,然后敲击回车键一样,使用的时候只需要给库方法传入相关的URL和相关的参数即可.
error异常处理模块,如果出现请求错误,我们可以使用这个模块来捕获异常,然后进行重试或者其他操作,保证程序不会意外终止.
parse:这是一个工具模块,提供了许多url的处理方法,比如拆分,解析,合并等等.
我们使用urlopen方法发起请求获取响应结果,例: response=request.urlopen(url=url,timeout=20),它有四个主要参数
我们需要知道,如下所示:
url:设置目标url
data:如果设置该参数,则请求默认为post请求
timeout:用于设置超时时间,单位为秒
context:必须是一个ssl.SSLContext类型,用来指定SSL设置,忽略未认证的CA证书,
使用urlopen直接发送请求,获取一些反爬手段低的网站,有些网站会根据请求头来判断是否是浏览器访问,则需要增加HTTP报头,必须创建一个 Request 实例来作为urlopen()的参数;而需要访问的url地址则作为 Request 实例的参数,它也有几个重要的参数,如下所示,
url 参数是请求链接,这个是必传参数,其他的都是可选参数。
data(默认空) 参数跟 urlopen() 中的 data 参数用法相同。
headers(默认空) 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。
unverifiable 参数表示这个请求是否是无法验证的,默认值是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。(这个参数我们不需要设置)
method 参数指的是发起的 HTTP 请求的方式
接下来就是异常处理模块了,我们在发送请求的过程中,如果网络环境不好,或者出现了其他问题,会出现请求异常,如果不处理这些异常,程序很可能会崩溃,所以我们需要处理请求异常问题,报错的话基本都是,URLError:来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理,它具有一个属性reason,返回错误的原因,HTTPError,
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
专门用来处理HTTP请求错误,比如未认证,页面不存在等
有三个属性:
code:返回HTTP的状态码
reason:返回错误原因
headers:返回请求头
这里使用顺序也有所不同,具体使用,因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是先捕获子类的错误,再捕获父类的错误,
再有一个就是parse工具模块了,parse模块下常用的url解析、合并、编码、解码方法,在使用它的时候,我们需要用命令from urllib import parse来导入,接下来介绍它的方法的作用
1,urlencode()将字典构形式的参数序列化为url编码后的字符串
2,parse_qs()将url编码格式的参数反序列化为字典类型,和urlencode()方法相反
3,quote()可以将中文转换为URL编码格式
4,unquote:可以将URL编码进行解码,和quote()方法相反
5,urljoin()传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接
6,urlparse()实现URL的识别和分段(了解),了解下就行,还有就是urlunparse()可以实现URL的构造(了解),了解就行
此外就是urllib的get请求和post请求了, 首先是get请求,例如:
url = "http://www.baidu.com/s"
word = {"wd":"六一儿童节,可我还是单身"}
word = urllib.parse.urlencode(word) #转换成url编码格式(字符串)
newurl = url + "?" + word
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}
request = urllib.request.Request(newurl, headers=headers)
response = urllib.request.urlopen(request)
html = response.read()
print (html)
POST请求,Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对,
from urllib import request,parse
url = 'https://httpbin.org/post'
form_data = {
'className':'1808',
'peopleNum':30,
'names':['zhangsan','lisi','wangwu','zhaoliu']
}
#使用urlencode将上传的表单书数据转换为url编码格式(#className=1808&peopleNum=30.....),
#再将字符串转为bytes类型(使用encode)
b_form_data = parse.urlencode(form_data).encode('utf-8')
print(b_form_data)
#b'className=1808&names=%5B%27zhangsan%27%2C+%27lisi%27%2C+%27wangwu%27%2C+%27zhaoliu%27%5D&peopleNum=30'
response = request.urlopen(url=url,data=b_form_data)
print(response.status)
print(response.read().decode('utf-8'))
再说一个就是urllib的高级用法,设置代理,当我们频繁爬取某个网站的数据时,我们的ip可能会被封,这时候我们就需要用到代理,代理实际上指的就是代理服务器,它的功能是代理网络用户去取得网络信息,形象地说,它是网络信息的中转站,再简单一点说,即使进行ip伪装的,
说说它具体的几个作用吧
1.突破自身IP访问限制,访问一些平时不能访问的站点。
2.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
3.隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。
我们可以自定义代理,也就叫Opener,我们需要使用ProxyHandler处理器用来设置代理,例如:
from urllib import request,error
#构建支持代理的handler
proxy = {
'http':'61.138.33.20:808',
'https':'120.69.82.110:44693',
}
# 构建一个私密代理Handler,需要加上私密代理账户的用户名和密码
# proxy = {
# "http" :"username:password@61.135.217.7:80"
#}
proxy_handler = request.ProxyHandler(
proxies=proxy
)
#根据proxy_handler实例化一个opener对象
opener = request.build_opener(proxy_handler)
# 使用https://httpbin.org/get接口验证使用了代理
# url = 'https://httpbin.org/get'
try:
response = opener.open(url,timeout=5)
# 将自定义的opener设置为全局的opener,之后使用urlopen() 发送请求,都将使用自定义opener对象。
# request.install_opener(opener)
# response = urlopen(request)
print(response.status)
except error.HTTPError as err:
print(err.reason)
except error.URLError as err:
print(err.reason)
还有就是urllib用来设置cookie了,cookie用来做状态保持的,我们获取cookie就需要用到cookiejar库,该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar()
注重介绍下这个库,CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
具体内容看代码:
#快代理登录
from urllib import request,parse,error
from http import cookiejar
import ssl,urllib
def kdl_login(url,data):
# 构建一个CookieJar对象实例来保存cookie
cookie_jar = cookiejar.CookieJar()
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
# handler = request.
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
ssl_context = ssl._create_unverified_context()
https_hancler = urllib.request.HTTPSHandler(context=ssl_context)
# 通过 build_opener() 来构建opener
opener = urllib.request.build_opener(handler,https_hancler)
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
}
response = opener.open(url)
print(response.headers)
print({cookie.name:cookie.value for cookie in cookie_jar})
#####上半部分代码是为了获取登录需要的cookie信息##################
#####下半部分代码是为了获取登录需要的cookie信息##################
data = parse.urlencode(data).encode('utf-8')
print('======',data)
req = request.Request(url=url,data=data,headers=headers,method='POST')
try:
response = opener.open(req)
if response.status == 200:
html = response.read().decode('utf-8')
if '2295808193' in html:
print('登录成功')
print({cookie.name: cookie.value for cookie in cookie_jar})
with open('person.html','w') as file:
file.write(html)
except error.HTTPError as err:
print(err.reason)
except error.URLError as err:
print(err.reason)
if __name__ == '__main__':
data = {
'next':'',
'kf5_return_to':'',
'username': '18518753265',
'passwd': 'ljh123456',
}
url = 'https://www.kuaidaili.com/login/'
kdl_login(url,data)
基本的urllib库使用就是这些