网站欢迎页面怎么做,网站建设效益,理财公司网站模板下载,昆明网站制作代理目录 1.使用urllib来获取百度首页的源码
2.下载网页图片视频 3.总结-1
4.请求对象的定制#xff08;解决第一种反爬#xff09; 5.编解码
#xff08;1#xff09;get请求方式#xff1a;urllib.parse.quote#xff08;#xff09;
#xff08;2#xff09;get请求…目录 1.使用urllib来获取百度首页的源码
2.下载网页图片视频 3.总结-1
4.请求对象的定制解决第一种反爬 5.编解码
1get请求方式urllib.parse.quote
2get请求方式urllib.parse.urlencode
3post请求方式
6.ajax的get请求
1获取豆瓣电影的第一页的数据
2下载豆瓣电影前10页的数据
7.ajax的post请求
8.异常 URLError\HTTPError
9.cookie登录cookie反爬
10.Handler处理器
11.代理服务器 1.使用urllib来获取百度首页的源码 代码
#使用urllib来获取百度首页的源码
import urllib.request#(1)定义一个url就是你要访问的地址
url http: // www. baidu.com#(2)模拟浏览器向服务器发送请求response响应
response urllib.request.urlopen(url)#(3)获取响应中的页面的源码content内容的意思
# read方法返回的是字节形式的二进制数据
#我们要将二进制的数据转换为字符串
#二进制--》字符串解码decode(编码的格式)
content response.read().decode(utf-8)#(4)打印数据
print(content)运行结果 2.下载网页图片视频
urllib.request.urlretrieve(url, filenameNone, reporthookNone, dataNone) 函数说明 将URL表示的网络对象复制到本地文件。如果URL指向本地文件则对象将不会被复制除非提供文件名。返回一个元组()(filenameheader)其中filename是可以找到对象的本地文件名header是urlopen()返回的对象的info()方法(用于远程对象)。 第二个参数(如果存在)指定要复制到的文件位置(如果没有该位置将是一个生成名称的tempfile)。第三个参数如果存在则是一个回调函数它将在建立网络连接时调用一次并且在此后每个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数以字节为单位的块大小以及文件的总大小。第三个参数可能是-1在旧的FTP服务器上它不返回文件大小以响应检索请求。 参数说明 url外部或者本地url filename指定了保存到本地的路径如果未指定该参数urllib会生成一个临时文件来保存数据 reporthook是一个回调函数当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。 data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers)filename表示保存到本地的路径header表示服务器的响应头。 import urllib.request# 下载网页
url_page http://www.baidu.com# url代表的是下载的路径 filename文件的名字
# 在python中 可以变量的名字 也可以直接写值
urllib.request.urlretrieve(url_page,baidu.html)# 下载图片
url_img https://img1.baidu.com/it/u3004965690,4089234593fm26fmtautogp0.jpgurllib.request.urlretrieve(url url_img,filenamelisa.jpg)# 下载视频
url_video https://vd3.bdstatic.com/mda-mhkku4ndaka5etk3/1080p/cae_h264/1629557146541497769/mda-mhkku4ndaka5etk3.mp4?v_from_shkapp-haokan-tuchengauth_key1629687514-0-0-7ed57ed7d1168bb1f06d18a4ea214300bcevod_channelsearchbox_feedpd1pt3abtesturllib.request.urlretrieve(url_video,hxekyyds.mp4) 3.总结-1 urllib.request.urlopen() 模拟浏览器向服务器发送请求response 服务器返回的数据response的数据类型是HttpResponse字节‐‐字符串 解码 decode字符串‐‐字节 编码 encoderead() 字节形式读取二进制 扩展read(5)返回前五个字节readline() 读取一行readlines() 一行一行读取 直至结束getcode() 获取状态码是200的话表示状态正常还可能为404等等geturl() 获取访问的url地址getheaders() 获取headers状态信息响应头urllib.request.urlretrieve() 请求网页 请求图片 请求视频运行框中通过 Ctrlf 来进行搜索内容 4.请求对象的定制解决第一种反爬
UA介绍User Agent中文名为用户代理简称 UA它是一个特殊字符串头使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等
语法request urllib.request.Request()
import urllib.requesturl https://www.baidu.com# url的组成
# https://www.baidu.com/s?wd周杰伦# http/https www.baidu.com 80/443 s wd 周杰伦 #
# 协议 主机 端口号 路径 参数 锚点
# http 80
# https 443
# mysql 3306
# oracle 1521
# redis 6379
# mongodb 27017headers {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
}# 因为urlopen方法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
# 注意因为参数顺序的问题﹐不能直接写url 和headers中间还有data所以我们需要关键字传参request urllib.request.Request(urlurl,headersheaders)response urllib.request.urlopen(request)content response.read().decode(utf8)print(content) 5.编解码 编码集的演变‐‐‐ 由于计算机是美国人发明的因此最早只有127个字符被编码到计算机里也就是大小写英文字母、数字和一些符号 这个编码表被称为ASCII编码比如大写字母A的编码是65小写字母z的编码是122。 但是要处理中文显然一个字节是不够的至少需要两个字节而且还不能和ASCII编码冲突 所以中国制定了GB2312编码用来把中文编进去。 你可以想得到的是全世界有上百种语言日本把日文编到Shift_JIS里韩国把韩文编到Euc‐kr里 各国有各国的标准就会不可避免地出现冲突结果就是在多语言混合的文本中显示出来会有乱码。 因此Unicode应运而生。Unicode把所有语言都统一到一套编码里这样就不会再有乱码问题了。 Unicode标准也在不断发展但最常用的是用两个字节表示一个字符如果要用到非常偏僻的字符就需要4个字节。 现代操作系统和大多数编程语言都直接支持Unicode。 1get请求方式urllib.parse.quote
quote函数,用于将字符串进行编码以便于复制到浏览器或向服务器发送请求。
# https://www.baidu.com/s?wd%E5%91%A8%E6%9D%B0%E4%BC%A6# 需求 获取 https://www.baidu.com/s?wd周杰伦的网页源码import urllib.request
import urllib.parse# 直接在这里打上周杰伦会报错因为ASCII码无法识别中文url https://www.baidu.com/s?wd# 请求对象的定制为了解决反爬的第一种手段
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
}# 将周杰伦三个字变成unicode编码的格式
# 我们需要依赖于urllib.parse
name urllib.parse.quote(周杰伦)url url name# 请求对象的定制
request urllib.request.Request(urlurl,headersheaders)# 模拟浏览器向服务器发送请求
response urllib.request.urlopen(request)# 获取响应的内容
content response.read().decode(utf-8)# 打印数据
print(content) eg: import urllib.request import urllib.parse url https : / /www . baidu.com/s ?wd headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; win64; x64) ApplelebKit/537.36 (KHTMLlikeGecko) chrome/74.8.3729.169 Safari/537.36} url url urllib.parse.quote( 小野) request urllib.request.Request(urlurl, headersheaders) response urllib.request.urlopen( request) print(response.read( ).decode( utf-8)) 2get请求方式urllib.parse.urlencode
传入参数类型字典功能将存入的字典参数编码为URL查询字符串即转换成以key1value1key2value2的形式
# urlencode应用场景多个参数的时候# https://www.baidu.com/s?wd周杰伦sex男#获取https://www.baidu.com/s?wd%E5%91%A8%E6%9D%B0%E4%BC%A6sex%E7%94%B7的网页源码import urllib.request
import urllib.parsebase_url https://www.baidu.com/s?data {wd:周杰伦,sex:男,location:中国台湾省
}new_data urllib.parse.urlencode(data)# 请求资源路径
url base_url new_dataheaders {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(urlurl,headersheaders)# 模拟浏览器向服务器发送请求
response urllib.request.urlopen(request)# 获取网页源码的数据
content response.read().decode(utf-8)# 打印数据
print(content) eg: import urllib.request import urllib.parse url http : / /www . baidu.com/s? data { name : 小刚, sex:男 } data urllib.parse.urlencode(data) url url data print(url) headers { User-Agent : Nozilla/5.0 (Windows NT 10.0; win64; x64)ApplewebKit/537.36 (KHTMLlikeGecko) Chrome/74.0.3729.169 Safari/537.36 } request urllib.request.Request(urlurl, headersheaders) response urllib.request.urlopen( request) print(response.read( ).decode( utf-8 )) 3post请求方式
对于需要传入的data 数据需要进行urlencode编码。postdataurllib.parse.urlencode(data).encode(utf-8)
# post请求import urllib.request
import urllib.parseurl https://fanyi.baidu.com/sugheaders {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
}data {kw:spider
}# post请求的参数 必须要进行编码
data urllib.parse.urlencode(data).encode(utf-8)# post的请求的参数 是不会拼接在url的后面的 而是需要放在请求对象定制的data参数中
# post请求的参数 必须要进行编码
request urllib.request.Request(urlurl,datadata,headersheaders)# 模拟浏览器向服务器发送请求
response urllib.request.urlopen(request)# 获取响应的数据
content response.read().decode(utf-8)# 字符串--》json对象import jsonobj json.loads(content)
print(obj)# post请求方式的参数 必须编码 data urllib.parse.urlencode(data)
# 编码之后 必须调用encode方法 data urllib.parse.urlencode(data).encode(utf-8)
# 参数是放在请求对象定制的方法中 request urllib.request.Request(urlurl,datadata,headersheaders)总结post和get区别 1get请求方式的参数必须编码参数是拼接到url后面编码之后不需要调用encode方法 2post请求方式的参数必须编码参数是放在请求对象定制的方法中编码之后需要调用encode方法 import urllib.request
import urllib.parseurl https://fanyi.baidu.com/v2transapi?fromentozhheaders {# Accept: */*,# Accept-Encoding: gzip, deflate, br,# Accept-Language: zh-CN,zh;q0.9,# Connection: keep-alive,# Content-Length: 135,# Content-Type: application/x-www-form-urlencoded; charsetUTF-8,Cookie: BIDUPSIDDAA8F9F0BD801A2929D96D69CF7EBF50; PSTM1597202227; BAIDUIDDAA8F9F0BD801A29B2813502000BF8E9:SL0:NR10:FG1; __yjs_duid1_c19765bd685fa6fa12c2853fc392f8db1618999058029; REALTIME_TRANS_SWITCH1; FANYI_WORD_SWITCH1; HISTORY_SWITCH1; SOUND_SPD_SWITCH1; SOUND_PREFER_SWITCH1; BDUSSR2bEZvTjFCNHQxdUV-cTZ-MzZrSGxhbUYwSkRkUWk2SkxxS3E2M2lqaFRLUlJoRVFBQUFBJCQAAAAAAAAAAAEAAAA3e~BTveK-9sHLZGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOc7GBTnOxgaW; BDUSS_BFESSR2bEZvTjFCNHQxdUV-cTZ-MzZrSGxhbUYwSkRkUWk2SkxxS3E2M2lqaFRLUlJoRVFBQUFBJCQAAAAAAAAAAAEAAAA3e~BTveK-9sHLZGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOc7GBTnOxgaW; BDORZB490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESSDAA8F9F0BD801A29B2813502000BF8E9:SL0:NR10:FG1; BDRCVFR[feWj1Vr5u3D]I67x6TjHwwYf0; PSINO2; H_PS_PSSID34435_31660_34405_34004_34073_34092_26350_34426_34323_22158_34390; delPer1; BA_HECTOR8185a12020018421b61gi6ka20q; BCLID10943521300863382545; BDSFRCVIDboDOJexroG0YyvRHKn7hh7zlD_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHv8F_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SFtR3aQ5rtKRTffjrnhPF3-44vXP6-hnjy3bRkX4Q4Wpv_Mnndjn6SQh4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7qqU5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC8hMIt43f; BCLID_BFESS10943521300863382545; BDSFRCVID_BFESSboDOJexroG0YyvRHKn7hh7zlD_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHv8F_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESStR3aQ5rtKRTffjrnhPF3-44vXP6-hnjy3bRkX4Q4Wpv_Mnndjn6SQh4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7qqU5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC8hMIt43f; Hm_lvt_64ecd82404c51e03dc91cb9e8c0255741629701482,1629702031,1629702343,1629704515; Hm_lpvt_64ecd82404c51e03dc91cb9e8c0255741629704515; __yjs_st2_MDBkZDdkNzg4YzYyZGU2NTM5NzBjZmQ0OTZiMWRmZGUxM2QwYzkwZTc2NTZmMmIxNDJkYzk4NzU1ZDUzN2U3Yjc4ZTJmYjE1YTUzMTljYWFkMWUwYmVmZGEzNmZjN2FlY2M3NDAzOThhZTY5NzI0MjVkMmQ0NWU3MWE1YTJmNGE5NDBhYjVlOWY3MTFiMWNjYTVhYWI0YThlMDVjODBkNWU2NjMwMzY2MjFhZDNkMzVhNGMzMGZkMWY2NjU5YzkxMDk3NTEzODJiZWUyMjEyYTk5YzY4ODUyYzNjZTJjMGM5MzhhMWE5YjU3NTM3NWZiOWQxNmU3MDVkODExYzFjN183XzliY2RhYjgz; ab_sr1.0.1_ZTc2ZDFkMTU5ZTM0ZTM4MWVlNDU2MGEzYTM4MzZiY2I2MDIxNzY1Nzc1OWZjZGNiZWRhYjU5ZjYwZmNjMTE2ZjIzNmQxMTdiMzIzYTgzZjVjMTY0ZjM1YjMwZTdjMjhiNDRmN2QzMjMwNWRhZmUxYTJjZjZhNTViMGM2ODFlYjE5YTlmMWRjZDAwZGFmMDY4ZTFlNGJiZjU5YzE1MGIxN2FiYTU3NDgzZmI4MDdhMDM5NTQ0MjQxNDBiNzdhMDdl,# Host: fanyi.baidu.com,# Origin: https://fanyi.baidu.com,# Referer: https://fanyi.baidu.com/?aldtype16047,# sec-ch-ua: Chromium;v92, Not A;Brand;v99, Google Chrome;v92,# sec-ch-ua-mobile: ?0,# 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/92.0.4515.159 Safari/537.36,# X-Requested-With: XMLHttpRequest,
}data {from: en,to: zh,query: love,transtype: realtime,simple_means_flag: 3,sign: 198772.518981,token: 5483bfa652979b41f9c90d91f3de875d,domain: common,
}
# post请求的参数 必须进行编码 并且要调用encode方法
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)# loads将字符串转换为python对象
import jsonobj json.loads(content)
print(obj)# python对象转换为json字符串 ensure_asciiFalse 忽略字符集编码
s json.dumps(obj,ensure_asciiFalse)
print(s)6.ajax的get请求
1获取豆瓣电影的第一页的数据
# get请求
# 获取豆瓣电影的第一页的数据 并且保存起来import urllib.requesturl https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90actionstart0limit20headers {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(urlurl,headersheaders)# 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,encodingutf-8)
# fp.write(content)with open(douban1.json,w,encodingutf-8) as fp:fp.write(content)
2下载豆瓣电影前10页的数据 # https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90action
# start0limit20# https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90action
# start20limit20# https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90action
# start40limit20# https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90action
# start60limit20# page 1 2 3 4
# start 0 20 40 60# start page - 1*20# 下载豆瓣电影前10页的数据
# 1 请求对象的定制
# 2 获取响应的数据
# 3 下载数据import urllib.parse
import urllib.request# 每执行一次返回一个request对象
def create_request(page):base_url https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90actiondata {start:(page - 1) * 20,limit:20}# data编码data urllib.parse.urlencode(data)url base_url dataheaders {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(urlurl,headersheaders)return request# 获取网页源码
def 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,encodingutf-8)as fp:fp.write(content)# 程序的入口
if __name__ __main__:start_page int(input(请输入起始的页码))end_page int(input(请输入结束的页面))for page in range(start_page,end_page1):
# 每一页都有自己的请求对象的定制request create_request(page)
# 获取响应的数据content get_content(request)
# 下载down_load(page,content)
7.ajax的post请求
# 1页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opcname
# post
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10# 2页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opcname
# post
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10import urllib.request
import urllib.parsedef create_request(page):base_url http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opcnamedata {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(urlbase_url,headersheaders,datadata)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,encodingutf-8)as fp:fp.write(content)if __name__ __main__:start_page int(input(请输入起始页码))end_page int(input(请输入结束页码))for page in range(start_page,end_page1):# 请求对象的定制request create_request(page)# 获取网页源码content get_content(request)# 下载down_load(page,content)8.异常 URLError\HTTPError 简介: HTTPError类是URLError类的子类导入的包urllib.error.HTTPError urllib.error.URLErrorhttp错误http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出 了问题。通过urllib发送请求的时候有可能会发送失败这个时候如果想让你的代码更加的健壮可以通过try‐ except进行捕获异常异常有两类URLError\HTTPError import urllib.request
import urllib.error# url https://blog.csdn.net/sulixu/article/details/1198189491url http://www.doudan1111.comheaders {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
}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(我都说了 系统正在升级。。。)
9.cookie登录cookie反爬
使用连接访问微博的一个页面时会先跳转到登录界面如果直接爬取页面会报如下错误 适用的场景数据采集的时候 需要绕过登陆 然后进入到某个页面个人信息页面是utf-8 但是还报错了编码错误 因为并没有进入到个人信息页面 而是跳转到了登陆页面而登陆页面不是utf-8 所以报错什么情况下访问不成功# 因为请求头的信息不够 所以访问不成功 # 适用的场景数据采集的时候 需要绕过登陆 然后进入到某个页面
# 个人信息页面是utf-8 但是还报错了编码错误 因为并没有进入到个人信息页面 而是跳转到了登陆页面
# 那么登陆页面不是utf-8 所以报错# 什么情况下访问不成功
# 因为请求头的信息不够 所以访问不成功import urllib.requesturl https://weibo.cn/6451491586/infoheaders {
# :authority: weibo.cn,
# :method: GET,
# :path: /6451491586/info,
# :scheme: https,
accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.9,
# accept-encoding: gzip, deflate, br,
accept-language: zh-CN,zh;q0.9,
cache-control: max-age0,
# cookie中携带着你的登陆信息 如果有登陆之后的cookie 那么我们就可以携带着cookie进入到任何页面
cookie: _T_WM24c44910ba98d188fced94ba0da5960e; SUBP0033WrSXqPxfM725Ws9jqgMF55529P9D9WFxxfgNNUmXi4YiaYZKr_J_5NHD95QcSh-pSh.pSKncWs4DqcjiqgSXIgvVPcpD; SUB_2A25MKKG_DeRhGeBK7lMV-S_JwzqIHXVv0s_3rDV6PUJbktCOLXL2kW1NR6e0UHkCGcyvxTYyKB2OV9aloJJ7mUNz; SSOLoginState1630327279,
# referer 判断当前路径是不是由上一个路径进来的 一般情况下 是做图片防盗链
referer: https://weibo.cn/,
sec-ch-ua: Chromium;v92, Not A;Brand;v99, Google Chrome;v92,
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(urlurl,headersheaders)
# 模拟浏览器向服务器发送请求
response urllib.request.urlopen(request)
# 获取响应的数据
content response.read().decode(utf-8)# 将数据保存到本地
with open(weibo.html,w,encodingutf-8)as fp:fp.write(content)
10.Handler处理器 为什么要学习handler urllib.request.urlopen(url) 不能定制请求头urllib.request.Request(url,headers,data) 可以定制请求头Handler 定制更高级的请求头随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求动态cookie和代理 不能使用请求对象的定制 # 需求 使用handler来访问百度 获取网页源码import urllib.requesturl http://www.baidu.comheaders {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)
11.代理服务器 1代理的常用功能? ①突破自身IP访问限制访问国外站点。②访问一些单位或团体内部资源 扩展某大学FTP(前提是该代理地址在该资源的允许访问范围之内)使用教育网内地址段免费代理服务 器就可以用于对教育网开放的各类FTP下载上传以及各类资料查询共享等服务。③提高访问速度 扩展通常代理服务器都设置一个较大的硬盘缓冲区当有外界的信息通过时同时也将其保存到缓冲 区中当其他用户再访问相同的信息时 则直接由缓冲区中取出信息传给用户以提高访问速度。④隐藏真实IP 扩展上网者也可以通过这种方法隐藏自己的IP免受攻击。 2代码配置代理 创建Reuqest对象 创建ProxyHandler对象 用handler对象创建opener对象 使用opener.open函数发送请求 import urllib.requesturl http://www.baidu.com/s?wdipheaders {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,encodingutf-8)as fp:fp.write(content)
代理池
import urllib.requestproxies_pool [{http:118.24.219.151:16817},{http:118.24.219.151:16817},
]import random
#随机选取代理ipproxies random.choice(proxies_pool)url http://www.baidu.com/s?wdipheaders {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,headersheaders)handler urllib.request.ProxyHandler(proxiesproxies)opener urllib.request.build_opener(handler)response opener.open(request)content response.read().decode(utf-8)with open(daili.html,w,encodingutf-8)as fp:fp.write(content)