python爬虫学习笔记3.1-请求模块入门1
urllib和requests库的作用都是发送网络请求返回相应数据,urllib是python内置库,requests的底层实现就是urllib。
urllib和requests各有优缺点,使用requests主要是因为比urllib简单。下面分别对这两种库进行介绍。
参考文档
urllib
urllib.request模块
版本
- python2 :urllib2、urllib
- python3 :把urllib和urllib2合并,urllib.request
常用的方法
- urllib.request.urlopen(“网址”)
- 【向网站发起一个请求并获取响应】
- 字节流 = response.read()
- 字符串 = response.read().decode(“utf-8”)
- urllib.request.Request(“网址”,headers=“字典”)
- 【urlopen()不支持重构User-Agent】
响应对象
- read()
- 【读取服务器响应的内容】
- getcode()
- 【返回HTTP的响应码】
- geturl()
- 【返回实际数据的URL(防止重定向问题)】
urllib.request简单应用
import urllib.request
url='https://www.baidu.com/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
#1.创建请求的对象Request
req=urllib.request.Request(url,headers=headers)
#2.获取响应对象urlopen
res=urllib.request.urlopen(req)
#3.读取响应内容read
html=res.read().decode('utf-8')
#4.打印实际请求的url
# print(html)
# print(res.getcode())# 返回状态码
print(res.geturl())# 返回实际请求的url
urllib.parse
常用方法
- urlencode(字典)
- quote(字符串) (这个里面的参数是个字符串)
请求方式
- GET
- 【查询参数在URL地址中显示】
- POST
- 在Request方法中添加data参数
- urllib.request.Request(url,data=data,headers=headers)
- data :表单数据以bytes类型提交,不能是str
urllib.parse简单应用
练习1:使用parse.urlencode对url中的中文字符进行编码
浏览器会对这个url进行一个编码。(除英文字母、数字和部分标识其他的全部使用% + 十六进制码进行编码)
中文在url中显示的形式
url = ‘https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B’
中文的实际形式
'https://www.baidu.com/s?wd=火影忍者
url = 'https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B'
import urllib.parse
te = {'wd': '海贼王'}
result = urllib.parse.urlencode(te)
# 编码 wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B
print(result)
te1={'wd':'火影忍者'}
res=urllib.parse.urlencode(te1)
# wd=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85
print(res)
练习2 搜索一个内容 把这个数据保存到本地 html
import urllib.parse
import urllib.request
baseurl = 'https://www.baidu.com/s?'
key = input('请输入你要搜索的内容:')
w={'wd':key}
# 编码
k=urllib.parse.urlencode(w)
# 拼接url
url=baseurl+k
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36','Cookie':'BIDUPSID=23F0C104655E78ACD11DB1E20FA56630; PSTM=1592045183; BD_UPN=12314753; sug=0; sugstore=0; ORIGIN=0; bdime=0; BAIDUID=23F0C104655E78AC9F0FB18960BCA3D3:SL=0:NR=10:FG=1; BDUSS=ldxR1FyQ2FEaVZ5UWFjTDlRbThVZHJUQTY1S09PSU81SXlHaUpubVpEY0FMakZmRVFBQUFBJCQAAAAAAAAAAAEAAADzvSajSjdnaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChCV8AoQlfb; BDUSS_BFESS=ldxR1FyQ2FEaVZ5UWFjTDlRbThVZHJUQTY1S09PSU81SXlHaUpubVpEY0FMakZmRVFBQUFBJCQAAAAAAAAAAAEAAADzvSajSjdnaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChCV8AoQlfb; MCITY=-158%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=1; delPer=0; BD_CK_SAM=1; PSINO=6; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm; COOKIE_SESSION=204_0_5_9_4_6_0_0_5_4_0_0_533_0_0_0_1602246393_0_1602250500%7C9%2369429_193_1601361993%7C9; H_PS_PSSID=32757_32617_1428_7566_7544_31660_32723_32230_7517_32116_32718; H_PS_645EC=ab4cD3QpA7yZJBKDrrzZqesHzhDrwV%2BYww0WVHtmGJ3Adcj0qvjZIVV%2F9q4'
}
# 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 获取响应对象
res = urllib.request.urlopen(req)
# 读取响应对象
html = res.read().decode('utf-8')
# 写入文件
with open('resourse/搜索3.html', 'w', encoding='utf-8') as f:
f.write(html)
requests
安装方式
- pip install requests【在pycharm的Terminal中安装,在cmd中会有奇怪的问题】
- 在开发工具中安装File | Settings | Project: pyth | Project Interpreter
request常用方法
requests.get(网址)
响应对象response的方法
- response.text
- 【返回unicode格式的数据(str)】
- response.content
- 【返回字节流数据(二进制)】
- response.content.decode(‘utf-8’)
- 【手动进行解码】
- response.url
- 【返回url】
- response.encode() = ‘编码’
- 【编码】
request简单应用
练习1:requests入门
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
# 发送请求
response = requests.get('https://qq.yh31.com/zjbq/2920180.html',headers=headers)
# 打印响应对象
# print(response.text) # 返回str类型的数据
# print(response.content) # 返回的是字节流的数据
# 第一种解决乱码的方式 最本质的方式(推荐)
print(response.content.decode('utf-8'))
# 第二种
# response.encoding = 'utf-8'
# print(response.text)
练习2:下载图片
# 快捷键 ctrl+/ 批量去除注释
# 方式1使用requess
import requests
url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg'
# 获取请求
req = requests.get(url)
# 创建或打开文件
fn=open('4.jpg','wb')
# 写入文件
fn.write(req.content)
fn.close()
# 写入文件
with open('code2.jpg','wb') as f:
f.write(req.content)
# # 方式2使用urllib
# from urllib import request
# url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg'
# request.urlretrieve(url, 'resourse/5.jpg')
requests设置代理
只需要在请求方法中(get/post)传递proxies参数。
代理网站
- 西刺免费代理IP:http://www.xicidaili.com/
- 快代理:http://www.kuaidaili.com/
- 代理云:http://www.dailiyun.com/
注
免费的东西总是最贵的,免费代理一般都被用完了,而且即使遇到可以使用的代理往往会有奇葩问题,谨慎使用!!
练习1: requests设置代理ip
import requests
# 设置代理
proxy = {
'http':'175.42.158.172:9999'
}
url = 'http://httpbin.org/ip'
res = requests.get(url,proxies=proxy)
print(res.text)