网络请求实战
urllib请求模块
urllib是python内置的HTTP请求库。包含request模块、error模块、parse模块、robots.txt 解析模块
- urllib.request
请求模块 - urllib.error 异常处理模块
- urllib.parse
url解析模块 - urllib.robotparser robots.txt 解析模块
urllib.request模块详解
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程
常用方法:
- urlopen():向网站发起一个请求并获取响应,但不支持重构User-Agent
- read():读取服务器响应地内容(字节流)
- getcode():获取HTTP的响应码
- Request():支持重构请求头
urlopen()实例
# import urllib.request #导包的方式1
from urllib import request #导包的方式2
# 目标url
url = "http://www.baidu.com/"
# 发起请求
response = request.urlopen(url) # 不支持重构请求头
# 获取响应
# html = response.read() # 获取字节流
html = response.read().decode('utf-8') # 获取字符串
# print(html)
print(response.getcode()) # 返回HTTP的响应码,得到正常的响应码就说明没问题
Request实例
注意:Request是request中的
import urllib.request
from urllib import request
url ='https://www.douban.com/'
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
req = urllib.request.Request(url,headers=header) #重构请求头
req1 = request.urlopen(req)
data1 = req1.read().decode('utf-8')
print(data1)
重构请求头可以理解为对代码进行伪装,防止被浏览器的反爬程序检测出来,导致访问失败
urllib.parse模块详解
parse模块定义了url的标准接口,实现url的各种抽取,解析,合并,编码,解码
常用方法:
urlencode()解析字段数据quote()解析字符串数据
urlencode()和quote()实战
from urllib import parse
# 第一种方式 parse.quote() 对字符串进行编码
word = '编程'
res = parse.quote(word)
print(res)
# 第二种方式 parse.urlencode() 对字典进行编码
data = {'wd':'编程'}
data = {'wd':'编程'}
res = parse.urlencode(data)
print(res)
对淘宝搜索栏,利用quote()进行实战演练,具体如下:
from urllib import parse,request
url = 'https://uland.taobao.com/sem/tbsearch?keyword='
w = parse.quote(input('请输入你想搜索的内容:'))
url1 = url+w
hearer ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
URL = request.Request(url1,headers=hearer)
# print(URL)
res = request.urlopen(URL)
# print(res.getcode())
data2 = res.read().decode('utf-8')
print(data2)
requests模块
Requests 是 Python 的第三方库,专门用于发送HTTP请求。是在 urllib 的基础上开发而来,与 urllib 相比,Requests 更加方便、快捷,因此在编写爬虫程序时 Requests 库使用较多。第三方模块需要自己手动进行安装,在Terminal界面【pip install requests】即可,如果出现下载超时,在后面加上镜像源即可,具体操作例如【pip install requests -i pypi.tuna.tsinghua.edu.cn/simple/】
requests模块的使用
常用方法
- requests.get()发送GET请求
- requests.post()发送POST请求
requests响应内容
r.encoding----获得相应的编码
r.cookies ---- 返回cookie
r.headers ----以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code ----响应状态码
r.text ----以获取到的编码解析响应内容
r.json() ---- Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.content----以字节形式(二进制)解析响应内容
requests实战
get请求
import requests #导包
from urllib import parse #导包
url = 'https://www.baidu.com/s?wd='
w = parse.quote(input('请输入你想搜索的内容:'))
url1 = url+w
header ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Cookie':'PSTM=1699327572; BD_UPN=12314753; BIDUPSID=92068D3C5A4CAF9FD74E85044409657D; BAIDUID=0AC910D623E84E2AF2EC0FEB2844D6C4:FG=1; H_PS_PSSID=39713_39733_39678_39817_39841_39905_39909_39913_39935_39932_39942_39941_39939_39931_39974; BDSFRCVID=IhIOJeC62ZIwIcvqfug_riPOGXxaGKJTH6aoC_FvS-u7gREJZS-mEG0PXf8g0KubJmfpogKKKmOTH1tF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJ4q_IPMJK_3qR5gMJ5q-n3HKUrL5t_XbI6y3JjOHJOoDDvVMMrcy4LdjG5zBRbAK5cD0t5jX-oEVh7jWb7HQUPp3-Aq54RmX2cqb56aJb3CsqcL0IcVQfbQ0b7hqP-jW5TaaJ6D-n7JOpvohfnxy5_3QRPH-Rv92DQMVU52QqcqEIQHQT3m5-5bbN3ut6T2-DA__KtXtUK; ispeed_lsm=2; H_PS_645EC=9beeB%2FezrBuU%2Ft4FB0pyd6r1p%2F%2FpEd5k8oZHTw%2FFniWRDFdj4JA1U3%2FsWZY; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDSFRCVID_BFESS=IhIOJeC62ZIwIcvqfug_riPOGXxaGKJTH6aoC_FvS-u7gREJZS-mEG0PXf8g0KubJmfpogKKKmOTH1tF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJ4q_IPMJK_3qR5gMJ5q-n3HKUrL5t_XbI6y3JjOHJOoDDvVMMrcy4LdjG5zBRbAK5cD0t5jX-oEVh7jWb7HQUPp3-Aq54RmX2cqb56aJb3CsqcL0IcVQfbQ0b7hqP-jW5TaaJ6D-n7JOpvohfnxy5_3QRPH-Rv92DQMVU52QqcqEIQHQT3m5-5bbN3ut6T2-DA__KtXtUK; BAIDUID_BFESS=0AC910D623E84E2AF2EC0FEB2844D6C4:FG=1; baikeVisitId=9ebd259b-7720-4b1f-a57a-e986dd60c43e',
'Referer':"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=zhongguo&fenlei=256&rsv_pq=0xc33ea29e00049ba1&rsv_t=5a72Ux5siuUamG4PKKyxabJHWlHk2ZX5e7wvUbLWWlMRSp4%2B4Rgh6j2m23qH&rqlang=en&rsv_enter=1&rsv_dl=tb&rsv_sug3=10&rsv_sug1=5&rsv_sug7=101&rsv_sug2=0&rsv_btype=t&inputT=1293&rsv_sug4=1855&rsv_sug=1"
}
URL = requests.get(url1,headers=header)
URL.encoding='utf-8'
print(URL.text)
post请求
import requests
# 请求网址
url = 'https://fanyi.sogou.com/api/transpc/text/result'
# 请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Cookie":"SUID=75B5FA761952960A0000000065016BF1; cuid=AAGslytERwAAAAqMTFS2QAEANgg=; SUV=1694591985834583; ABTEST=8|1701420603|v17; wuid=1701420603872; FQV=003c3b153adc1fa12f03c5a6627e71ae; translate.sess=82f84dfe-9881-4240-af38-02440dc740d5; SGINPUT_UPSCREEN=1701420605467; SNUID=DFA4CE5881878A643F2862328256F1F6"
}
# 请求体
data = {
"from": "auto",
"to": "en",
"text": "学习",
"client": "pc",
"fr": "browser_pc",
"needQc": 1,
"s": "bc70f86d4d6bb6db6c22f59ea3cc0331",
"uuid": "e974a76d-bdfc-4913-9ab6-f0b7eb933ff9",
"exchange": False
}
# 获取响应
response = requests.post(url=url,data=data,headers=headers)
print(response.json())
Session和Cookie
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失效,这又是什么情况?其实这里面涉及 Session 和Cookie 的相关知识。
Cookie
通过在客户端记录的信息确定用户身份
HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
Session
Session,中文称之为会话,通过在服务端记录的信息确定用户身份 。其本义是指有始有终的一系列动作、消息。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一个 Session。
session实战
import requests
# 创建session对象
session = requests.session()
# 请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
'Cookie':'shanzhi_kmer=kdyb7lb4kj01wtcd71hw9hub8nvi7zu2; csrftoken=7aCqMZAewojGjtI0sCmbVGUUnAF8SnIem5MlY4AYuHCMwhp7vltH6iJ1dpgjmXxG'
}
# 第一次请求的网址
url = 'http://shanzhi.spbeen.com/index/'
# 将请求头添加到session会话
session.headers = headers
response = session.get(url)
response1 = session.get(url='http://shanzhi.spbeen.com/detail/?id=7235')
print(response1.text)