2021/4/19爬虫第三次课(爬虫网络请求模块)
程序员文章站
2022-05-02 22:13:23
...
文章目录
一、状态码和抓包工具
- 301 永久重定向
- 302 临时重定向
- requests
- urllib.request
二、requests模块(引入)
import requests
url='https://img1.baidu.com/it/u=1110563168,1750140428&fm=26&fmt=auto&gp=0.jpg'response = requests.get(url)
fn = open('code.png','wb')
fn.write(response.content)
fn.close()
url = 'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg'
response = requests.get(url)
fn = open('code.png','wb')
with open('code2.png','wb') as file_obj:
file_obj.write(response.content)
from urllib import request
url = 'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg'
request.urlretrieve(url,'code3.png')
以上用了两种保存方式
三、urllib简介
3.1什么是urllib模块
Python 内置的网络请求模块
3.2为什么要学习这个模块?
1 有些比较老的爬虫项目用的就是这个技术
2 有的时候我们去爬取一些数据需要requests + urllib模块进行配合
3 内置的
四、urllib.request使用
模板
# 1 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 2 发出请求并获取响应对象
response = urllib.request.urlopen(req)
# 3 读取 响应对象的内容
html = response.read().decode('utf-8')
print(html)
五、urllib.parse使用
通过urllib向一个携带有中文字眼的url发起请求,这个时候需要注意要把中文转换成百分号+十六进制的这种数据类型 即这时候要用urllib.parse
import urllib.parse
#1
wd = {'wd':'海贼王'}
result = urllib.parse.urlencode(wd)
print(result)
base_url = 'https://www.baidu.com/s?' + result
print(base_url)
#2
r = '海贼王'
result = urllib.parse.quote(r)
# print(result)
url3 = 'https://www.baidu.com/s?wd=' + result
print(url3)
六、案例
爬取百度贴吧指定页面的html
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)
# 拼接url 创建请求对象 发请求获取响应 读取 保存数据
# https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=0
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)
# 改写成 函数式编程 改写成面向对象的编程方式
七、补充
import urllib.parse
hero_url = 'http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735041519%2F1618485629%5F84828260%5F22420%5FsProdImgNo%5F1%2Ejpg%2F200' # 图片的url
img_url = urllib.parse.unquote(hero_url)
print(img_url)
字节流 = response.read()
响应对象
• read() 读取服务器响应的内容
• getcode() 返回HTTP的响应码
• geturl() 返回实际数据的URL(防止重定向问题)
encode str(字符串) --> bytes数据类型
decode bytes数据类型 --> str(字符串)
下一篇: 使用Selectable抽取元素