
总目标:七大步
学习的内容:(urllib.request库)urlopen
from urllib import request
resp = request.urlopen('http://www.baidu.com/')
print(resp.read())
实现了把百度的页面()打开,并读(显示)出来
学习的内容:(urllib.request库)urlretireve
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
request.urlretrieve('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606748871478&di=b3ff99f2d55d4ff82970348f6dbf0d7c&imgtype=0&src=http%3A%2F%2Fpics0.baidu.com%2Ffeed%2F377adab44aed2e73a623b15eeb48d48c86d6fa4e.jpeg%3Ftoken%3D9eb40241eef2d7fc979e3310ad80e0c4', 'yileina.jpg')
实现了下载百度的页面()和依蕾娜的图片,并保存到本地

百度网页源代码

依蕾娜
学习的内容:(urllib.parse库)urlencode 和 (urllib.parse库)parse_qs
from urllib import parse
params = {'name':'筱团','age':18,'do what':'reptile'}
result = parse.urlencode(params) # 编码
print(result)
result = parse.parse_qs(result) # 解码
print(result)
打印如下(第一行是编码完后的结果,第二行是重新解码后的结果):
name=%E7%AD%B1%E5%9B%A2&age=18&do+what=reptile
{'name': ['筱团'], 'age': ['18'], 'do what': ['reptile']}
实现了编码和解码的功能,将中文参数转换成可用于使用的编码,并再将其转换回来(注意转换回来后键(左边)对应的值(右边)是列表的形式)
以上内容综合运用(urlopen、urlretireve、urlencode)
from urllib import request
from urllib import parse
# 目标 : http://www.baidu.com/s?wd=筱团
url = 'http://www.baidu.com/s'
params={'wd':'筱团'}
qs=parse.urlencode(params)
url=url+'?'+qs
# 打印 : http://www.baidu.com/s?wd=%E7%AD%B1%E5%9B%A2
request.urlretrieve(url,'xiaotuan.html')
resp=request.urlopen(url)
print(resp.read())
实现了读(显示)并下载了自己的百度页面()

我搜我自己

返回的源代码
学习的内容:(urllib.parse库)urlparse(和几乎一样的 urlsplit)
from urllib import parse
url = 'https://www.baidu.com/s?wd=python#1'
result = parse.urlparse(url)
print(result) # 打印全部
print(result.scheme) # 只打印访问协议
打印如下:
ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=python', fragment='1')
https
URL 各部分解析:

url 各部分解析

urlparse 和 urlsplit 的区别
学习的内容:(urllib.request库)Request
from urllib import parse
from urllib import request
# https://www.lagou.com/jobs/list_Python?px=default&city=武汉
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E6%AD%A6%E6%B1%89&needAddtionalResult=false'
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
'referer': 'https://www.lagou.com/jobs/list_Python?px=default&city=%E6%AD%A6%E6%B1%89'
}
data = {
'first':'true',
'pn':'1',
'kd':'Python'
}
req = request.Request(url, headers=header,data=parse.urlencode(data).encode('utf-8'),method='POST')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
打印如下:
{"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"223.73.72.42","state":2402}
原本目的是爬取 拉勾网(武汉)的求职信息,为了达到这个目的使用了,为的是模拟浏览器获取信息,但奈何拉勾网的反爬虫实力太强,返回了如上结果(实际上并不是我操作频繁,而是对方有意为之),接下来等我学习了
和
会回来再爬取的((๑•̀ㅂ•́)و✧)
接下来说一下是如何获取类中的请求头(header)和请求数据(data)的:

隐藏的文件
如图所示,实际上拉勾网的真正数据并不是放在最上面(展示页面网址)的,而是偷偷放在了positionAjax.json中(为了不让人直接暴力爬取),如何证明是否真正的放在里面了呢?我们可以打开 JSON在线解析 这个网站并把 Response(就是上图列表第三个)的内容放上去看看,结果如下:

JSON在线解析页面
证明了positionAjax.json中的内容就是真正的求职信息