urllib的一些使用案例

简介: urllib的一些使用案例

目录

​​​​​​​

 ajax的get请求

ajax的post请求

cookie登录

代理池


  • ajax的get请求

  • 案例1:获取豆瓣电影的第一页数据并保存起来,这里我们主要也是使用了ajax的get请求,这里看似是比较难的其实实际多应用还是比较容易理解的。
关于请求头的补充
模拟头部信息
我们抓取网页一般需要对 headers(网页头信息)进行模拟,这时候需要使用到 >urllib.request.Request 类:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • headers:HTTP 请求的头部信息,字典格式。
  • origin_req_host:请求的主机地址,IP 或域名。
  • unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False。。
  • method:请求方法, 如 GET、POST、DELETE、PUT等。
# get请求
# 获取豆瓣电影的第一页的数据 并且保存起来
 
import urllib.request
 
url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
 
# (1) 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
 
# (2)获取响应的数据
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
 
# (3) 数据下载到本地
# open方法默认情况下使用的是gbk的编码  如果我们要想保存汉字 那么需要在open方法中指定编码格式为utf-8
# encoding = 'utf-8'
# fp = open('douban.json','w',encoding='utf-8')
# fp.write(content)
 
with open('douban1.json','w',encoding='utf-8') as fp:
    fp.write(content)

案例2:爬取豆瓣电影的前十页数据

