跪求一个好用 便宜的http www.好骚.com/http www.好骚.coms 高匿代理 急!!!

进击:用Python搭建高匿代理池a year ago
接下来是一段简易代理池框架类的代码,提供代理数据库的添加、删除、可连接性检测、匿名性检测:class ProxyPool:
#初始化爬虫池数据库
def __init__(self,ProxyPoolDB):
self.ProxyPoolDB = ProxyPoolDB
self.conn = sqlite3.connect(self.ProxyPoolDB, isolation_level=None)
self.cursor = self.conn.cursor()
self.TB_ProxyPool = "TB_ProxyPool"
self.cursor.execute("CREATE TABLE IF NOT EXISTS "+self.TB_ProxyPool+"(ip TEXT UNIQUE, port INTEGER, protocol TEXT)")
#添加代理IP进代理池的接口
def addProxy(self, IP, PORT, PROTOCOL):
self.cursor.execute("INSERT OR IGNORE INTO " + self.TB_ProxyPool+"(ip, port, protocol) VALUES (?,?,?)", [IP,PORT,PROTOCOL])
#检查代理的匿名性及可连接性
def testConnection(self, IP, PORT, PROTOCOL):
proxies = { PROTOCOL: IP+":"+PORT }
OrigionalIP = requests.get("", timeout=REQ_TIMEOUT).content
MaskedIP = requests.get("", timeout=REQ_TIMEOUT, proxies=proxies).content
if OrigionalIP != MaskedIP:
return True
return False
return False
#删除代理IP对应的数据库记录
def delRecord(self, IP):
self.cursor.execute("DELETE FROM "+self.TB_ProxyPool+" WHERE ip=?",(IP,))
#下面是对代理池进行去“失效IP”的代码:
#循环代理池,逐行测试IP地址端口协议是否可用
def cleanNonWorking(self):
for info in self.cursor.execute("SELECT * FROM "+self.TB_ProxyPool).fetchall():
IP = info[0]
PORT = str(info[1])
PROTOCOL = info[2].lower()
isAnonymous = self.testConnection(IP,PORT,PROTOCOL)
if isAnonymous == False:
#这条代理的可用性失效了,从数据库里删除
self.delRecord(IP)
#通过检测回显来检测可用性及匿名性
def testConnection(self, IP, PORT, PROTOCOL):
proxies = { PROTOCOL: IP+":"+PORT }
OrigionalIP = requests.get("", timeout=REQ_TIMEOUT).content
MaskedIP = requests.get("", timeout=REQ_TIMEOUT, proxies=proxies).content
if OrigionalIP != MaskedIP:
return True
return False
return False
这个项目是我年初时用Python练手写的,现在再来回顾,首先是逻辑不够严谨,各类功能太过耦合,不少段落需要重写并模块化,其次因为这个代理池需要在校园网内运行,所以还需要考虑到无线网络连接的稳定性,这就造成代码之间各种添添补补的混乱关系。
通过来检测代理匿名性的方法或许有效,但却忽略了X-Forwarded-For的HTTP头,所以有很大风险,必须改进。
验证代理池内代理的有效性,需要多线程或者异步,目前的方案效率太低,与其说是工具不如说是玩具。0x05 完整代码
放在此文章中的是代理池的核心代码,旨在提供各位读者能够自己实现的思路及参考。完整代码可在我的Github主页中找到(ProxyPool),Win7 64位、Ubuntu 16.04及Kali下用Python 2.7测试可运行。0x06 附
这篇文章首先是在Python中文社区的公众号上所写,在知乎修改的时候我已经开始大改Github上的代码了,不出意外的话过一段时间就能把高匿代理池改进,修复上述的部分问题,届时将会重新给该项目写篇教程,请各位拭目以待更优秀的高匿代理池。赞赏4 人赞赏234收藏分享举报文章被以下专栏收录公众号:Python中文社区推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&&,&permission&:&COLUMN_PUBLIC&,&memberId&:711380,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&公众号:Python中文社区&,&urlToken&:&zimei&,&id&:17558,&imagePath&:&v2-29d994e518953cade86704e66aef3701.jpg&,&slug&:&zimei&,&applyReason&:&0&,&name&:&Python中文社区&,&title&:&Python中文社区&,&url&:&https:\u002F\\u002Fzimei&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:34007,&avatar&:{&id&:&v2-29d994e518953cade86704e66aef3701&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002Fv2-29d994e518953cade86704e66aef3701_l.jpg&,&articlesCount&:231},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\\u002Fv2-53a3ced05a61fd8d9824d_r.jpg&,&lastUpdated&:,&imagePath&:&v2-53a3ced05a61fd8d9824d.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[872,138],&summary&:&\u003Cb\u003EGithub: \u003C\u002Fb\u003E\u003Ca href=\&http:\\u002Feastrd\&\u003Ehttp:\\u002Feastrd\u003C\u002Fa\u003E\u003Cb\u003EEmail: \u003C\u002Fb\ \u003Cb\u003E0x01 \u003C\u002Fb\u003E\u003Cb\u003E写在前面\u003C\u002Fb\u003E \n 常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T18:04:17+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:1835648,&withContent&:false,&slug&:,&bigTitleImage&:true,&title&:&进击:用Python搭建高匿代理池&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:17558,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\\u002Fv2-53a3ced05a61fd8d9824d_r.jpg&,&author&:{&bio&:&机器学习ing \u002F网络安全\u002F 玄学\u002F 星体投射&,&isFollowing&:false,&hash&:&42d2acecce0e115e894e32c&,&uid&:12,&isOrg&:false,&slug&:&dan-ni-60-5&,&isFollowed&:false,&description&:&&,&name&:&苍冥&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdan-ni-60-5&,&avatar&:{&id&:&v2-0d1261006eece34f4ef2e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:8866978,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:486124}],&title&:&进击:用Python搭建高匿代理池&,&author&:&dan-ni-60-5&,&content&:&\u003Cp\u003E\u003Cb\u003EGithub:
\u003C\u002Fb\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Feastrd\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Feastrd\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EEmail: \u003C\u002Fb\\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E0x01 \u003C\u002Fb\u003E\u003Cb\u003E写在前面\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E
\n 常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。特此写一篇如何利用Python搭建代理池的文章,以降低时间及精力成本,实现自动化获取活跃代理IP的功能。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E0x02 \u003C\u002Fb\u003E\u003Cb\u003E运作原理\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E一、 网站代理获取\u003C\u002Fp\u003E\u003Cp\u003E1.
爬免费代理网站的IP列表测试是否可用及是否是高匿\u003C\u002Fp\u003E\u003Cp\u003E2.
若都是,则放进数据库,否则丢弃。\u003C\u002Fp\u003E\u003Cp\u003E3.
重复第2步\u003C\u002Fp\u003E\u003Cp\u003E二、 保证失效的代理能被尽快从代理池中挑出\u003C\u002Fp\u003E\u003Cp\u003E1.
从爬虫数据库获取IP\u003C\u002Fp\u003E\u003Cp\u003E2.
测试IP的可用性和匿名性\u003C\u002Fp\u003E\u003Cp\u003E3.
如果可用且匿名,则保留,否则丢弃。\u003C\u002Fp\u003E\u003Cp\u003E4.
重复第1步\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E说明①\u003C\u002Fb\u003E:可建立一个爬虫程序守护程序(Daemon),有此方面需要的小伙伴可自行谷歌,在此不多做介绍。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E说明②\u003C\u002Fb\u003E:可建立一个对外代理信息接口,无论你用NodeJS或者Flask\u002FDjango或者PHP来写都没关系,我会在未来的更新中加上这个功能,在这篇文章中也不多做介绍。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E0x03 \u003C\u002Fb\u003E\u003Cb\u003E实现\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E
建议库: requests, BeautifulSoup, re, sqlite3。\u003C\u002Fp\u003E\u003Cp\u003E
其中,用requests库获取代理网站页面,用BeautifulSoup和re两库来进行代理信息获取,用sqlite3来对这些信息进行存取。\u003C\u002Fp\u003E\u003Cp\u003E
如果必要(如代理网站有反爬虫策略时),可用PhantomJS替代requests,或用相应库进行数据清理(如base64解码)。\u003C\u002Fp\u003E\u003Cp\u003E下面简单展示一下各部分的代码:\u003C\u002Fp\u003E\u003Cp\u003E
首先是选择多个能爬取代理且不容易被屏蔽IP的网站,此处以\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fproxy-list.org\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Eproxy-list.org\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E为例:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EBASE_URL\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&s2\&\u003E\&https:\u002F\u002Fproxy-list.org\u002Fenglish\u002Findex.php?p=\&\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&c1\&\u003E#IP地址及端口的正则\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003ERe_Pattern_IP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ere\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecompile\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&(.*):\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003ERe_Pattern_PORT\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ere\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecompile\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&:(.*)\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&c1\&\u003E#网站有11页,所以循环11次获取所有代理IP及端口\u003C\u002Fspan\u003E\n\u003Cspan class=\&k\&\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EstartingURL_Param\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Erange\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E11\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EHTML_ProxyPage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erequests\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EBASE_URL\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Estr\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EstartingURL_Param\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E))\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econtent\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Esoup\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ebs\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EHTML_ProxyPage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&html.parser\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&k\&\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ERaw_ProxyInfo\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Esoup\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efind_all\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&ul\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,{\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&class\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E}):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E#此网站有用Base64简单对代理进行了加密,所以这里对其解码\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eip_port\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ebase64\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eb64decode\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ERaw_ProxyInfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efind\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&li\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,{\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&class\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&proxy\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E})\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Etext\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ereplace\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&Proxy('\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ereplace\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&')\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E))\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&c1\&\u003E#接下来利用正则从网页数据中提取我们需要的信息\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ere\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efindall\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ERe_Pattern_IP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eip_port\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ere\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efindall\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ERe_Pattern_PORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eip_port\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003ETYPE\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ERaw_ProxyInfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efind\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&li\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,{\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&class\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&https\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E})\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Etext\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cp\u003E
接下来是一段简易代理池框架类的代码,提供代理数据库的添加、删除、可连接性检测、匿名性检测:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EProxyPool\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E
\u003Cspan class=\&c1\&\u003E#初始化爬虫池数据库\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EProxyPoolDB\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EProxyPoolDB\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EProxyPoolDB\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econn\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Esqlite3\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econnect\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EProxyPoolDB\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eisolation_level\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econn\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ETB_ProxyPool\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&s2\&\u003E\&TB_ProxyPool\&\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&CREATE TABLE IF NOT EXISTS \&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ETB_ProxyPool\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&(ip TEXT UNIQUE, port INTEGER, protocol TEXT)\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n\n
\u003Cspan class=\&c1\&\u003E#添加代理IP进代理池的接口\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EaddProxy\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&INSERT OR IGNORE INTO \&\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ETB_ProxyPool\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&(ip, port, protocol) VALUES (?,?,?)\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E])\u003C\u002Fspan\u003E\n\n\n
\u003Cspan class=\&c1\&\u003E#检查代理的匿名性及可连接性\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EtestConnection\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&:\&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EOrigionalIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erequests\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&http:\\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etimeout\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EREQ_TIMEOUT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econtent\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EMaskedIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erequests\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&http:\\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etimeout\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EREQ_TIMEOUT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econtent\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EOrigionalIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E!=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EMaskedIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003ETrue\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eexcept\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\n\n\n
\u003Cspan class=\&c1\&\u003E#删除代理IP对应的数据库记录\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EdelRecord\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&DELETE FROM \&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ETB_ProxyPool\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\& WHERE ip=?\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,))\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&c1\&\u003E#下面是对代理池进行去“失效IP”的代码:
\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E#循环代理池,逐行测试IP地址端口协议是否可用\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EcleanNonWorking\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecursor\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&SELECT * FROM \&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ETB_ProxyPool\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efetchall\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E():\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Estr\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E])\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Elower\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EisAnonymous\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EtestConnection\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EisAnonymous\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E==\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E#这条代理的可用性失效了,从数据库里删除\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EdelRecord\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n\n
\u003Cspan class=\&c1\&\u003E#通过检测回显来检测可用性及匿名性\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EtestConnection\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EPROTOCOL\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EIP\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&:\&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EPORT\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EOrigionalIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erequests\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&http:\\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etimeout\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EREQ_TIMEOUT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econtent\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EMaskedIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erequests\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&http:\\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etimeout\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EREQ_TIMEOUT\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eproxies\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econtent\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EOrigionalIP\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E!=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EMaskedIP\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003ETrue\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eexcept\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E0x04 \u003C\u002Fb\u003E\u003Cb\u003E反思\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E
这个项目是我年初时用Python练手写的,现在再来回顾,首先是逻辑不够严谨,各类功能太过耦合,不少段落需要重写并模块化,其次因为这个代理池需要在校园网内运行,所以还需要考虑到无线网络连接的稳定性,这就造成代码之间各种添添补补的混乱关系。\u003C\u002Fp\u003E\u003Cp\u003E
通过\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E来检测代理匿名性的方法或许有效,但却忽略了X-Forwarded-For的HTTP头,所以有很大风险,必须改进。\u003C\u002Fp\u003E\u003Cp\u003E
验证代理池内代理的有效性,需要多线程或者异步,目前的方案效率太低,与其说是工具不如说是玩具。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E0x05 \u003C\u002Fb\u003E\u003Cb\u003E完整代码\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E
放在此文章中的是代理池的核心代码,旨在提供各位读者能够自己实现的思路及参考。完整代码可在我的Github主页中找到(ProxyPool),Win7 64位、Ubuntu 16.04及Kali下用Python 2.7测试可运行。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E0x06 附\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E
这篇文章首先是在Python中文社区的公众号上所写,在知乎修改的时候我已经开始大改Github上的代码了,不出意外的话过一段时间就能把高匿代理池改进,修复上述的部分问题,届时将会重新给该项目写篇教程,请各位拭目以待更优秀的高匿代理池。\u003C\u002Fp\u003E&,&updated&:new Date(&T10:04:17.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:27,&collapsedCount&:0,&likeCount&:234,&state&:&published&,&isLiked&:false,&slug&:&&,&lastestTipjarors&:[{&isFollowed&:false,&name&:&慎独&,&headline&:&&,&avatarUrl&:&https:\u002F\\u002Fv2-8fe7ea6021db9edbe46332eace018e98_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&shen-du-53-12&,&bio&:&it&,&hash&:&ff9121855bcd&,&uid&:934600,&isOrg&:false,&description&:&&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fshen-du-53-12&,&avatar&:{&id&:&v2-8fe7ea6021db9edbe46332eace018e98&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&粒粒肥&,&headline&:&&,&avatarUrl&:&https:\u002F\\u002F84eb78467_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&li-li-fei-5&,&bio&:&懒&,&hash&:&c3b01d44fdddf9da16b31e&,&uid&:12,&isOrg&:false,&description&:&&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fli-li-fei-5&,&avatar&:{&id&:&84eb78467&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&Ori71e2&,&headline&:&总有一天我也要成为大牛,嗯哼&,&avatarUrl&:&https:\u002F\\u002Feb2fefd18_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&Dxiaomianyang&,&bio&:&电气及其自动化\u002FLinux爱好者\u002F编程爱好者&,&hash&:&ceaed081b1821dfee656&,&uid&:72,&isOrg&:false,&description&:&总有一天我也要成为大牛,嗯哼&,&profileUrl&:&https:\u002F\\u002Fpeople\u002FDxiaomianyang&,&avatar&:{&id&:&eb2fefd18&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&阿橙&,&headline&:&互联网和金融科技观察者,先后从事汽车、媒体、网络安全、共享出行、消费金融行业,个人微信:AndyWong188 &,&avatarUrl&:&https:\u002F\\u002Fv2-95c0cf14fefebd1b61fcdf_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&andywong188&,&bio&:&宇宙公民&,&hash&:&d26d8d4e83f3e&,&uid&:20,&isOrg&:false,&description&:&互联网和金融科技观察者,先后从事汽车、媒体、网络安全、共享出行、消费金融行业,个人微信:AndyWong188 &,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fandywong188&,&avatar&:{&id&:&v2-95c0cf14fefebd1b61fcdf&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&isTitleImageFullScreen&:true,&rating&:&none&,&titleImage&:&https:\u002F\\u002Fv2-53a3ced05a61fd8d9824d_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Python&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫 (计算机网络)&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&代理&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Proxy&}],&adminClosedComment&:false,&titleImageSize&:{&width&:1920,&height&:1080},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&zimei&,&name&:&Python中文社区&},&tipjarState&:&activated&,&tipjarTagLine&:&真诚赞赏,手留余香&,&sourceUrl&:&&,&pageCommentsCount&:27,&tipjarorCount&:4,&annotationAction&:[],&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T18:04:17+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&it在学,新手&,&isFollowing&:false,&hash&:&8ac841cff9f7995e0bcd4c50&,&uid&:720100,&isOrg&:false,&slug&:&jamie-47-15&,&isFollowed&:false,&description&:&正在学上海话的上海人,有一个正在学上海话的男朋友。\nnetworking infrastructure&,&name&:&Jamie&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjamie-47-15&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&从不读书&,&isFollowing&:false,&hash&:&baaac3cf09fbdf7dc2d3a146&,&uid&:358400,&isOrg&:false,&slug&:&jiakelong&,&isFollowed&:false,&description&:&不是机器人,不是精英,不是高学历,不是富二代。\n\n&,&name&:&嘉客隆&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjiakelong&,&avatar&:{&id&:&390f6cb816ef256b394577ecce3da63a&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&09f49bf847c21bac5c668&,&uid&:36,&isOrg&:false,&slug&:&abcdegf&,&isFollowed&:false,&description&:&&,&name&:&多重积分&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fabcdegf&,&avatar&:{&id&:&5c5696bdca4be3140956&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&修BUG的BUGER&,&isFollowing&:false,&hash&:&b606d2c49dd31c9ae5c3b389b1445f92&,&uid&:52,&isOrg&:false,&slug&:&si-pang-xie&,&isFollowed&:false,&description&:&努力提高姿势水平…&,&name&:&死螃蟹&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fsi-pang-xie&,&avatar&:{&id&:&fcf8287cd&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&人工智能教父&,&isFollowing&:false,&hash&:&88d09acae0f6d&,&uid&:509000,&isOrg&:false,&slug&:&elliot-more&,&isFollowed&:false,&description&:&&,&name&:&Elliot More&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Felliot-more&,&avatar&:{&id&:&v2-bc0e1c4fb8d&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&\u003Cb\u003EGithub: \u003C\u002Fb\u003E\u003Ca href=\&http:\\u002Feastrd\&\u003Ehttp:\\u002Feastrd\u003C\u002Fa\u003E\u003Cb\u003EEmail: \u003C\u002Fb\ \u003Cb\u003E0x01 \u003C\u002Fb\u003E\u003Cb\u003E写在前面\u003C\u002Fb\u003E \n 常听到很多人抱怨自己的IP因爬虫次数太多而被网站屏蔽,不得不频繁使用各种代理IP,却又因为网上的公开代理大部分都是不能使用,而又要花钱花精力去申请VIP代理,几番波折又遭屏蔽。…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002Fv2-fb029b0576d_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫 (计算机网络)&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&网页爬虫&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&我爱那未知的远方 我爱那落日的忧伤 我爱岁月老去的脸庞 我爱裙摆飞扬的姑娘&,&isFollowing&:false,&hash&:&d14c220cbf75cf1fd0f29c1bf60fbb9e&,&uid&:12,&isOrg&:false,&slug&:&liu-xing-ming-93-22&,&isFollowed&:false,&description&:&http:\u002F\u002Fblog.csdn.net\u002Fbone_ace&,&name&:&九茶&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fliu-xing-ming-93-22&,&avatar&:{&id&:&v2-238ba1b42c5a4a39c9c8ce1f33b65605&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&content&:&\u003Ch2\u003E\u003Cb\u003E前言:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E上篇文章:\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E《新浪微博爬虫分享(一天可抓取 1300 万条数据)》\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E《新浪微博分布式爬虫分享》\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003EGithub地址:\u003Ca href=\&https:\u002F\\u002F?target=https%3A\\u002FLiuXingMing\u002FSinaSpider\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003ESinaSpider\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003EQ群讨论:\u003Cbr\u003E\u003Cbr\u003E 更新完\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E《QQ空间爬虫分享(日更新)》\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,现在将新浪微博爬虫的代码也更新一下吧。\u003Cbr\u003E\u003Cb\u003E这次主要对爬虫的种子队列和去重策略作了优化,并更新了Cookie池的维护,只需拷贝代码即可实现爬虫分布式扩展,适合大规模抓取。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E使用说明:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Col\u003E\u003Cli\u003E需要安装的软件:Python2、Redis、MongoDB; 需要安装的Python模块:scrapy、requests、lxml。\u003C\u002Fli\u003E\u003Cli\u003E进入cookies.py,填入你的微博账号(已有两个账号示例)。\u003C\u002Fli\u003E\u003Cli\u003E进入settings.py,如果你填入的账号足够多,可以将`DOWNLOAD_DELAY = 10` 和 `CONCURRENT_REQUESTS = 1`注释掉。另外可以修改存放种子和去重队列的机器,可以存放在两台不同的机器上面。\u003C\u002Fli\u003E\u003Cli\u003E运行launch.py启动爬虫,也可在命令行执行`scrapy crawl SinaSpider`(Linux只能采用后者)。\u003C\u002Fli\u003E\u003Cli\u003E分布式扩展:将代码拷贝到一台新机器上,运行即可。注意各子爬虫要共用一个去重队列,即将settings.py里面的`FILTER_HOST`设成同一台机的IP。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cbr\u003E\u003Cb\u003E代码说明:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Col\u003E\u003Cli\u003E爬虫基于scrapy+redis架构进行开发、优化。 \u003C\u002Fli\u003E\u003Cli\u003E爬虫支持断点续爬。\u003C\u002Fli\u003E\u003Cli\u003E非常简易地,便可实现分布式扩展。\u003C\u002Fli\u003E\u003Cli\u003E使用Redis的“位”进行去重,1G的内存可满足80亿个用户ID的瞬间去重。\u003C\u002Fli\u003E\u003Cli\u003E 将种子优化到不足40个字符,大大降低了Redis的内存消耗,也提高了各子爬虫从Redis取种子的速度。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E注:本项目用代码提交请求进行登录,不会遇到验证码。但是有个情况:如果一次性获取几十个Cookie,新浪会检测到你的IP异常(大约多久会被检测出来?以前是一分钟左右,现在好像几十秒,我们就用这几十秒登陆完所有账号,放心 代码登录很快的),大约十个小时后会给你的IP恢复正常。IP被检测为异常会怎样?不会影响爬虫的抓取,只是你再登录账号时会被要求输入验证码,日志如:\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E[Sina_spider3.cookies] WARNING: Failed!( Reason:为了您的帐号安全,请输入验证码 )\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E如果我的账号还没登录完就出现这种情况怎么办?可以先将爬虫停了,机器换个IP继续获取Cookie,放心 已获取到Cookie的账号会自动跳过。当然如果你不喜欢受这个限制,可以用打码平台或着自己写个程序把验证码搞定。其实只是第一次启动爬虫才是需要获取那么多Cookie,之后只有等哪个Cookie失效了才会去更新。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E数据说明:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cb\u003E用户发表的微博:\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-4cc72aca07fdd3cd8d25a22c53a16cd6_b.jpg\& class=\&content_image\&\u003E\u003C\u002Ffigure\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
用户ID-微博ID\n
微博内容\n
发表时间\n
Co_oridinates :
定位坐标\n
发表工具\u002F平台\n
Transfer :
转载数\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E用户的个人信息:\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-abdbaad25a6bc5be2e74d_b.jpg\& data-rawwidth=\&1528\& data-rawheight=\&653\& class=\&origin_image zh-lightbox-thumb\& width=\&1528\& data-original=\&https:\u002F\\u002Fv2-abdbaad25a6bc5be2e74d_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
\t_id: 用户ID\n
NickName: 昵称\n
Gender: 性别\n
Province: 所在省\n
City: 所在城市\n
BriefIntroduction: 简介\n
Birthday: 生日\n
Num_Tweets: 微博数\n
Num_Follows: 关注数\n
Num_Fans: 粉丝数\n
SexOrientation: 性取向\n
Sentiment: 感情状况\n
VIPlevel: 会员等级\n
Authentication: 认证\n
URL: 首页链接\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E转载请注明出处,谢谢!(原文链接:\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Eblog.csdn.net\u002Fbone_ace\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Earticle\u002Fdetails\u002F3C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E)&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T01:08:43+08:00&,&url&:&\u002Fp\u002F&,&title&:&新浪微博爬虫分享(日更新)&,&summary&:&\u003Cb\u003E前言:\u003C\u002Fb\u003E上篇文章:\u003Ca href=\&http:\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& data-title=\&《新浪微博爬虫分享(一天可抓取 1300 万条数据)》\& class=\&\& data-editable=\&true\&\u003E《新浪微博爬虫分享(一天可抓取 1300 万条数据)》\u003C\u002Fa\u003E、\u003Ca href=\&http:\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& data-title=\&《新浪微博分布式爬虫分享》\& class=\&\& data-editable=\&true\&\u003E《新浪微博分布式爬虫分享》\u003C\u002Fa\u003E Github地址:\u003Ca href=\&https:\\u002FLiuXingMing\u002FSinaSpider\& data-editable=\&true\& data-title=\&SinaSpider\&\u003ESinaSpider\u003C\u002Fa\u003E Q群讨论: 更新完\u003Ca href=\&http:\u002F\u002Fblog.csdn.net\u002Fbone_ace\u002Farticle\u002Fdetails\u002F\& data-title=\&《QQ空间爬虫分享(日更新)》\& class=\&\& data-editable=\&true\&\u003E《QQ空间爬虫分享(日更新)》\u003C\u002Fa\u003E,现在将新浪微博爬虫的代码也更新一下吧。 \u003Cb\u003E这次主要对爬虫的…\u003C\u002Fb\u003E&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:26,&likesCount&:305},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002Fv2-8a2cc5c5b1230cbcfc0cbcc99ee429ae_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Python&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫 (计算机网络)&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫 (计算机网络)&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&&,&isFollowing&:false,&hash&:&e52c74902c8edaf89921&,&uid&:475600,&isOrg&:false,&slug&:&jerry-61-87-57&,&isFollowed&:false,&description&:&&,&name&:&Jerry&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fjerry-61-87-57&,&avatar&:{&id&:&94cc818d0e71ca01c000&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&content&:&\u003Cp\u003E爬虫代理IP池\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cblockquote\u003E\u003Cp\u003E在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来。不过呢,闲暇时间手痒,所以就想利用一些免费的资源搞一个简单的代理池服务。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cbr\u003E\u003Cp\u003E1、问题\u003C\u002Fp\u003E\u003Cp\u003E代理IP从何而来?\u003C\u002Fp\u003E\u003Cp\u003E  刚自学爬虫的时候没有代理IP就去西刺、快代理之类有免费代理的网站去爬,还是有个别代理能用。当然,如果你有更好的代理接口也可以自己接入。\u003Cbr\u003E  免费代理的采集也很简单,无非就是:访问页面页面 —& 正则\u002Fxpath提取 —& 保存\u003C\u002Fp\u003E\u003Cp\u003E如何保证代理质量?\u003C\u002Fp\u003E\u003Cp\u003E  可以肯定免费的代理IP大部分都是不能用的,不然别人为什么还提供付费的(不过事实是很多代理商的付费IP也不稳定,也有很多是不能用)。所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。\u003C\u002Fp\u003E\u003Cp\u003E采集回来的代理如何存储?\u003C\u002Fp\u003E\u003Cp\u003E  这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fssdb.io\u002Fdocs\u002Fzh_cn\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003ESSDB\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫很好中间存储工具。\u003C\u002Fp\u003E\u003Cp\u003E如何让爬虫更简单的使用这些代理?\u003C\u002Fp\u003E\u003Cp\u003E  答案肯定是做成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多好处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检测程序更加靠谱。\u003C\u002Fp\u003E\u003Cp\u003E2、代理池设计\u003C\u002Fp\u003E\u003Cp\u003E  代理池由四部分组成:\u003C\u002Fp\u003E\u003Cp\u003EProxyGetter:\u003C\u002Fp\u003E\u003Cp\u003E  代理获取接口,目前有5个免费代理源,每调用一次就会抓取这个5个网站的最新代理放入DB,可自行添加额外的代理获取接口;\u003C\u002Fp\u003E\u003Cp\u003EDB:\u003C\u002Fp\u003E\u003Cp\u003E  用于存放代理IP,现在暂时只支持SSDB。至于为什么选择SSDB,大家可以参考这篇\u003Ca href=\&https:\u002F\\u002F?target=https%3A\u002F\\u002Fnews\u002F2684\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E文章\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,个人觉得SSDB是个不错的Redis替代方案,如果你没有用过SSDB,安装起来也很简单,可以参考\u003Ca href=\&https:\u002F\\u002F?target=https%3A\\u002Fjhao104\u002Fmemory-notes\u002Fblob\u002Fmaster\u002FSSDB\u002FSSDB%25E5%25AE%%25A3%%E7%25BD%25AE%25E8%25AE%25B0%25E5%25BD%2595.md\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E这里\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E;\u003C\u002Fp\u003E\u003Cp\u003ESchedule:\u003C\u002Fp\u003E\u003Cp\u003E  计划任务用户定时去检测DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理放入DB;\u003C\u002Fp\u003E\u003Cp\u003EProxyApi:\u003C\u002Fp\u003E\u003Cp\u003E  代理池的外部接口,由于现在这么代理池功能比较简单,花两个小时看了下\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fflask.pocoo.org\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EFlask\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,愉快的决定用Flask搞定。功能是给爬虫提供get\u002Fdelete\u002Frefresh等接口,方便爬虫直接使用。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-faa8a8cab1f_b.jpg\& data-rawwidth=\&691\& data-rawheight=\&477\& class=\&origin_image zh-lightbox-thumb\& width=\&691\& data-original=\&https:\u002F\\u002Fv2-faa8a8cab1f_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E3、代码模块\u003C\u002Fp\u003E\u003Cp\u003E  Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。用Python来搞这个代理IP池也很简单,代码分为6个模块:\u003C\u002Fp\u003E\u003Cp\u003EApi:\u003Cbr\u003E  api接口相关代码,目前api是由Flask实现,代码也非常简单。客户端请求传给Flask,Flask调用ProxyManager中的实现,包括get\u002Fdelete\u002Frefresh\u002Fget_all;\u003C\u002Fp\u003E\u003Cp\u003EDB:\u003Cbr\u003E  数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩展其他类型数据库;\u003C\u002Fp\u003E\u003Cp\u003EManager:\u003Cbr\u003E  get\u002Fdelete\u002Frefresh\u002Fget_all等接口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和账号的绑定等等;\u003C\u002Fp\u003E\u003Cp\u003EProxyGetter:\u003Cbr\u003E  代理获取的相关代码,目前抓取了\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E快代理\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E代理66\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002Fwww.youdaili.net\u002FDaili\u002Fhttp\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E有代理\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\\u002Ffree2016.txt\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E西刺代理\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E、\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\\u002Ffree\u002Fgngn\u002Findex.shtml\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Eguobanjia\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E这个五个网站的免费代理,经测试这个5个网站每天更新的可用代理只有六七十个,当然也支持自己扩展代理接口;\u003C\u002Fp\u003E\u003Cp\u003ESchedule:\u003Cbr\u003E  定时任务相关代码,现在只是实现定时去刷新代码,并验证可用代理,采用多进程方式;\u003C\u002Fp\u003E\u003Cp\u003EUtil:\u003Cbr\u003E  存放一些公共的模块方法或函数,包含GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重写ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyProperty:实现类属性惰性计算。等等;\u003C\u002Fp\u003E\u003Cp\u003E其他文件:\u003Cbr\u003E  配置文件:Config.ini,数据库配置和代理获取接口配置,可以在GetFreeProxy中添加新的代理获取方法,并在Config.ini中注册即可使用;\u003C\u002Fp\u003E\u003Cp\u003E4、安装\u003C\u002Fp\u003E\u003Cp\u003E下载代码:\u003C\u002Fp\u003E\u003Cp\u003Egit clone :jhao104\u002Fproxy_pool.git
或者直接到\u003Ca href=\&https:\u002F\\u002F?target=https%3A\\u002Fjhao104\u002Fproxy_pool\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fjhao104\u002Fprox\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ey_pool\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E 下载zip文件 \u003C\u002Fp\u003E\u003Cp\u003E安装依赖:\u003C\u002Fp\u003E\u003Cp\u003Epip install -r requirements.txt \u003C\u002Fp\u003E\u003Cp\u003E启动:\u003C\u002Fp\u003E\u003Cp\u003E需要分别启动定时任务和api 到Config.ini中配置你的SSDB
到Schedule目录下: &&&python ProxyRefreshSchedule.py
到Api目录下: &&&python ProxyApi.py \u003C\u002Fp\u003E\u003Cp\u003E5、使用\u003C\u002Fp\u003E\u003Cp\u003E  定时任务启动后,会通过代理获取方法fetch所有代理放入数据库并验证。此后默认每20分钟会重复执行一次。定时任务启动大概一两分钟后,便可在SSDB中看到刷新出来的可用的代理:\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-12f9b7eb72f535a113d1_b.jpg\& data-rawwidth=\&416\& data-rawheight=\&448\& class=\&content_image\& width=\&416\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E  启动ProxyApi.py后即可在浏览器中使用接口获取代理,一下是浏览器中的截图:\u003Cbr\u003E  index页面:\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-a867aa3db1d413fea8aeeb4c693f004a_b.jpg\& data-rawwidth=\&438\& data-rawheight=\&191\& class=\&origin_image zh-lightbox-thumb\& width=\&438\& data-original=\&https:\u002F\\u002Fv2-a867aa3db1d413fea8aeeb4c693f004a_r.jpg\&\u003E\u003C\u002Ffigure\u003E
get页面:\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-f54b876bde20f2edbfe0_b.jpg\& data-rawwidth=\&333\& data-rawheight=\&128\& class=\&content_image\& width=\&333\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E  get_all页面:\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-5c79f8c07e04f9ef655b9bea406d0306_b.jpg\& data-rawwidth=\&409\& data-rawheight=\&576\& class=\&content_image\& width=\&409\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E  爬虫中使用,如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:\u003C\u002Fp\u003E\u003Cp\u003Eimport requests
def get_proxy():
return requests.get(“\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002F127.0.0.1%3AFget\u002F%2522%29.content\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ehttp:\u002F\u002F127.0.0.1:Fget\u002F\&).content\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E
def delete_proxy(proxy):
requests.get(“\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002F127.0.0.1%3AFdelete\u002F%3Fproxy%3D%257B%257D%2522.format%28proxy\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ehttp:\u002F\u002F127.0.0.1:Fdelete\u002F?proxy={}\&.format(proxy\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E))
# your spider code
def spider():
requests.get(‘\u003Ca href=\&https:\u002F\\u002F?target=https%3A\u002F\\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002Fwww.\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E‘, proxies={“http”: “\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\u002F%257B%257D%2522.format%28get_proxy%29%257D\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ehttp:\u002F\u002F{}\&.format(get_proxy)}\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E)
# …. \u003C\u002Fp\u003E\u003Cp\u003E6、最后\u003C\u002Fp\u003E\u003Cp\u003E  时间仓促,功能和代码都比较简陋,以后有时间再改进。喜欢的在github上给个star。感谢!\u003Cbr\u003Egithub项目地址:\u003Ca href=\&https:\u002F\\u002F?target=https%3A\\u002Fjhao104\u002Fproxy_pool\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ejhao104\u002Fproxy_pool\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E博客:\u003Ca href=\&https:\u002F\\u002F?target=https%3A\u002F\u002Fmy.oschina.net\u002Fjhao104\u002Fblog\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E博客 - j_hao104的个人页面\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\\u002F?target=http%3A\u002F\\u002Fr\u002FPUi_pqzEzPGzrejF9x0v\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fr\u002FPUi_pqz\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003EEzPGzrejF9x0v\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E (二维码自动识别)\u003Cbr\u003E\u003Cbr\u003E欢迎关注微信公众号:Pythoner每日一报\u003C\u002Fp\u003E\u003Cp\u003E\u003C\u002Fp\u003E\u003Cbr\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T20:59:25+08:00&,&url&:&\u002Fp\u002F&,&title&:&Python爬虫简易代理池&,&summary&:&爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来。不过呢,闲暇时间手痒,所以就想利用一些免…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:29,&likesCount&:216}},&annotationDetail&:null,&commentsCount&:27,&likesCount&:234,&FULLINFO&:true}},&User&:{&dan-ni-60-5&:{&isFollowed&:false,&name&:&苍冥&,&headline&:&&,&avatarUrl&:&https:\u002F\\u002Fv2-0d1261006eece34f4ef2e_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&dan-ni-60-5&,&bio&:&机器学习ing \u002F网络安全\u002F 玄学\u002F 星体投射&,&hash&:&42d2acecce0e115e894e32c&,&uid&:12,&isOrg&:false,&description&:&&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdan-ni-60-5&,&avatar&:{&id&:&v2-0d1261006eece34f4ef2e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&searchSectionStyle&:&loosen&,&androidPassThroughPush&:&all&,&newMore&:&new&,&nwebQAGrowth&:&experiment&,&nwebFeedAd&:&experiment&,&newSign&:&newVersion&,&androidDbFeedHashTagStyle&:&button&,&liveReviewBuyBar&:&live_review_buy_bar_}

我要回帖

更多关于 http www好好干com 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信