设为首页 收藏本站
查看: 779|回复: 0

[经验分享] [Python] 实现网络爬虫

[复制链接]

尚未签到

发表于 2017-4-29 09:42:53 | 显示全部楼层 |阅读模式
1、什么是网络爬虫
  网络爬虫是现代搜索引擎技术的一种非常核心、基础的技术,网络就好比是一张蜘蛛网,网络爬虫就像是一只蜘蛛,在网络间‘爬来爬去’,搜索有用的信息。

2、抓取代理服务器的网络爬虫
  本文介绍用python实现抓取代理服务器的网络爬虫,主要步骤是:
  1)利用urllib2获取提供代理服务的网页信息(本文以http://www.cnproxy.com/proxy1.html为例)
  2)利用正则表达式获取代理ip信息
  3)利用多线程技术验证代理ip的有效性

1)、抓取代理ip列表

def get_proxy_list():
'''
http://www.cnproxy.com/proxy1.html
http://www.cnproxy.com/proxy2.html
http://www.cnproxy.com/proxy3.html
'''
portdicts = {'z':"3",'m':"4",'a':"2",'l':"9",'f':"0",'b':"5",'i':"7",'w':"6",'x':"8",'c':"1"}
proxylist = []   
p=re.compile(r'''<tr><td>(.+?)<SCRIPT type=text/javascript>document.write\(":"\+(.+?)\)</SCRIPT></td><td>(.+?)</td><td>.+?</td><td>(.+?)</td></tr>''')
for i in range(1,4):
target = r'http://www.cnproxy.com/proxy%d.html' %i
req = urllib2.urlopen(target)
result =  req.read()
match = p.findall(result)
for row in match:
ip = row[0]
port =row[1]
port = map(lambda x:portdicts[x],port.split('+'))
port = ''.join(port)
agent = row[2]
addr = row[3].decode("cp936").encode("utf-8")
proxylist.append([ip,port,agent,addr])
return proxylist


首先利用urllib2模块获取网页信息,然后利用re模块匹配代理服务器信息,把所有抓取的代理服务器信息存入proxylist里,并返回。
2)、利用多线程验证代理服务器的有效性

class ProxyCheck(threading.Thread):
def __init__(self,proxy):
threading.Thread.__init__(self)
self.proxy = proxy
self.timeout = 5
self.test_url ="http://www.baidu.com/"
self.test_str = "030173"
def run(self):
global checkedProxyList
cookies = urllib2.HTTPCookieProcessor()
proxy_handler = urllib2.ProxyHandler({"http" : r'http://%s:%s' %(proxy[0],proxy[1])})
opener = urllib2.build_opener(cookies,proxy_handler)
opener.addheaders = [('User-agent', 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3')]
urllib2.install_opener(opener)
starttime=time.time()
try:
req = urllib2.urlopen(self.test_url,timeout=self.timeout)
result = req.read()
timeused = time.time()-starttime
pos = result.find(self.test_str)     
if pos > -1:
checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))     
print "%s:%s\t%s\t%s\t%s\n"%(proxy[0],proxy[1],proxy[2],proxy[3],timeused)
except Exception,e:
print e.message        我们通过代理连接百度网站,验证代理是否有效,一旦验证该代理有效,就打印出该代理的信息。
3)、main函数

if __name__ == '__main__':
proxylist = get_proxy_list()
checkedProxyList=[]
for proxy in proxylist:
t = ProxyCheck(proxy)
t.start()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370645-1-1.html 上篇帖子: python dict字典使用大全 下篇帖子: python 中好玩的命
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表