爬⾍常⽤的urllib库知识点
urllib 库
urllib 库是 Python 中⼀个最基本的⽹络请求库。它可以模仿浏览器的⾏为向指定的服务器发送请求,同时可以保存服务器返回的数据。urlopen()
在 Python3 的 urllib 库中,所有和⽹络请求的相关⽅法都被集中到quest模块下了。以下是urlopen()⽅法最基本的使⽤⽅法:
from urllib import request
resp = request.urlopen('www.baidu')
ad())
上⾯的代码执⾏完毕后在终端会打印出百度⾸页的源代码。
urlopen()⽅法可以写两个参数(常⽤的):
url:请求的 url
data:请求的 data,如果设置了这个值,那么将变成 post 请求
urlopen()⽅法的返回值是⼀个http.client.HPPTResponse对象,这个对象是⼀个类⽂件句柄对象。有read(size)、readline()、readlines()以及getcode()等⽅法。
urlretrieve()
这个⽅法可以⽅便的将⽹页上的⼀个⽂件保存到本地。以下代码可以⾮常⽅便的将百度的⾸页下载到本地:
from urllib import request
request.urlretrieve('www.baidu/', 'baidu.html')
urlencode()
若 ulr 中包含了中⽂或其他特殊字符,则浏览器会⾃动给我们进⾏编码。要⽤爬⾍模拟浏览器,就需要进⾏⼿动编码,此时就要⽤到urlencode()⽅法来实现。这个⽅法可以把字典数据转换为 url 编码的数据。例如:
from urllib import parse
url = 'www.baidu/s'
params = {"wd": "教学设计"}
qs = parse.urlencode(params)
url = url + "?ie=UTF-8&&" + qs
print(qs)
print(url)
resp = request.urlopen(url)
ad())
parse_qs()
此⽅法可以将经过编码后的 ulr 参数进⾏解码。例如:
from urllib import parse
params = {'name': '⽊易', 'age': '21', 'sex': 'male'}
qs = parse.urlencode(params)
result = parse.parse_qs(qs)
print(result)
urlparse() 和 urlsplit()
这两个⽅法⽤来对 url 的各个组成部分进⾏分割。最后可以⼀次性拿到全部的 url 组成部分,也可以单独拿出某个部分。例如:
from urllib import parse
url = 'baike.baidu/item/hello%20world/85501?fr=aladdin#2_13'
result = parse.urlparse(url)
print(result) //拿出全部
// 分别拿出各个部分
print('scheme:', result.scheme)
print('netloc:', resultloc)
python 爬虫教学
print('path:', result.path)
print('params:',result.params)  // urlsplit() ⽅法没有此项结果
print('query:', result.query)
print('fragment:', result.fragment)
request.Request 类
如果想要伪装爬⾍,就要在请求的时候增加⼀些请求头,那么就必须使⽤request.Request类来实现,⽐如下⾯请求拉勾⽹的这段代码:
from urllib import request, parse
url = 'www.lagou/jobs/positionAjax.json?px=default&gx=%E5%85%A8%E8%81%8C&needAddtionalResult=false&isSchoolJob=1'
// 这⾥的 User-Agent 和 Referer 参数是我先⽤ Chrome 访问再⽤F12检查得到的,下⾯的 data 也是
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Referer': 'www.lagou/jobs/list_Go?px=default&gx=%E5%85%A8%E8%81%8C&gj=&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD'
}
data = {
'first': 'true',
'pn': 1,
'kd': 'python'
}
req = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method='POST')
resp = request.urlopen(req)
ad().decode('utf-8'))
ProxyHandler 处理器(代理设置)
许多⽹站会检测某⼀时间段某个 IP 的访问次数(通过流量统计,系统⽇志等),如果访问次数多得不像正常⼈,它会禁⽌这个 IP 的访问。所以我们可以设置⼀些代理服务器,每隔⼀段时间换⼀个代理,就算 IP 被禁⽌,依然可以换个 IP 继续爬取数据。
urllib 中通过 ProxyHandler 来设置使⽤代理服务器,下⾯代码说明如何使⽤⾃定义 opener 来使⽤代理:
from urllib import request
# 未使⽤代理
url = '/ip'
resp = request.urlopen(url)
ad())
# 使⽤代理
# 1.使⽤ ProxyHandler,传⼊代理构建⼀个handler
handler = request.ProxyHandler({"https": "183.163.40.223:31773"})
# 2.使⽤上⾯创建的handler构建⼀个opener
opener = request.build_opener(handler)
# 3.使⽤opener发送⼀个请求
resp = opener.open(url)
ad())
cookie
HTTP请求是⽆状态的,所以即使第⼀次和服务器连接并登录成功后,第⼆次请求服务器依然不知道当前请求是哪个⽤户。cookie 的出现就是为了解决这个问题,第⼀次登陆后服务器返回⼀些数据给浏览器,然后浏览器保存在本地,当该⽤户发送第⼆次请求的时候,就⾃动将上次请求存储的 cookie 数据⾃动携带给服务器,这样服务器就可以通过浏览器携带的数据来判断当前⽤户⾝份了。cookie 存储的数据量有限,不同浏览器有不同的存储⼤⼩,但⼀般不超过4KB。
cookie 的格式:
Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。