一、什么是urllib模块
urllib模块是Python 内置的网络请求模块。
二、为什么要学习这个模块?
1 有些比较老的爬虫项目用的就是这个技术
2 有的时候我们去爬取一些数据需要requests + urllib模块进行配合
3 内置的
三、以一个图片爬取案例比较urllib模块和requests模块
要爬取下面这张图片:
注意:上图中的地址是整个网页的地址,并不单单的是这张图片的url. 我们要找的是这张图片的url:鼠标放到图片上 右键 点击 新标签网页打开图片。
(一)requests模块方法:
import requests
url='https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp6.itc.cn%2Fimages01%2F20200701%2F006634ad522440cbbeb6fb34b1d4b599.jpeg&refer=http%3A%2F%2Fp6.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621823411&t=03762c878fa62b7cce7b56016c5beb72'
response=requests.get(url)
fn=open('code.png','wb')
fn.write(response.content)
fn.close()
#后面3行也可以写成:
# with open('code.png','wb') as file_obj:
# file_obj.write(response.content)
结果:(运行完成后,桌面出现该图片文件)
如果是用的第一张图上的整改网页的地址,那么将打不开爬取的图片,如下图:
(二)urllib模块方法
from urllib import request #也可以写成 import urllib.request
url='https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp6.itc.cn%2Fimages01%2F20200701%2F006634ad522440cbbeb6fb34b1d4b599.jpeg&refer=http%3A%2F%2Fp6.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621823411&t=03762c878fa62b7cce7b56016c5beb72'
request.urlretrieve(url,'code.png')
结果:
四、响应对象
urllib.request.urlopen向网站发起请求并获取响应
import urllib.request
response=urllib.request.urlopen('https://www.baidu.com/')
print(response)
结果:
被〈〉包含的是对象,就会有方法。
从结果看:(1)字节流(红框标志) ;(2)数据不对(反爬)
代码进一步优化为:
import urllib.request
response=urllib.request.urlopen('https://www.baidu.com/')
html=response.read().decode('utf-8')
print(html)
print(type(html))
结果:
五、urllib模块快速入门
1、创建请求对象
req=urllib.request.Request(url,headers=headers) (url和headers提前确认好)
2、获取响应对象
response=urllib.request.urlopen(req)
3、读取响应对象的内容
html=response.read().decode(‘utf-8’)
print(html)
4、保存数据
with open(‘百度.html’,‘w’,encoding=‘utf-8’) as file_obj:
file_obj.write(html)
补充:因为urlopen()不支持重构User-Agent,所以在其前面用urllib.request.Request"网址",headers=“字典”) 重构;
getcode() 返回HTTP的响应码;geturl() 返回实际数据的URL(防止重定向问题)
六、当请求地址中包含中文时的处理
要把中文转换成:%+16进制(3个%是一个汉字),否则会报错。
(一)转换方法:urllib.parse
1、urlencode(字典)
2、quote(字符串)
(二)与input函数结合的应用
请输入你要搜索的内容: 例如 海贼王 最终把文件以html的格式保存 例如 海贼王.html
import urllib.parse
k=input('请输入要搜索的内容:')
wd={'wd':k}
result=urllib.parse.urlencode(wd)
print(result)
base_url='https://www.baidu.com/s?'+result
print(base_url)
七、作业:百度贴吧练习
需求:
1 输入要爬取的贴吧主题
2 要进行翻页爬取 起始页和终止页
3 保存数据
import urllib.request
import urllib.parse
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
name = input('请输入贴吧名:')
begin = int(input('请输入起始页:'))
end = int(input('请输入结束页:'))
kw = {'kw':name}
result = urllib.parse.urlencode(kw)
for i in range(begin,end+1):
pn = (i - 1) * 50
# print(pn)
base_url = 'https://tieba.baidu.com/f?'
url = base_url + result + '&pn=' + str(pn)
# 发请求获响应
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
# 写入文件
filename = '第' + str(i) + '页.html'
with open(filename,'w',encoding='utf-8') as file_obj:
print('正在爬取%d页'%i)
file_obj.write(html)