# urllib请求库的一些基本方法
import urllib.request
url = 'https://pic.netbian.com/'
# 模拟浏览器向服务器发起请求
response = urllib.request.urlopen(url=url)
print(type(response)) # HTTPResponse
# 六个方法
# 1.read() 按照一个字节,一个字节的方式读取网页数据源码
content = response.read().decode('gbk')
print(content)
# 2.读取一行
# content = response.readline()
# print(content)
# content = response.readlines()
# print(content)
# 3.返回状态码信息
# print(response.getcode())
# 4.geturl() 获取请求的url
# print(response.geturl())
# 5.getheaders() 获取到响应头的状态信息
# print(response.getheaders())
# 6.urlretrive() 下载图片与视频
# urllib.request.urlretrieve(下载地址,存放位置)
1.对url发起请求之前要使用urllib.request.Request()来对url请求对象定制
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
}
request = urllib.request.Request(url=url,headers=headers)
使用之前我们要安装一下urlllib这个请求库===>>在cmd输入pip install urllib3就可以了
安装之后在pycharm中导入urllib.request模块
注意:.当所访问的url携带参数时在请求对象定制的时候需要使用urllib.parse库来进行16进制编码,当然此处也分为get和post请求的两种请求方式
get请求参数
一个参数
https://movie.douban.com/j/chart/top_list?name=猫猫
urllib.parse.quote('猫猫') ==> %E5%91%A8%E6%9D%B0%E4%BC%A6
多个参数
https://movie.douban.com/j/chart/top_list?start=0&limit=20
params={
'start':0,
"limit":20
}
urllib.parseurlencode(params) ==>start=0&limit=20
post请求参数
https://movie.douban.com/j/chart/top_list post请求(kw:spider)
携带参数到定制的请求对象中
data = {
'kw': 'sider'
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, headers=headers)
'''
总结: get请求url带有参数时不需要在请求对象定制时传入,只需要编码后与url头拼接即可
# 处理参数
name = urllib.parse.quote('周杰伦')
print(name) # %E5%91%A8%E6%9D%B0%E4%BC%A6
# url的拼接
url = url + name # https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
request = urllib.request.Request(url=url, headers=headers)
下面一个小案例分享给大家帮助大家理解,可能有不妥之处,还望大家多多指教,共同进步!
import urllib.request
import re
import os
# https://pic.netbian.com/4kmeinv/index.html 1
# https://pic.netbian.com/4kmeinv/index_1.html
# https://pic.netbian.com/4kmeinv/index_2.html 2
# https://pic.netbian.com/4kmeinv/index_3.html 3
# https://pic.netbian.com/4kmeinv/index_4.html 4
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 持久化存储 (下载 )
if not os.path.exists('./彼岸图网'):
os.mkdir('./彼岸图网')
for i in range(1, 59):
if i == 1:
url = 'https://pic.netbian.com/4kmeinv/'
else:
url = f'https://pic.netbian.com/4kmeinv/index_{str(i)}.html'
# 请求对象定制
request = urllib.request.Request(url=url, headers=headers)
# 获取网页数据源码
response = urllib.request.urlopen(request)
# 网页数据
content = response.read().decode('gbk')
# print(content)
# 数据解析 (re) 分析数据结构
pattern = '' # 链接
namePattern = '' # 标题
# re.findall
img_list = re.compile(pattern, re.S).findall(content)
name_list = re.compile(namePattern, re.S).findall(content)
# print(img_list)
# print(name_list)
# 创建一个结果数组 , 为了以后保存到其他的地方 [{},{},{}]
results = []
for index in range(len(name_list)):
item = {}
item['src'] = 'https://pic.netbian.com' + img_list[index] # 图片链接
item['name'] = name_list[index] # 图片名字
item['suffix'] = item['src'].split('.')[-1] # 后缀
results.append(item)
print(results)
# 下载图片
for item in results:
urllib.request.urlretrieve(url=item['src'], filename='./彼岸图网/' + item['name'] + '.' + item['suffix'])
print(f'{item["name"]}--抓取完成!')
print(f'************************第{i}页抓取完成!************************')