18爬虫请求模块

部署运行你感兴趣的模型镜像

1.urllib.request模块

1.1 版本

urllib.request模块是python的内置请求模块,request模块是第三方的模块。
urllib.request模块现在比较少用,但仍需掌握,因为有些企业的项目仍是使用该模块
python2 :urllib2、urllib
python3 :把urllib和urllib2合并,urllib.request

1.2 常用的方法

urllib.request.urlopen(“网址”)
作用 :向网站发起一个请求并获取响应

字节流 = response.read()
字符串 = response.read().decode(“utf-8”)
作用:读取获取响应的内容

urllib.request.Request(“网址”,headers=“字典”) ,
urlopen()不支持重构User-Agent,
最基本的反扒,就是在User-Agent、Cookie、ip处做文章,可以使用urllib.request.Request添加urllib.request.Request,重构请求对象,同时也可以使用多个User-Agent配合random函数使用。

1.3 响应对象

read() 读取服务器响应的内容
getcode() 返回HTTP的响应码
geturl() 返回实际数据的URL(防止重定向问题)

2.urllib.parse模块

urlencode(字典)
作用:对传入的字典进行编码,encode() 字符串–> bytes数据类型,decode() bytes数据类型 --> 字符串
quote(字符串) (这个参数是个字符串)

import urllib.parse

name = {'wd':'海贼王'}

name = urllib.parse.urlencode(name)

print(name)

输出:
把海贼王翻译成十六进制数据
wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B

3. 请求方式

GET 特点 :查询参数在URL地址中显示

get请求:从服务器中获取数据,并且不会对服务器产生影响,参数都会在url中显示出来

POST:在Request方法中添加data参数urllib.request.Request(url,data=data,headers=headers)
data :表单数据以bytes类型提交,不能是str

post请求–会对服务器资源产生影响。例如上传文件,输入账号密码等

urllib.request和urllib.parse综合练习

#需求:输入要爬取贴吧的名称,在输入爬取的起始页和终止页,把每一页保存到本地
import urllib.request
import urllib.parse

#https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=100
# 1.构建需要的url
# 2.获取网页的内容
# 3.保存文件

headers = {'User-Agent':' Mozilla/5.0 (Windows NT 6.1;) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
base_url = 'https://tieba.baidu.com/f?'
name = input('请输入需要爬取的贴吧名:')
start = int(input('爬取开始页:'))
end = int(input('爬取结束页:'))
kw = {'kw':name}
kw = urllib.parse.urlencode(kw)
n = 1
for i in range(start,end+1):
    i = (i-1)*50
    url = base_url + kw + '&pn=' + str(i)
    #重构请求对象
    req = urllib.request.Request(url,headers = headers)
    #获取响应对象
    res = urllib.request.urlopen(req)
    #读取响应对象内容
    html = res.read().decode('utf-8')

    #保存到本地

    file_name = '海贼王第'+str(n)+'页源代码'
    with open(file_name,'w',encoding = 'utf-8') as f:
        f.write(html)
    n = n + 1

4. requests模块

4.1 安装

pip install requests
在开发工具pycharm里的Terminal中安装

4.2 request常用方法

requests.get(‘网址’,data,params,headers,)
与urllib.request模块比较,不需要重构请求,且把urllib.parse功能合同,用params代替

4.3 响应对象response的用法

response.text 返回unicode格式的数据(str)
response.content 返回字节流数据(二进制)
response.content.decode(‘utf-8’) 手的进行解码

response.text:
是将获取到的响应对象进行解码,但没有指定的解码方式,全靠猜,容易出现乱码,.
解决方法:在response.text前,写入response.encoding = ‘utf-8’

response.content:是将获取到的响应对象进行解码,解码成字节流数据后,再手动指定解码方式,response.content.decode(‘’utf-8‘’)

response.url 返回url
response.encode() = ‘编码’

import requests

# headers = {
#         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','Cookie':'BIDUPSID=4FA733ACE6D4F90A52D99F5F363CD85A; PSTM=1576929032; sug=3; sugstore=0; ORIGIN=0; bdime=0; BAIDUID=4FA733ACE6D4F90A83BE743C46630339:SL=0:NR=10:FG=1; BD_UPN=12314753; BDUSS=VFPUlFGU0RER1ZtcDdTR1lPek5vcEdZcUMtRFNNUkN3VHZTb35Cb1hRR0duOHRlRVFBQUFBJCQAAAAAAAAAAAEAAADzvSajSjdnaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIYSpF6GEqReR; MCITY=-158%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; BD_CK_SAM=1; BD_HOME=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=1428_31123_21106_31427_31342_30904_31270_31463_30823_31163; PSINO=6; H_PS_645EC=a7848f0JB9WheG1sOVfeKMjHJlUyiwlS1wRIJBkCDEeiFQrxo2RluKd%2B1xs'
#     }
# # 发送请求
# # https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD
#
# wd = {'wd':'中国'}
# response = requests.get('https://www.baidu.com/s?',params=wd,headers=headers)
#
# # 获取响应对象
#
# # print(type(response.text)) # <Response [200]>
# #
# # print(response.text) # 返回的是一个str类型的数据
#
# # print(response.content) # 返回的是一个字节流的数据
#
# # print(response.content.decode('utf-8')) # 手动进行解码
#
# print(response.url)

response = requests.get('https://qq.yh31.com/zjbq/2920180.html')

# print(response.content.decode('utf-8'))

# response.encoding = 'utf-8'

print(response.text)

4.4 requests模块发送 POST请求

何时使用post请求?
当请求会对服务器资源产生影响。例如上传文件,输入账号密码等,或数据隐藏在form表当中,需要提交form表单时
json.loads()将json类型的字符串转化为字典

有道翻译例子

import requests
import json

key = input('请输入您要翻译的内容:')

data = {
    'i': key,
    'from': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15880623642174',
    'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
    'ts': '1588062364217',
    'bv': '42160534cfa82a6884077598362bbc9d',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom':'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION'
}

#把提交的form表单的数据转换为bytes类型的数据,使用requests
#模块,直接在其中输入即可

#如果使用的是urllib的方式,则需要 data = urllib.parse.urlencode(data)
#把data转换成字节流方式  data = bytes(data,'utf-8')

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }

