爬虫笔记2:请求模块之urllib模块

一、什么是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)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值