admin 管理员组文章数量: 1087649
一、Urllib详解
一、Urllib详解
目录
1.什么是互联网爬虫?
2.爬虫核心?
3.爬虫的用途?
4.爬虫分类?
5.反爬手段?
6.urllib库使用
7.请求对象的定制
8.编解码
9.ajax的get请求
10.ajax的post请求
11.URLError\HTTPError
13.Handler处理器
14.代理服务器
1.什么是互联网爬虫?
如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小 蜘蛛,沿着蜘蛛网抓取自己想要的数据解释 1 :通过一个程序,根据 Url ( http : // www . taobao . com ) 进行爬取网页,获取有用信息 解释 2 :使用程序模拟浏览器,去向服务器发送请求,获取响应信息
2.爬虫核心?
1. 爬取网页:爬取整个网页 包含了网页中所有得内容 2. 解析数据:将网页中你得到的数据 进行解析 3. 难点:爬虫和反爬虫之间的博弈 竞争对手监控
3.爬虫的用途?
数据分析/ 人工数据集 社交软件冷启动 舆情监控4.爬虫分类?
通用爬虫: 实例 百度、360、google 、 sougou 等搜索引擎 ‐‐‐ 伯乐在线 功能 访问网页 ‐> 抓取数据 ‐> 数据存储 ‐> 数据处理 ‐> 提供检索服务 robots协议 一个约定俗成的协议,添加robots . txt 文件,来说明本网站哪些内容不可以被抓取,起不到限制作用自己写的爬虫无需遵守 网站排名 ( SEO ) 1. 根据 pagerank 算法值进行排名(参考个网站流量、点击率等指标) 2. 百度竞价排名 缺点 1. 抓取的数据大多是无用的 2. 不能根据用户的需求来精准获取数据 聚焦爬虫 功能 根据需求,实现爬虫程序,抓取需要的数据 设计思路 1. 确定要爬取的 url 如何获取Url 2. 模拟浏览器通过 http 协议访问 url ,获取服务器返回的 html 代码 如何访问 3. 解析 html 字符串(根据一定规则提取需要的数据) 如何解析5.反爬手段?
1. User ‐ Agent : User Agent中文名为用户代理,简称 UA ,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版 本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。 2. 代理 IP 西次代理 快代理 什么是高匿名、匿名和透明代理?它们有什么区别? 1. 使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实 IP 。 2. 使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实 IP 。 3. 使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实 IP 。 3. 验证码访问 打码平台 云打码平台 超级🦅 4. 动态加载网页 网站返回的是 js 数据 并不是网页的真实数据 selenium驱动真实的浏览器发送请求 5. 数据加密 分析js 代码6.urllib库使用
urllib.request.urlopen() 模拟浏览器向服务器发送请求
response 服务器返回的数据
response的数据类型是HttpResponse
字节‐‐>字符串
解码decode
字符串‐‐>字节
编码encode
read() 字节形式读取二进制 扩展:rede(5)返回前几个字节
readline() 读取一行
readlines() 一行一行读取 直至结束
getcode() 获取状态码
geturl() 获取url
getheaders() 获取headers
urllib.request.urlretrieve()
请求网页
请求图片
请求视频
7.请求对象的定制
UA介绍: User Agent 中文名为用户代理,简称 UA ,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、 CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等 语法: request = urllib . request . Request ()import urllib.requesturl = ''# url的组成
# =周杰伦# http/https www.baidu 80/443 s wd=周杰伦 #
# 协议 主机 端口号 路径 参数 锚点headers = {
'User-Agent':'填写自己的'
}# 因为urlopen方法中不能存储字典 所以headers不能传进去
# 请求对象的定制
# 注意 因参数顺序的问题 不能直接写url 和headers 中间还有data 所以我们需要关键字传参
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
扩展:编码的由来 ''' 编码集的演变 ‐‐‐ 由于计算机是美国人发明的,因此,最早只有 127 个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号, 这个编码表被称为 ASCII 编码,比如大写字母 A 的编码是 65 ,小写字母 z 的编码是 122 。 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和 ASCII 编码冲突, 所以,中国制定了 GB2312 编码,用来把中文编进去。 你可以想得到的是,全世界有上百种语言,日本把日文编到 Shift_JIS 里,韩国把韩文编到 Euc‐kr 里, 各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。 因此, Unicode 应运而生。 Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。 Unicode 标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要 4 个字节)。 现代操作系统和大多数编程语言都直接支持 Unicode 。 '''
8.编解码
8.1.get请求方式:urllib.parse.quote()
# =%E5%91%A8%E6%9D%B0%E4%BC%A6# 需求 获取 =周杰伦的网页源码
import urllib.requesturl = '='
# 请求对象的定制为了解决反爬的第一种手段
headers = {
'User-Agent':'填写自己的',
'Cookie':'填写自己的'
}# 将周杰伦三个字变成unicode编码格式
# 我们需要依赖于urllib.parseurl = url + urllib.parse.quote('周杰伦')# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
2.get 请求方式: urllib.parse.urlencode ()
# urlencode应用场景:多个参数的时候# =周杰伦&sex=男
import urllib.parse
import urllib.request# data = {
# 'wd':'周杰伦',
# 'sex':'男',
# 'location':'中国台湾省'
# }
# a = urllib.parse.urlencode(data)
# print(a)# =%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7 的网页源码base_url = '?'
data = {'wd':'周杰伦','sex':'男'
}
new_data = urllib.parse.urlencode(data)# 请求资源路径
url = base_url + new_dataheaders = {
'User-Agent':'填写自己的',
'Cookie':'填写自己的'
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
3.post 请求方式
# post请求
import urllib.parse
import urllib.requesturl = ''headers = {
'User-Agent':'填写自己的',
'Cookie':'填写自己的'
}data = {'kw':'spider'
}# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')request = urllib.request.Request(url=url,data=data,headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)# 获取响应的数据
content = response.read().decode('utf-8')print(content)obj = json.loads(content)print(obj)# post请求方式的参数 必须编码 且必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')# 参数是放在请求对象定制的方法中 request = urllib.request.Request(url=url,data=data,headers=headers)
总结: post 和 get 区别?
1 : get 请求方式的参数必须编码,参数是拼接到 url 后面,编码之后不需要调用 encode 方法 2 : post 请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用 encode 方法
案例练习:百度详细翻译
import json
import urllib.parse
import urllib.requesturl = '=en&to=zh'headers = {'Accept':'*/*',# 'Accept-Encoding':'gzip, deflate, br',# 'Accept-Language':'zh-CN,zh;q=0.9',# 'Acs-Token':'1691843902922_1691843903053_1MYDo654qpOLf8XjyF2W/Km+MBjm4H/J++Qdfa58vqOhmer2abJG9QjUW+crVvyVK988CVpglxvoCdhzqjWRsxJ0Rgyuh1xxFKWvD5l5iF7F4a22BJVzw48uq7xgZeDLeLNJ0ygQn/JcueFBqeiPPdj6/tJsmmz0OBHstGhQsTq3/QusvvXNkfLfj06OHmkZR/eU8J/+JrCd1iMBmF4A0EVZvLw03Cc4P8y2H4JN5X1Aupm/x7Wv56YQHTIDRBJQSEdl6wh9q7/1c+8e4M6mkS+iTPGmkOZ7ye6sn4kxW55ugJ7gKeZz/WFXu2NIJDIRypv157M9J7d6qDbPzJAOhvFfjr/0gZzhDtztwA1loiBXWzuIOl3VPcHrM9BbvfEbCXG6j4VIgLdmf4t+PB+ztfPodw7SLbw3nun3yzvgQlXZYc1SEdsYaSAprAk2b8tKKfXCyKQXtPRrqQPTV8oeJahtaZ7upvuB2Mfzaa3scHlbwzJwn0B5+qY8dO0yMntAqnQQscaIXCSKJAe6/IlJJQ==',# # 'Connection':'keep-alive',# 'Content-Length':'133',# 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','Cookie':'BIDUPSID=09DD4FA0E3F2EDA09CD8A7496027485E; PSTM=1582596936; __yjs_duid=1_3621442a413d3410f12c8c7b388aedbd1637245232571; BAIDUID=4896C94721A388F399BC39E6E3B83492:SL=0:NR=10:FG=1; ZFY=KhX3lhIGthdTrzqpbE5gFHBcyOVwgCIOLjrEguTwq2c:C; BAIDUID_BFESS=4896C94721A388F399BC39E6E3B83492:SL=0:NR=10:FG=1; delPer=0; PSINO=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1691842430; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_PS_PSSID=36553_39109_38831_39114_39117_39038_26350_39138_39132_39137_39100_38953; BA_HECTOR=21248kal2ha5al0h0ka4a00j1idev6u1p; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BCLID=11252539228924923738; BCLID_BFESS=11252539228924923738; BDSFRCVID=CU_OJexroG0ZmSbfcpVCuxvcd_weG7bTDYrEOwXPsp3LGJLVFakFEG0Pts1-dEu-S2OOogKKBeOTHguF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; BDSFRCVID_BFESS=CU_OJexroG0ZmSbfcpVCuxvcd_weG7bTDYrEOwXPsp3LGJLVFakFEG0Pts1-dEu-S2OOogKKBeOTHguF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tRAOoC_-tDvtHJrwMDTD-tFO5eT22-usymbC2hcHMPoosIJLhqbDb4tQ3MRthn525NOf0l05KfbUotoHDt4aD4LzbUuq2Mop3D6WKq5TtUJMqIDzbMohqqJXXPnyKMni0DT9-pnjblQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDj-WDjjXDGRabK6aKC5bL6rJabC3HlOcXU6q2bDeQN3z2lJa5D7j-IjaMPQjeM76bftb-l0vWq54WbbvLT7johRTWqR4sRjcQxonDh83KNLLKUQtHGAH2h7O5hvvER5O3M7J5fKmDloOW-TB5bbPLUQF5l8-sq0x0bOte-bQXH_EJ6tOtRuHoDvt-5rDHJTg5DTjhPrMLnodWMT-MTryKKJuaxODeROx3xbh2bKSbbnfKx-fKHnRh4oNB-3iV-OxDUvnyxAZQxQW0fQxtNRJQKDE5p5hKf84XUnobUPULxo9LUvMbmcdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-DLmjT0h3e; H_BDCLCKID_SF_BFESS=tRAOoC_-tDvtHJrwMDTD-tFO5eT22-usymbC2hcHMPoosIJLhqbDb4tQ3MRthn525NOf0l05KfbUotoHDt4aD4LzbUuq2Mop3D6WKq5TtUJMqIDzbMohqqJXXPnyKMni0DT9-pnjblQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDj-WDjjXDGRabK6aKC5bL6rJabC3HlOcXU6q2bDeQN3z2lJa5D7j-IjaMPQjeM76bftb-l0vWq54WbbvLT7johRTWqR4sRjcQxonDh83KNLLKUQtHGAH2h7O5hvvER5O3M7J5fKmDloOW-TB5bbPLUQF5l8-sq0x0bOte-bQXH_EJ6tOtRuHoDvt-5rDHJTg5DTjhPrMLnodWMT-MTryKKJuaxODeROx3xbh2bKSbbnfKx-fKHnRh4oNB-3iV-OxDUvnyxAZQxQW0fQxtNRJQKDE5p5hKf84XUnobUPULxo9LUvMbmcdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-DLmjT0h3e; ab_sr=1.0.1_NjlhMmEwMTA3OTM1YjQwYzExZjU5YzljOTZiMjA4ZTFmZjU3NWIxMzEwZjVjYmIyNmM2NGVmZTU2OTkzMjdjNzBlZGIyNjE2MDk1ZDg2ZGVkZTg5ZTdhNTQyNzg4MjAwYjVlZmVhYWJkMmZmZTI2ODVjOTBmYjk5NWI4MGEzYWU2MzNmZTc3NWZlZDllMTE4MTNiMTM4N2NiYjUxZjA2YQ==; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1691843902',# 'Host':'fanyi.baidu',# 'Origin':'',# 'Referer':'/?fr=pcPinzhuan',# 'Sec-Ch-Ua':'"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',# 'Sec-Ch-Ua-Mobile':'?0',# 'Sec-Ch-Ua-Platform':'"Windows"',# 'Sec-Fetch-Dest':'empty',# 'Sec-Fetch-Mode':'cors',# 'Sec-Fetch-Site':'same-origin',# 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',# 'X-Requested-With':'XMLHttpRequest',
}
data = {'from': 'en','to': 'zh','query': 'love','simple_means_flag': '3','sign': '198772.518981','token': '4ac92e2e6cb1606ca87ae2abed430ed6','domain': 'common'
}# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')request = urllib.request.Request(url=url,data=data,headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)# 获取响应的数据
content = response.read().decode('utf-8')print(content)obj = json.loads(content)print(obj)
9.ajax的get请求
案例:豆瓣电影 下载第一页数据
# get请求
# 获取豆瓣电影的第一页的数据 并保存
import json
import urllib.parse
import urllib.requesturl = '=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/115.0.0.0 Safari/537.36'
}request = urllib.request.Request(url=url,headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)# 获取响应的数据
content = response.read().decode('utf-8')print(content)obj = json.loads(content)print(obj)# (3)数据下载到本地
# open方法默认情况下使用的是gbk的编码 如果我们要想保存汉字 那么需要在open方法中指定编码格式为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)
下载前十页
import json
import urllib.parse
import urllib.request# =5&interval_id=100%3A90&action=&
# start=0&limit=20# =5&interval_id=100%3A90&action=&
# start=20&limit=20# =5&interval_id=100%3A90&action=&
# start=40&limit=20# =5&interval_id=100%3A90&action=&
# start=60&limit=20# page 1 2 3 4
# start 0 20 40 60# start (page - 1)*20#
# # (3)数据下载到本地
# # open方法默认情况下使用的是gbk的编码 如果我们要想保存汉字 那么需要在open方法中指定编码格式为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)# 下载豆瓣电影前10页的数据
# 请求对象的定制
# 获取响应的数据
# 下载数据def create_request(page):base_url = '=5&interval_id=100%3A90&action=&'data ={'start':(page - 1)*20,'limit':'20'}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}data = urllib.parse.urlencode(data)url = base_url + datarequest = urllib.request.Request(url=url,headers=headers)return requestdef get_content(request):# 模拟浏览器向服务器发送请求response = urllib.request.urlopen(request)# 获取响应的数据content = response.read().decode('utf-8')return contentdef down_load(page,content):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)
10.ajax的post请求
案例: KFC 官网
# 第1页
# .ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10# 第2页
# .ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10
import urllib.parse
import urllib.requestdef create_request(page):base_url = '.ashx?op=cname'data ={'cname': '北京','pid':'','pageIndex': page,'pageSize': '10'}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}data = urllib.parse.urlencode(data).encode('utf-8')request = urllib.request.Request(url=base_url,data=data,headers=headers)return requestdef get_content(request):# 模拟浏览器向服务器发送请求response = urllib.request.urlopen(request)# 获取响应的数据content = response.read().decode('utf-8')return contentdef 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)
11.URLError\HTTPError
简介 : 1. HTTPError 类是 URLError 类的子类 2. 导入的包 urllib . error . HTTPError urllib . error . URLError 3. http 错误: http 错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出 了问题。 4. 通过 urllib 发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过 try ‐ except 进行捕获异常,异常有两类, URLError \ HTTPErrorimport urllib.parse
import urllib.request
import urllib.error# url = ''url = ''
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}try:request = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发送请求response = urllib.request.urlopen(request)# 获取响应的数据content = response.read().decode('utf-8')print(content)
except urllib.error.HTTPError:print('系统正在升级。。。。。')
except urllib.error.URLError:print('系统正在升级。。。。。')
12.cookie登录
使用案例: 1. weibo 登陆
# 适用场景:数据采集的时候 需要绕过登入 然后进入到某个页面# 个人信息页面是utf-8 但是还报错了编码错误 因为并没有进入到个人信息页面 而是跳转到了登入页面
# 登录页面不是utf-8 所以报错
import urllib.request# cookie中携带着你的登陆信息 如果有登陆之后的cookie 那么我们就可以携带着cookie进入到任何页面
# 判断当前路径是不是由上一个路径进来的 一般情况下 是做乳片防盗链
url = ''
headers = {
'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.7',
# 'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Cookie':'_T_WM=9d216812117f5cef39066945a6f86e2a; SUB=_2A25J3AGrDeRhGeNK61sW8SzEwziIHXVrPq_jrDV6PUJbkdCOLWbbkW1NSVuZVZ95YdXAlxz_qsvf_szimShsSWrv; SCF=AkWQViGd4YustZ_LTsds5UZtSVSi_79jMNBnwAoBwYml49XGcbAwVNkrSgQ6SP4gbGnKK5bWk5t0Sb6ekYfxTRc.; SSOLoginState=1691906556',
'Referer':'/',
'Sec-Ch-Ua':'"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
'Sec-Ch-Ua-Mobile':'?0',
'Sec-Ch-Ua-Platform':'"Windows"',
'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/115.0.0.0 Safari/537.36',
}request = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)# 获取响应的数据
content = response.read().decode('utf-8')# print(content)# 将数据保存到本地
with open('weibo.html','w',encoding='utf-8') as fp:fp.write(content)
作业: qq 空间的爬取 import urllib.requesturl = '=0.6522282091178537'headers ={
'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.7',
# 'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Cookie':'RK=0aBsUsXne9; ptcz=6fd8a5c5063fad650869d06496d8712911e92aea8ba34a47037caa4662fe419f; pgv_pvid=9668329388; pgv_pvi=9171383296; QZ_FE_WEBP_SUPPORT=1; tvfe_boss_uuid=e60870ff8272c1ee; o_cookie=318873468; cpu_performance_v8=0; zzpaneluin=; zzpanelkey=; _qpsvr_localtk=0.9894772754823591; pgv_info=ssid=s4024295438; ptui_loginuin=318873468; uin=o0318873468; skey=@jXzn5MEg7; p_uin=o0318873468; pt4_token=RcMeTm7mOsBDz0LIM3VeOjQtygS2jrIDHI1eAkJpfoA_; p_skey=ENSazHQqB-Z7-rZVRnlL*Ny9GSUp*RTQPr0mSh2T2uM_; Loading=Yes; welcomeflash=318873468_1; qz_screen=1536x864',
# 'If-Modified-Since:Sun, 13 Aug 2023 07:31':'21 GMT',
'Referer':'/',
'Sec-Ch-Ua':'"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
'Sec-Ch-Ua-Mobile':'?0',
'Sec-Ch-Ua-Platform':'"Windows"',
'Sec-Fetch-Dest':'document',
'Sec-Fetch-Mode':'navigate',
'Sec-Fetch-Site':'same-site',
'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/115.0.0.0 Safari/537.36',
}request = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)# 获取响应的数据
content = response.read().decode('utf-8')# print(content)# 将数据保存到本地
with open('qq.html','w',encoding='utf-8') as fp:fp.write(content)
13.Handler处理器
为什么要学习 handler ? urllib . request . urlopen ( url ) 不能定制请求头 urllib . request . Request ( url , headers , data ) 可以定制请求头 Handler 定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理 不能使用请求对象的定制)
# 需求 使用handler来访问百度 获取网页源码import urllib.requesturl = ''headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}request = urllib.request.Request(url = url ,headers= headers)# handler build_opener open# (1) 获取hanlder对象
hanlder = urllib.request.HTTPHandler()# (2) 获取opener对象
opener = urllib.request.build_opener(hanlder)# (3)调用open方法
response = opener.open(request)content = response.read().decode('utf-8')print(content)
14.代理服务器
1. 代理的常用功能 ? 1. 突破自身 IP 访问限制,访问国外站点。 2. 访问一些单位或团体内部资源 扩展:某大学FTP ( 前提是该代理地址在该资源的允许访问范围之内 ) ,使用教育网内地址段免费代理服务 器,就可以用于对教育网开放的各类FTP 下载上传,以及各类资料查询共享等服务。 3. 提高访问速度 扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲 区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。 4. 隐藏真实 IP 扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击。 2. 代码配置代理 创建Reuqest对象 创建ProxyHandler对象 用handler对象创建 opener 对象 使用opener . open 函数发送请求 扩展: 1. 代理池import urllib.requestimport randomproxies_pool = [{'http':'222.74.73.202:42055'},{'http':'183.236.123.242:8060'}
]proxies = random.choice(proxies_pool)url = '/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82'}# 请求对象的定制
request = urllib.request.Request(url= url,headers= headers)haanlder = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(haanlder)
response = opener.open(request)# 获取响应的信息
content = response.read().decode('utf-8')with open('daili.html','w',encoding='utf-8')as fp:fp.write(content)
2. 快代理
本文标签: 一Urllib详解
版权声明:本文标题:一、Urllib详解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1700323734a396900.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论