res = requests.post(url,data=data,headers=headers)

res.encoding = 'utf-8'

html = res.text  #此处html为json类型的字符串

#json.loads()将json类型的字符串转化为字典
r_dict = json.loads(html)

result = r_dict['translateResult'][0][0]['tgt']

print(result)

4.5 requests设置代理

使用requests添加代理只需要在请求用法中(get/post)传递proxies参数就可以了

代理网站
西刺免费代理IP:http://www.xicidaili.com/
快代理:http://www.kuaidaili.com/
代理云:http://www.dailiyun.com/

import requests

# 设置代理
proxy = {
    'http':'36.248.129.239:9999'
}

url = 'http://www.httpbin.org/ip'

res = requests.get(url,proxies=proxy)

print(res.text)

4.6 cookie

cookie :通过在客户端记录的信息确定客户身份

HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是新的客户端。为了维护他们之间的连接,让服务器知道这是前一个客户发起的请求,必须在一个地方保存客户端信息。

import requests

# resp = requests.get('https://www.baidu.com/')
#
# # print(resp.cookies)            输出cookie的一个对象
# print(resp.cookies.get_dict())   获取ckkoie里面的某个键值对

# 模拟登陆

# url = 'https://www.zhihu.com/hot'
#
# headers = {
#         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','cookie':'_zap=f6651dfd-8259-4706-9032-5727ec6593ff; d_c0="AKAWpA4b6BCPTrYOvjRlh-tSAC2xRRy2R_o=|1583234256"; _ga=GA1.2.1237704894.1583234257; _xsrf=EQmHq5EuP5gF6Ja6bH46i3znv0r53niY; _gid=GA1.2.1825342243.1588076980; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1587811271,1588076979,1588228873,1588246738; SESSIONID=aq5YCH9MiITrFZOobkIFT3EYgtlfG6SlvGwVB2EUB1F; JOID=UFwUAkLNy7aYh4WBEc5mLyDPZL4Dqr-Dyc_LvVyvhOfqydTIe7wBFMWKhoQZq-aJtgz8-vsmayVtXOxAwCJS2b4=; osd=UlgUC0zPz7aRiYeFEcdoLSTPbbABrr-Kx83PvVWhhuPqwNrKf7wIGseOho0XqeKJvwL-_vsvZSdpXOVOwiZS0LA=; capsion_ticket="2|1:0|10:1588254120|14:capsion_ticket|44:Yjk0ZTgyMjRjZDU0NGFlMjgwMzU4ZmZkMWJhYzA5MmI=|fdf13162982002c673847fae50e99c8f22d583ef7e23228c2d3ace7080b56ee7"; z_c0="2|1:0|10:1588254121|4:z_c0|92:Mi4xRjdYeENBQUFBQUFBb0Jha0Rodm9FQ1lBQUFCZ0FsVk5xU09ZWHdEcnRjZFhPSlkwdXpYZXFualQtekloamplbzdn|76d278afd875611d83dba20ed4d6169d34d0bf1447521478b93ec7ec38c443ae"; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1588254123; KLBRSID=ca494ee5d16b14b649673c122ff27291|1588254207|1588252528'
#     }
#
# resp = requests.get(url,headers=headers)
#
# print(resp.text)

4.7 session

session :通过在服务端记录的信息确定客户身份。这个session就是指会话

session,保持会话。保持登陆的状态去进行多次的信息爬取。当headers增加了ua,cookie后都不能获取数据,考虑增加session

4.8 处理不受信任的SSL数字证书

什么是SSL证书?
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能

import requests

#一个不受信任的网站
url = 'https://inv-veri.chinatax.gov.cn/'   

#模块中增加verify = False,即可访问
resp = requests.get(url,verify = False)  

print(resp.text)

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值