做网站服务商,北?? 网站建设,wordpress播放视频,做网站新科网站建设1.什么是互联网爬虫#xff1f; 如果我们把互联网比作一张大的蜘蛛网#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物#xff0c;而爬虫程序就是一只小蜘蛛#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1#xff1a;通过一个程序#xff0c;根据Url(http://www.…1.什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网那一台计算机上的数据便是蜘蛛网上的一个猎物而爬虫程序就是一只小蜘蛛沿着蜘蛛网抓取自己想要的数据 解释1通过一个程序根据Url(http://www.taobao.com)进行爬取网页获取有用信息 解释2使用程序模拟浏览器去向服务器发送请求获取响应信息 2.爬虫核心 1.爬取网页爬取整个网页 包含了网页中所有得内容 2.解析数据将网页中你得到的数据 进行解析 3.难点爬虫和反爬虫之间的博弈 3.爬虫的用途
数据分析/人工数据集社交软件冷启动舆情监控竞争对手监控
4.爬虫分类
4.1通用爬虫
实例 百度、360、google、sougou等搜索引擎‐‐‐伯乐在线功能 访问网页‐抓取数据‐数据存储‐数据处理‐提供检索服务robots协议 一个约定俗成的协议添加robots.txt文件来说明本网站哪些内容不可以被抓取起不到限制作用 自己写的爬虫无需遵守网站排名(SEO) 根据pagerank算法值进行排名参考个网站流量、点击率等指标百度竞价排名 缺点 抓取的数据大多是无用的不能根据用户的需求来精准获取数据
4.2聚焦爬虫
功能 根据需求实现爬虫程序抓取需要的数据设计思路 确定要爬取的url 如何获取Url模拟浏览器通过http协议访问url获取服务器返回的html代码 如何访问解析html字符串根据一定规则提取需要的数据 如何解析
5.反爬手段
User‐Agent User Agent中文名为用户代理简称 UA它是一个特殊字符串头使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。代理IP 西次代理 快代理 什么是高匿名、匿名和透明代理它们有什么区别 1. 使用透明代理对方服务器可以知道你使用了代理并且也知道你的真实IP。 2. 使用匿名代理对方服务器可以知道你使用了代理但不知道你的真实IP。 3. 使用高匿名代理对方服务器不知道你使用了代理更不知道你的真实IP。验证码访问 打码平台 1. 云打码平台动态加载网页 网站返回的是js数据 并不是网页的真实数据 selenium驱动真实的浏览器发送请求数据加密 分析js代码
6.urllib库使用 7.请求对象的定制
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不能传递进去
# 请求对象的定制
request urllib.request.Request(urlurl,headersheaders)response urllib.request.urlopen(request)content response.read().decode(utf8)print(content)
扩展编码的由来 ‘’‘编码集的演变‐‐‐ 由于计算机是美国人发明的因此最早只有127个字符被编码到计算机里也就是大小写英文字母、数字和一些符号这个编码表被称为ASCII编码比如大写字母A的编码是65小写字母z的编码是122。但是要处理中文显然一个字节是不够的至少需要两个字节而且还不能和ASCII编码冲突所以中国制定了GB2312编码用来把中文编进去。你可以想得到的是全世界有上百种语言日本把日文编到Shift_JIS里韩国把韩文编到Euc‐kr里各国有各国的标准就会不可避免地出现冲突结果就是在多语言混合的文本中显示出来会有乱码。因此Unicode应运而生。Unicode把所有语言都统一到一套编码里这样就不会再有乱码问题了。Unicode标准也在不断发展但最常用的是用两个字节表示一个字符如果要用到非常偏僻的字符就需要4个字节。 现代操作系统和大多数编程语言都直接支持Unicode。’‘’ 8.编解码
get请求方式urllib.parse.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.parseurl 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)
get请求方式urllib.parse.urlencode # urlencode应用场景多个参数的时候# https://www.baidu.com/s?wd周杰伦sex男# import urllib.parse
#
# data {
# wd:周杰伦,
# sex:男,
# location:中国台湾省
# }
#
# a urllib.parse.urlencode(data)
# print(a)#获取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)
post请求方式 # post请求---百度翻译import urllib.request
import urllib.parseurl https://fanyi.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
}data {kw:spider
}# post请求的参数 必须要进行编码
data urllib.parse.urlencode(data).encode(utf-8)# post的请求的参数 是不会拼接在url的后面的 而是需要放在请求对象定制的参数中
# post请求的参数 必须要进行编码
request urllib.request.Request(urlurl,datadata,headersheaders)# 模拟浏览器向服务器发送请求
response urllib.request.urlopen(request)print(response)
# # 获取响应的数据
# content response.read().decode(utf-8)
#
# # 字符串--》json对象
#
# import json
#
# obj 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区别
get请求方式的参数必须编码参数是拼接到url后面编码之后不需要调用encode方法post请求方式的参数必须编码参数是放在请求对象定制的方法中编码之后需要调用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)import jsonobj json.loads(content)
print(obj)9.ajax的get请求
案例豆瓣电影
请求豆瓣电影的第一页 # 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)请求豆瓣电影的前十页
# 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.requestdef create_request(page):base_url https://movie.douban.com/j/chart/top_list?type5interval_id100%3A90actiondata {start:(page - 1) * 20,limit:20}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 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,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)
10.ajax的post请求
案例KFC官网
# 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)
11.URLError\HTTPError
简介: 1. HTTPError类是URLError类的子类 2. 导入的包urllib.error.HTTPError urllib.error.URLError 3.http错误http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出 了问题。 4.通过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(我都说了 系统正在升级。。。)
12.cookie登录
使用案例 1.weibo登陆 作业qq空间的爬取
# 适用的场景数据采集的时候 需要绕过登陆 然后进入到某个页面
# 个人信息页面是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)13.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)14.代理服务器 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 randomproxies 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)快代理