# 爬取豆瓣电影前10页数据
# https://movie.douban.com/j/chart/top_list?
type=20&interval_id=100%3A90&action=&start=0&limit=20
# https://movie.douban.com/j/chart/top_list?
type=20&interval_id=100%3A90&action=&start=20&limit=20
# https://movie.douban.com/j/chart/top_list?
10.ajax的post请求
案例:KFC官网
11.URLError\HTTPError
type=20&interval_id=100%3A90&action=&start=40&limit=20
import urllib.request
import urllib.parse
# 下载前10页数据
# 下载的步骤:1.请求对象的定制 2.获取响应的数据 3.下载
# 每执行一次返回一个request对象
def create_request(page):
base_url = 'https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&'
headers = {
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
data={
# 1 2 3 4
# 0 20 40 60
'start':(page‐1)*20,
'limit':20
}
# data编码
data = urllib.parse.urlencode(data)
url = base_url + data
request = urllib.request.Request(url=url,headers=headers)
return request
# 获取网页源码
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf‐8')
return content
def down_load(page,content):
# with open(文件的名字,模式,编码)as fp:
# fp.write(内容)
with open('douban_'+str(page)+'.json','w',encoding='utf‐8')as fp:
fp.write(content)
if __name__ == '__main__':
start_page = int(input('请输入起始页码'))
end_page = int(input('请输入结束页码'))
for page in range(start_page,end_page+1):
request = create_request(page)
content = get_content(request)
down_load(page,content)

  • ajax的post请求

案例:kfc

# 1页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10
 
 
# 2页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10
 
import urllib.request
import urllib.parse
 
def create_request(page):
    base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
 
    data = {
        'cname': '北京',
        'pid':'',
        'pageIndex': page,
        'pageSize': '10'
    }
 
    data = urllib.parse.urlencode(data).encode('utf-8')
 
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
 
    request = urllib.request.Request(url=base_url,headers=headers,data=data)
 
    return request
 
def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content
 
 
def down_load(page,content):
    with open('kfc_' + str(page) + '.json','w',encoding='utf-8')as fp:
        fp.write(content)
 
 
 
if __name__ == '__main__':
    start_page = int(input('请输入起始页码'))
    end_page = int(input('请输入结束页码'))
 
    for page in range(start_page,end_page+1):
        # 请求对象的定制
        request = create_request(page)
        # 获取网页源码
        content = get_content(request)
        # 下载
        down_load(page,content)

  • cookie登录

cookie中携带者个人登录信息,如果有登录之后的cookie,那么我们可以携带者cookie进入到任何页面

案例1:微博个人信息页面登录

# 适用的场景:数据采集的时候 需要绕过登陆 然后进入到某个页面
# 个人信息页面是utf-8  但是还报错了编码错误  因为并没有进入到个人信息页面 而是跳转到了登陆页面
# 那么登陆页面不是utf-8  所以报错
 
# 什么情况下访问不成功?
# 因为请求头的信息不够  所以访问不成功
 
import urllib.request
 
url = 'https://weibo.cn/6451491586/info'
 
headers = {
# ':authority': 'weibo.cn',
# ':method': 'GET',
# ':path': '/6451491586/info',
# ':scheme': 'https',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
# 'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
#     cookie中携带着你的登陆信息   如果有登陆之后的cookie  那么我们就可以携带着cookie进入到任何页面
'cookie': '_T_WM=24c44910ba98d188fced94ba0da5960e; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFxxfgNNUmXi4YiaYZKr_J_5NHD95QcSh-pSh.pSKncWs4DqcjiqgSXIgvVPcpD; SUB=_2A25MKKG_DeRhGeBK7lMV-S_JwzqIHXVv0s_3rDV6PUJbktCOLXL2kW1NR6e0UHkCGcyvxTYyKB2OV9aloJJ7mUNz; SSOLoginState=1630327279',
# referer  判断当前路径是不是由上一个路径进来的    一般情况下 是做图片防盗链
'referer': 'https://weibo.cn/',
'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应的数据
content = response.read().decode('utf-8')
 
# 将数据保存到本地
with open('weibo.html','w',encoding='utf-8')as fp:
    fp.write(content)

对比:

  • urllib.request.urlopen(url)不能定制请求头;
  • urllib.request.Request()可以定制请求头;
  • handler处理器:目的是用来定制更高级的请求头,随着业务逻辑的复杂,请求对象的定制已经满足不了我们的需求(例如动态cookie和代理不能使用请求对象定制)

\
案例:使用handler来访问百度  获取网页源码

# 需求 使用handler来访问百度  获取网页源码
 
import urllib.request
 
url = 'http://www.baidu.com'
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
 
request = urllib.request.Request(url = url,headers = headers)
 
# handler   build_opener  open
 
# (1)获取hanlder对象
handler = urllib.request.HTTPHandler()
 
# (2)获取opener对象
opener = urllib.request.build_opener(handler)
 
# (3) 调用open方法
response = opener.open(request)
 
content = response.read().decode('utf-8')
 
print(content)

代理服务器\
代理服务器的常用功能:

  1. 突破自身ip访问限制,访问国外节点
  2. 访问一些单位和集体的内部资源
  3. 提高访问速度
  4. 隐藏真实ip

代码配置代理

  1. 创建request对象
  2. 创建proxyHandler对象
  3. 用handler对象创建opener对象
  4. 使用opener.open函数发送请求

案例:\
 

import urllib.request
 
url = 'http://www.baidu.com/s?wd=ip'
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
 
# 请求对象的定制
request = urllib.request.Request(url = url,headers= headers)
 
# 模拟浏览器访问服务器
# response = urllib.request.urlopen(request)
 
proxies = {
    'http':'118.24.219.151:16817'
}
# handler  build_opener  open
handler = urllib.request.ProxyHandler(proxies = proxies)
 
opener = urllib.request.build_opener(handler)
 
response = opener.open(request)
 
# 获取响应的信息
content = response.read().decode('utf-8')
 
# 保存
with open('daili.html','w',encoding='utf-8')as fp:
    fp.write(content)
 

import urllib.request
 
proxies_pool = [
    {'http':'118.24.219.151:16817'},
    {'http':'118.24.219.151:16817'},
]
 
import random
 #使其从代理池中任意选择一个IP
proxies = random.choice(proxies_pool)
 
url = 'http://www.baidu.com/s?wd=ip'
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
 
request = urllib.request.Request(url = url,headers=headers)
 
handler = urllib.request.ProxyHandler(proxies=proxies)
 
opener = urllib.request.build_opener(handler)
 
response = opener.open(request)
 
content = response.read().decode('utf-8')
 
with open('daili.html','w',encoding='utf-8')as fp:
    fp.write(content)

相关文章
|
9月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
249 14
|
XML JavaScript 数据格式
uni-app 根据用户不同身份显示不同的tabBar
uni-app 根据用户不同身份显示不同的tabBar
1069 62
|
算法 应用服务中间件 测试技术
接入层限流之ngx_http_limit_req_module
ngx_http_limit_req_module模块是Nginx提供的基于漏桶算法实现的请求限流模块,用于对指定KEY对应的请求进行限流,比如按照IP维度限制请求速率。
1596 0
接入层限流之ngx_http_limit_req_module
|
Linux Shell 数据安全/隐私保护
Linux更改普通用户密码的三种方法
Linux更改普通用户密码的三种方法
1088 0
|
负载均衡 监控 网络协议
在nginx中使用proxy protocol协议
我们已经介绍了haproxy提出的proxy protocol协议,通过proxy protocol协议,服务器端可以获得客户端的真实IP地址和端口,从而可以进行一些非常有意义的操作。 为什么获得客户端的真实IP地址会非常有意义呢?
|
弹性计算
阿里云Intel Xeon(Sapphire Rapids) Platinum 8475B处理器CPU基频2.7 GHz,全核睿频3.2 GHz
阿里云Intel Xeon(Sapphire Rapids) Platinum 8475B处理器CPU基频2.7 GHz,全核睿频3.2 GHz
815 0
阿里云Intel Xeon(Sapphire Rapids) Platinum 8475B处理器CPU基频2.7 GHz,全核睿频3.2 GHz
|
弹性计算
LVM丢失恢复
LVM丢失恢复
|
缓存 监控 网络协议
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(三)
译|Monitoring and Tuning the Linux Networking Stack: Receiving Data(三)
480 0
|
Java Maven 内存技术
java 视频提取音频 | Java工具类
java 视频提取音频 | Java工具类
java 视频提取音频 | Java工具类
|
域名解析 缓存 弹性计算
如果你非要在 Kubernetes 集群中用 nscd
本文将阐述你应该优先考虑的方案、为什么不推荐 nscd、以及如何合理地在 Kubernetes 集群中使用 nscd。
2209 1
如果你非要在 Kubernetes 集群中用 nscd